Dwa wiersze Caption na TPanel?

0

Jak w temacie - da sie to jakoś uzyskać ?
+#13+#10+ nie działa
sLineBreak też nie działa

1

Tego nie wiem, ale może połóż po prostu 2 egzemplarze TLabel na TPanelu. Może TLabel ma możliwość, o którą Ci chodzi, nie pamiętam.

0

Napisałeś trochę mało konkretnie, więc to są trochę moje domysły/wariacje na temat tego, o co może Ci chodzić:

  • w przypadku "zwykłego" komponentu TLabel całkowicie działa zapis w postaci label1.Caption := 'linia pierwsza' + #13#10 + 'linia poniżej';.
  • jeśli tego TLabel umieścisz na TPanel - także podany zapis działa
  • raczej nie kojarzę, żeby dało się podzielić Panel1.Caption na 2 linie, zamiast tego skorzystaj z rozwiązania proponowanego przez kolegę wcześniej, czyli wyczyśc caption panelu i umieść na nim osobny komponent TLabel, który możesz sobie rozbić na 2 linie.

P.S. to co napisałem sprawdziłem u mnie na Delphi w wersji 10.2 oraz Lazarusie 2.0 na Win10

3

Daję to jako osobny wpis, żeby nikomu nie umknęło ;)

W sumie to znalazłem rozwiązanie. Wymaga wprawdzie pewnej akrobacji, ale nie jest to nic strasznego, a co istotne - to rozwiązanie działa :)

Oryginalna procedura rysująca TPanel wygląda następująco:

procedure TCustomPanel.Paint;
var
  ARect: TRect;
  TS : TTextStyle;
begin
  ARect := GetClientRect;

  PaintBevel(ARect, BevelOuter);
  InflateRect(ARect, -BorderWidth, -BorderWidth);
  PaintBevel(ARect, BevelInner);

  if Caption <> '' then
  begin
    TS := Canvas.TextStyle;
    TS.Alignment := BidiFlipAlignment(Self.Alignment, UseRightToLeftAlignment);
    if BiDiMode<>bdLeftToRight then
      TS.RightToLeft:= True;
    TS.Layout:= tlCenter;
    TS.Opaque:= false;
    TS.Clipping:= false;
    TS.SystemFont:=Canvas.Font.IsDefault;
    TS.Wordbreak := FWordWrap;
    TS.SingleLine := not FWordwrap;
    if not Enabled then
      if ThemeServices.ThemesEnabled then
        Canvas.Font.Color := clGrayText
      else
      begin
        Canvas.Font.Color := clBtnHighlight;
        OffsetRect(ARect, 1, 1);
        Canvas.TextRect(ARect, ARect.Left, ARect.Top, Caption, TS);
        Canvas.Font.Color := clBtnShadow;
        OffsetRect(ARect, -1, -1);
      end
    else
      Canvas.Font.Color := Font.Color;

    Canvas.TextRect(ARect,ARect.Left,ARect.Top, Caption, TS);
  end;

  inherited Paint;
end;                                          

Zamiana linii 23 pliku custompanel.inc na następującą postać:

TS.SingleLine := FALSE;//not FWordwrap;

powoduje efekt widoczny na poniższym screenie :)
screenshot-20190611095155.png

Przy czym musisz pamiętać/mieć na uwadze, że to jest taka prowizorka/obejście i zasadniczo nie powinno się takich rzeczy robić w kodzie LCL, bo mogą się pojawić różne nietypowe efekty, ponieważ klasy LCL są ze soba powiązane, dziedziczą wielopoziomowo po sobie i możesz w ten sposób rozwalić jakieś zależności. Chciałem jedynie pokazać, że to się da zrobić. Jeśli chcesz z tego rozwiązania skorzystać to zrób jakaś klasę potomną TPanel i w niej wprowadzaj zmiany. Możesz stworzyć nowy komponent, ale nie jest to konieczne, wszystko możesz zrobić w samym kodzie - zrobić klasę dziedziczącą z TPanel, a potem nadpisać dla niej TCustomPanel.Paint swoją treścią.

0

Problem w tym iż to panel(e) generowany na flowpanel.
Czyli musiał bym generować jeszcze labele na generowanym panelu ...
Propozycja z podmianą w bibliotece trochę hardcorowa - wydaje mi się iż przy aktualizacji środowiska lub przenoszeniu projektu można o tym zapomnieć i wszytko wróci do normy.
Ale dzięki za sugestie. To tylko kosmetyka, ale może finalnie wykorzystam pomysł z generowanymi labelami

0

generować jeszcze labele na generowanym panelu ...

Nie no.. ja to widzę inaczej.
To, co podałem - czyli grzebanie w źródłach LCL miało jedynie na celu pokazanie, że jest taka możliwość.
Ty oczywiście nie powinieneś tego tak robić, ale zamiast tego tak, jak pisałem - zrobić sobie jakąś klasę dziedziczącą po TPanel i w niej nadpisać standardową obsługę Paint. Potem po prostu umieszczasz taki panel na formatce i przypisujesz do jego captiona tekst z rozbiciem na dwie linie. Niczego więcej dodawać nie musisz.

Ewentualnie inna opcja, trochę podobna do poprzedniej, ale inna :D Tworzysz sobie potomka TPanel i dodajesz do niego TLabel. W ten sposób każdy obiekt tej klasy będzie miał swojego "wbudowanego" labela, przez co także odpada konieczność dodawania za każdym razem ręcznie napisu.

0

Teraz się przyznam - jestem zdezorientowany obiektowo :) klasa :/ dziedzicząca =O . to za trudne terminy dla mnie :)

0

Klasa TPanel jest niezdolna do natywnego renderowania tekstu wieloliniowego (przynajmniej pod Windows) – zaprogramowana jest w taki sposób, że potrafi malować tylko jedną linię, cholera wie dlaczego. :/

Możesz zrobić inaczej – usuń wartość dla Caption, a do wyświetlenia tekstu użyj TLabel. Ustaw mu Align na alClient, Alignment na taCenter i Layout na tlCenter – dzięki temu komponent zawsze będzie rozciągnięty na całą powierzchnię panelu i będziesz mógł bez problemu ustawić tekst wieloliniowy.

0

Po przemyśleniu potrzebuje dwa TLabel - bo różna wielkość czcionki.
Ale niestety nadal nie wiem jak to ugryść . Jak napisałem - jestem słabo obiektowy.
W tej chwili kod generujący "kafelek" w TPanelFlow wygląda tak :

                    with TPanel.Create(Self) do
                         begin
                              Parent:=panel;
                              Caption:=inttostr(Snr_op);

                              Height:=32;
                              Width:=100;
                              Font.Size:=14;
                              font.Bold:=True;
                              Font.Color:=clBlack;
                              Color:=clGreen;
                              if Sstan=FALSE then
                                 begin
                                 Font.Color:=clWhite;
                                 Color:=clRed;
                                 end;
                              Name:='ID_'+inttostr(Sidcu);
                              onClick:[email protected];
                              Visible:=true;
                         end;                                                        

Jak tego dokonać ?

0

Odnośnie fragmentu TPanel.Create - czy nie powinno być TLabel? Bo Ty tworzysz labela, którego chcesz wsadzić na panel, prawda?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0