Dwa wiersze Caption na TPanel?

1

No to (zakładając, że znasz nazwy tych elementów TLabel) zrób to w taki sposób:

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

A samą procedurę wywołujesz w następujący sposób:

ZmienKolor(Form1.Panel1); 
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.

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.

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 :)

2

Ź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

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

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.

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