Dwa wiersze Caption na TPanel?

Odpowiedz Nowy wątek
2019-06-11 07:54
0

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

edytowany 1x, ostatnio: furious programming, 2019-06-11 19:02

Pozostało 580 znaków

2019-06-11 08:33
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.

edytowany 1x, ostatnio: MarcinG, 2019-06-11 08:34

Pozostało 580 znaków

2019-06-11 09:17
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


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2019-06-11 19:07

Pozostało 580 znaków

2019-06-11 09:49
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ą.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 4x, ostatnio: cerrato, 2019-06-11 09:57

Pozostało 580 znaków

2019-06-11 11:13
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

Pozostało 580 znaków

2019-06-11 11:30
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.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-06-11 13:04
0

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

Pozostało 580 znaków

2019-06-11 19:00
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.


edytowany 1x, ostatnio: furious programming, 2019-06-11 19:00

Pozostało 580 znaków

2019-06-12 09:00
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ć ?

Pozostało 580 znaków

2019-06-12 09:30
0

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


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-06-12 09:59
0

Najpierw tworze kafelek - TPanel. I na nim musiał bym umieścić TLabel.
Teraz ten TLabel musiał bym przypisać do rodzica - stworzonego panelu(a?) . I tu nie wiem jak to ugryźć.

with TLabel.Create(Self) do
                         begin
                              Parent:=???????;
edytowany 2x, ostatnio: titako, 2019-06-12 10:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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