![]() |
Bei dyn. erzeugten Labels die Text Farbe ändern
Hallo,
ich habe mir eine kleine procedure geschriebn, womit ich ein Menü erzeugen lassen kann. Jetzt wollte ich das um eine Funktionalität erweitern. Wenn man auch das Label klickt, soll das entsprechende Label Rot gekennzeichnet werden und wenn man auch ein anderes Label klickt, dann sollen alle anderen auch wieder schwarz werden. Wie kann ich das machen??? Da das Menü dynamisch erzeugt wird, kann ich die Labels nicht direkt ansprechen. hat jemand eine andere idee??? Mit freundlichen Grüßen Christian18 |
Re: Bei dyn. erzeugten Labels die Text Farbe ändern
Hallo :hi:,
du kannst deine Label in einen Array verwalten und ihnen ein OnClick Ereignis zuweisen in dem du sie rot färbst. Beim Click auf ein Label machst du dann alle anderen Label im Array schwarz. ;) MfG freak |
Re: Bei dyn. erzeugten Labels die Text Farbe ändern
Hallo,
da auf meine Frage noch nicht direkt geantwortet wurde, wollte ich nochmal alles Detailiert erklären. Also: Ich habe eine Unit "UMain" und eine Unit "UProceduren". In der Unit UProceduren sind alle Proceduren drinn die ich öffters brauche als einmal. Ich habe zum Beispiel in der Unit "UProceduren" auch eine kleine Procedure drinn, die ein Menü erzeugen soll. Die erzeugung des Menüs funktioniert auch schon sehr gut. (die Procedure um das Menü zu erzeugen, hänge ich unten mit an). Jetzt wollte ich noch, das wenn man auch das Label klickt, das dann das entsprechende Label Rot wird. das wollte ich so machen. TLabel(Sender).Font.Color:=clRed; (Achso das habe ich bei dem OnClick ereignis zugewiesen. das funktioniert also auch schon) Wenn ich jetzt aber auf ein anderes Label klicke, dann wird das zwar rot, aber das andere nicht schwarz. Jetzt weiß ich das ich das andere auch erst schwarz machen muß. Da ich die Labels aber nicht direkt ansprechen kann weil sie dynamisch erstellt worden sind, habe ich ein kleines problem. ich habe hier im forum auch schon den tipp bekommen das über ein array zu machen. da finde ich aber das es nicht gerade die eleganteste lösung ist. gibt es auch noch eine andere??? Ich denke mal Ihr habt mein Problem was ich habe jetzt verstanden. Wenn nicht dann schreibt eure fragen und ich versuche dann zu antworten. Und hier jetzt der Code:
Delphi-Quellcode:
Und so mache ich den aufruf mit dem menü (navi)
procedure navi(a : Array of String; f : TForm; p : Array of Pointer);
var i : Integer; // Schleifenvariable l : TLabel; // TLabel m : TMethod; begin for i:=1 to Length(a) do begin l:=TLabel.Create(f); l.Caption:=a[i - 1]; l.Left:=15; l.Top:=100 + 25 * i; l.Cursor:=crHandPoint; l.Transparent:=True; m.Code:=p[i - 1]; m.Data:=l; l.OnClick:=TNotifyEvent(m); l.Parent:=f; end; end;
Delphi-Quellcode:
Mit freundlichen Grüßen
procedure TFMain.FormCreate(Sender: TObject);
var a : Array[0..4] of String; p : Array[0..4] of Pointer; begin a[0]:='Menu1'; a[1]:='Menu2'; a[2]:='Menu3'; a[3]:='Menu4'; a[4]:='Menu5'; p[0]:=@TFMain.Menu1; p[1]:=@TFMain.Menu2; p[2]:=@TFMain.Menu3; p[3]:=@TFMain.Menu4; p[4]:=@TFMain.Menu5; navi(a, FMain, p); end; Christian18 |
Re: Bei dyn. erzeugten Labels die Text Farbe ändern
Zitat:
Zitat:
Das war genau die Lösung deines Problems. |
Re: Bei dyn. erzeugten Labels die Text Farbe ändern
Hallo!
Die Eigenschaft ![]() ![]() Beispiel um alle Labels mit Tag=1 scharz zu färben (musst du halt anpassen):
Delphi-Quellcode:
Grüße
for i := 0 to Panel1.ControlCount - 1 do
if Panel1.Controls[i] is TLabel then if (Panel1.Controls[i] as TLabel).Tag = 1 then (Panel1.Controls[i] as TLabel).Font.Color := clBlack; Faux |
Re: Bei dyn. erzeugten Labels die Text Farbe ändern
Hallo Luckie
gibt es da keine bessere oder andere lösung??? |
Re: Bei dyn. erzeugten Labels die Text Farbe ändern
Hallo faux,
ich habe deinen lösungsvorschlag gerade mal getestet. ich finde ihn sehr gut. aber leider funktioniert er bei mir nicht. habe ich was falsch gemacht??? hier mein geänderter code:
Delphi-Quellcode:
procedure TFMain.Menu1(Sender: TObject);
var i : Integer; // Schleifenvariable begin // Menu1 for i:=0 to FMain.ControlCount - 1 do begin if FMain.Controls[i] is TLabel then begin if (FMain.Controls[i] as TLabel).Tag = 1 then begin (FMain.Controls[i] as TLabel).Font.Color:=clWindowText; end; end; end; TLabel(Sender).Font.Color:=clRed; end; |
Re: Bei dyn. erzeugten Labels die Text Farbe ändern
Also grundsätzlich wäre es richtig. Eventuell können zwei Fehler sein:
1. Ist das Parent der Labels überhaupt FMain? 2. Ist das Tag der Labels überhaupt 1? Grüße Faux |
Re: Bei dyn. erzeugten Labels die Text Farbe ändern
Hi,
wenn du nur zwischen zwei Labels hin und her wechselst (also es immer nur ein rotes gibt und das letzte rote schwarz wird), dann brauchst du nur eine globale Variable (also Klassenvariable geht bei klassen-methoden natürlich auch). Dort speicherst du dein aktuell gewähltes Label (das, dass rot ist). Wenn du nun auf ein Label klickst, machst du etwas wie
Delphi-Quellcode:
Ansonsten ist es ein schönerer Weg ein TControlList statt einem Array zu benutzen
var redLabel : TLabel; // Kein Jonny W., sondern die globale Var
... ... begin if assigned(redLabel) then begin redLabel.Font.Color := clBlack; end; if assigned(Sender) and (Sender is TLabel) then begin redLabel := Sender as TLabel; redLabel.Font.Color := clRed; end; end; Gruß Der Unwissende |
Re: Bei dyn. erzeugten Labels die Text Farbe ändern
[delphi]
Zitat:
habs so gemacht. [pre] ShowMessage(IntToStr(TLabel(Sender).Tag)); [/pre] Und dann habe ich eine ausgabe bekommen. Ausgabe war 0 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz