![]() |
Re: Dynmaische Label finden
Ähm ja...
Delphi-Quellcode:
procedure TForm1.Button30Click(Sender: TObject);
var i,j:integer; begin Label4.Visible:=False; Wort:=sl.Strings[random(sl.Count)]; Label4.Caption:=Wort; j:=176; SetLength(Buchstaben, Label4.GetTextLen); for i:=1 to Label4.GetTextLen do begin Buchstabe:=TLabel.Create(nil); Buchstabe.Parent:=Form1; Buchstabe.Caption:=Copy(wort,i,1); Buchstabe.Name:='Dyn'+IntToStr(i); [b]ShowMessage(Buchstabe.Name);[/b] Buchstabe.Left:=j+20; Buchstabe.Top:=176; j:=Buchstabe.Left; end; end;
Delphi-Quellcode:
procedure TForm1.Button31Click(Sender: TObject);
var i:integer; begin for i := 0 to form1.ComponentCount - 1 do begin if form1.Components[i].ClassType = TLabel then begin if Form1.Components[i].Name = 'Dyn1' then ShowMessage('JA'); end; end; end; |
Re: Dynmaische Label finden
Das:
Delphi-Quellcode:
sollte so aussehen:
procedure TForm1.Button31Click(Sender: TObject);
var i:integer; begin for i := 0 to form1.ComponentCount - 1 do begin if form1.Components[i].ClassType = TLabel then begin if Form1.Components[i].Name = 'Dyn1' then ShowMessage('JA'); end; end; end;
Delphi-Quellcode:
oder gar so:
procedure TForm1.Button31Click(Sender: TObject);
var i:integer; begin for i := 0 to self.ComponentCount - 1 do begin if self.Components[i].ClassType = TLabel then begin if self.Components[i].Name = 'Dyn1' then ShowMessage('JA'); end; end; end;
Delphi-Quellcode:
procedure TForm1.Button31Click(Sender: TObject);
var i:integer; begin for i := 0 to ComponentCount - 1 do begin if Components[i].ClassType = TLabel then begin if Components[i].Name = 'Dyn1' then ShowMessage('JA'); end; end; end; |
Re: Dynmaische Label finden
Auch mit deinen beiden Codes findet er nix...
Was mach ich denn falsch?? |
Re: Dynmaische Label finden
Zitat:
Zitat:
|
Re: Dynmaische Label finden
wundert euch nicht, wenn ich momentan nix schreibe. Ich blicke garnicht mehr durch....
Habe oben den Code gepostet, wie ich ein Wort auf mehrere Dynamische Labels (Variable Buchstabe:TLabel) aufteile. Nur wie greife ich zu... keine Ahnung :roll: |
Re: Dynmaische Label finden
Zitat:
Das wird über den Owner gelöst. Deshalb musst du das Formular, Panel, ... welches deine Labels besitzen soll auch im Constructor angeben. Und wenn dich die zehntausend Stringvergleiche stören. Hier eine simple TLabel-Ableitung:
Delphi-Quellcode:
TDynLabel = class(TLabel)
private fIndex: Integer; procedure setIndex(const aValue: Integer); public constructor Create(aOwner: TWinControl; aIndex: Integer); overload; virtual; published property Index: Integer read fIndex write setIndex; end;
Delphi-Quellcode:
Jetzt kannst du deine Erzeugung der labels damit ersetzen:
constructor TDynLabel.Create(aOwner: TWinControl; aIndex: Integer);
begin inherited Create(aOwner); Parent := aOwner; Index := aIndex; end; procedure TDynLabel.setIndex(const aValue: Integer); begin fIndex := aValue; Name := 'DynLabel' + IntToStr(Index); end;
Delphi-Quellcode:
Der Zugriff wäre damit ganz easy (schließlich weißt du ja, dass alle TDynLabels deine dyn. Labels sind :zwinker: ):
for i := 1 to BuchstabenLabel.GetTextLen do
with TDynLabel.Create(Self, i) do begin j := j + 20; Caption := Wort[i]; Left := j; Top := 176; end;
Delphi-Quellcode:
for i := 0 to ControlCount - 1 do
begin if Controls[i] is TDynLabel then with TDynLabel(Controls[i]) do begin if Index = 1 then ShowMessage('Ja'); end; end; |
Re: Dynmaische Label finden
Danke, funzt super.
Eine Frage gleich noch. Wie kann ich die Labels wieder löschen? *fg* Mit destroy kommt eine AV |
Re: Dynmaische Label finden
Du musst auch von hinten löschen. Du reduzierst ja dabei die Anzahl der Controls. ;)
Delphi-Quellcode:
Wozu brauchst du eigentlich soviele Labels? :gruebel:
for i := ControlCount - 1 downto 0 do
begin if Controls[i] is TDynLabel then Controls[i].Free(); end; |
Re: Dynmaische Label finden
Gleich wirst du mich schlagen, weil's bestimmt vieeel viel einfacher ging.
Ich will ein Hangman-Spiel zur Überung programmieren. Jetzt bin ich schon soweit, dass der relevante Code von "fremden" kam, aber dabei lerne ich trotzdem. Und sag's mir... Es ging einfacher :gruebel: |
Re: Dynmaische Label finden
die einfachste und vielleicht auch perfomanteste Lösung wäre wie schon angesprochen wohl diese
Delphi-Quellcode:
private
LabelList: TList; //Liste in der die Labels gehalten werden [...] LabelList := TList.Create; //Liste muss natürlich erzeugt werden (im Create) [...] LabelList.Free; //und auch wieder zuerstört werden(im Destroy) [...] procedure TYourClass.ClearLabellist; //Diese Procedure gibt alle Labels frei var LCount: Integer; begin for LCount := 0 to LabelList.Count - 1 do //und zwar in dem alle Labels aus der Liste freigegeben werden TObject(LabelList.Items[LCount]).Free; LabelList.Clear; end; [...] var i,j:integer; begin ClearLabelList; //befor neue Labels angelegt werden geben wir die alten Labels frei Label4.Visible:=False; Wort:=sl.Strings[random(sl.Count)]; Label4.Caption:=Wort; j:=176; for i:=1 to Label4.GetTextLen do begin Buchstabe:=TLabel.Create(nil); Buchstabe.Parent:=Form1; Buchstabe.Caption:=Copy(wort,i,1); Buchstabe.Left:=j+20; Buchstabe.Top:=176; j:=Buchstabe.Left; LabelList.Add(Buchstabe); //damits wieder freigegeben werden kann muss es noch in die Liste eingetragen werden end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 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