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-13 13:29
0

To nie działą :/
Po kliknięciu w panel wywala external SIGSEGV i wskazuje na linie 26 w cytacie.
Stosowałem to w taki sposób :

procedure Tcentral.BtnSourceClick(Sender: TObject);        
var
  nazbtn:TObject;
begin
    if (Sender is TPanel) then nazbtn:= TPanel(Sender);
    if (Sender is TLabel) then nazbtn:= TLabel(Sender).Parent;

       if  Tpanel(nazbtn).Color=clRed then
          begin
         {Tpanel(nazbtn).FindChildControl('NewCaption').Font.Color:= clWhite;
          Tpanel(nazbtn).FindChildControl('NewCaption2').Font.Color:= clBlue;}
          Tpanel(nazbtn).Color:=clGreen;
          end
       else
          begin
         {Tpanel(nazbtn).FindChildControl('NewCaption').Font.Color:= clGreen;
          Tpanel(nazbtn).FindChildControl('NewCaption2').Font.Color:= clBlack;}
          ZmienKolor(Tpanel(nazbtn));
          Tpanel(nazbtn).Color:=clRed;
          end;

end;                                          

procedure Tcentral.ZmienKolor(Sender: TObject);
begin
  (Sender as TPanel).FindChildControl('NewCaption').Font.Color:= clGreen;
  (Sender as TPanel).FindChildControl('NewCaption2').Font.Color:= clRed;
end; 

W komentarzach to też nie działa :/ a taka wersja by mi opowiadała.

Pozostało 580 znaków

2019-06-13 14:13
0

Podany przeze mnie przykład na pewno działał, bo zanim wysłałem posta, zrobiłem na szybko apkę testową i sprawdziłem - kolory obu napisów się zmieniły.
Jak możesz to podeślij w archiwum cały spakowany projekt (w sensie - cały katalog z projektem) - nie będę musiał się bawić w przepisywanie, po prostu rozpakuję i zobaczę, o co chodzi. Być może odwołujesz się do czegoś, co nie zostało jeszcze stworzone, ciężko powiedzieć nie widząc całoś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

Pozostało 580 znaków

2019-06-13 14:25
0

Dosłownie chwile temu znalazłem pewne rozwiązanie - może nie do końca eleganckie.
Ponieważ znam nazwę Parenta na którą się składa cyfrowy identyfikator, użyłem takowego do nazwania TLabeli z dopiskiem co by sie nie dublował i w wywołaniu :
Tpanel(nazbtn).FindChildControl('NewCaption2').Font.Color zamiast nazwy klasy "NewCaption2" (mam nadzieje że dobrze to nazwałem klasą ) wywołuje nazwę obiektu. i wtedy wszystko gra :)

Pozostało 580 znaków

2019-06-13 17:48
1

Źle ten kod piszecie – metodę zmieniającą kolor fontu etykiet uzależniacie od nazw komponentów, a po drugie, ciągle dublujecie rzutowanie zamiast skorzystać z instrukcji wiążącej lub z absolute dla pomocniczych zmiennych lokalnych. Wasze kody są niebezpieczne (mogą rzucić wyjątek) i nieuniwersalne, a to bardzo źle.

Tymczasem bardzo łatwo jest napisać metodę, która znajdzie wszystkie etykiety wewnątrz danego panelu i każdemu zmieni kolor na zadany – bezpieczną i uniwersalną. Macie przykład:

procedure TMainForm.SetPanelLabelsColor(APanel: TPanel; AFontColor: TColor);
var
  InnerControl: TControl;
  InnerLabel: TCustomLabel absolute InnerControl;
var
  ControlIdx: Integer;
begin
  for ControlIdx := 0 to APanel.ControlCount - 1 do
  begin
    InnerControl := APanel.Controls[ControlIdx];

    if InnerControl.InheritsFrom(TCustomLabel) then
      InnerLabel.Font.Color := AFontColor;
  end;
end;

Bułka z masłem. :P


edytowany 1x, ostatnio: furious programming, 2019-06-13 17:49

Pozostało 580 znaków

2019-06-13 20:21
0

Ok, masz rację, ale:
1) mi chodziło o podanie zasady, jak do tematu podejść, a nie stworzenie porządnego rozwiązania
2) zaznaczyłem wcześniej w poście, że mogą z tego wyniknąć komplikacje i trzeba uważać
3) Twój kod nie do końca spełnia podane wcześnie założenia. Konkretnie chodzi mi o zmienianie kolorów etykietek niezależnie. Z tego co widzę, Twój przykład przelatuje przez wszystkich potomków panelu i jeśli dany komponent jest labelem to zmienia kolor. Nie do końca o to chodziło, więc i tak trzeba wprowadzić jakieś rozróżnienie - czy to w oparciu o nazwę, tag, rozmiar czcionki czy cokolwiek innego
4) żeby nie było, że tylko się czepiam - zgadza się, jakbym pisał to "na czysto" to bym sobie raz to rzutował i potem korzystał ze zmiennej pomocniczej. Ale to tylko pokazanie mechanizmu, więc patrz pkt. 1 :D


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-13 21:37
0

Wszystko zależy od tego, co konkretnie ma się na panelu znajdować. Jeśli nic prócz tych dwóch etykiet lub komponenty inne niż etykiety to mój przykład jest dobry. Jest dobry też dlatego, że nie bazuje na nazwach komponentów, więc potrafi modyfikować kontrolki o różnych nazwach lub w ogóle bez ustalonej właściwości Name.

Najlepszym sposobem na wykonanie tego co potrzebuje OP jest napisanie dedykowanego komponentu, który by dziedziczył z TCustomPanel i miał nadpisaną metodę Paint, w której malowałby tło panelu w taki sam sposób jak to robi metoda nadpisana, tyle że tekst malowałoby się inaczej. To raptem 100 linijek kodu.


edytowany 2x, ostatnio: furious programming, 2019-06-13 21:38
Powtórzę - nie do końca robi to, co ma, ponieważ nie widzę tutaj możliwości kolorowania różnych labeli na różny kolor. W obecnej postaci wszystko, co jest labelem i leży na panelu zostanie odpowiednio pomalowane. - cerrato 2019-06-13 22:40
Jeśli kolory etykiet mają być różne to masz rację – mój przykład się nie nadaje. Również jeśli na panelu może być więcej etykiet. Dlatego o wiele lepszym rozwiązaniem jest napisanie komponentu, który by ten tekst malował, zamiast używać etykiet. - furious programming 2019-06-13 22:44
Tutaj się zgodzę, ale po pierwsze - z tego co OP mówił, to jest potrzebne do jednorazowego napisania programu do konkretnego zastosowania, więc robienie dedykowanego komponentu to lekki przerost formy, a po drugie, biorąc pod uwagę poziom zaawansowania pytającego, obawiam się, że za wiele czasu by mu zajęło rozgryzanie tematu tworzenia komponentu. Zresztą sam na początku napisał o sobie jestem zdezorientowany obiektowo [...] to za trudne terminy dla mnie ;) Niemniej, co do zasady to przyznaję Ci rację. - cerrato 2019-06-13 22:56
:D Tak jest ! Proszę mnie tu metodycznie nie rzutować :) - titako 2019-06-14 07:05
Róbcie jak chcecie. - furious programming 2019-06-14 13:59

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