![]() |
Dynmaische Label finden
Hallo,
erstelle mit folgendem Code dynamische Label, da ich aus einem Wort jeden einzelnen Buchstaben als Label haben möchte:
Delphi-Quellcode:
Wie kann ich jetzt zum Bleistift alle Labels von "Buchstabe" löschen, oder auf einzelne zugreifen?
var
i,j:integer; begin 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; end; end; Danke im Voraus |
Re: Dynmaische Label finden
hi,
so geht das:
Delphi-Quellcode:
aenogym
//i als laufvariable deklarieren (integer)
for i := 0 to form1.ComponentCount - 1 do begin if form1.Components[i].ClassType = TLabel then begin //hier kannst du mit "form1.Components[i]" arbieten. //ggf. typecast durchführen end; end; |
Re: Dynmaische Label finden
Oh,
danke. Werd es mal testen. |
Re: Dynmaische Label finden
Naja,
ich habe hier aber nicht nur dynamische Labels, sondern auch 4 statische Labels... stehe ich auf dem Schlauch? |
Re: Dynmaische Label finden
Dann benamse die dynamischen Labels so, daß du sie später erkennst.
|
Re: Dynmaische Label finden
Oder tu sie dir in ein Array of TLabel im private Teil des Forms ;)
|
Re: Dynmaische Label finden
Zitat:
Ein konstanter Array wäre aber sicher schneller, da man nur die elevanten Controls durchlaufen muss. "Einfacher" wäre aber die Ableitung (vor allem da du sie eh dynamisch erzeugst):
Delphi-Quellcode:
TMyLabel = class(TLabel)
end;
Delphi-Quellcode:
for i := 0 to ControlCount - 1 do
if Coltrols[i] is TMyLabel then with TMyLabel(Controls[i]) do ... |
Re: Dynmaische Label finden
So,
habe jetzt diesen Code:
Delphi-Quellcode:
Label1 findet er. Doch die auch nachweisbar erstellte TLabel Komponente mit dem Namen Dyn1 findet er nicht, wenn ich diesen Code benutze. Warum?!?
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 = 'Label1' then ShowMessage('JA'); end; 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
Vielleicht ist das falsch:
Delphi-Quellcode:
und sollte so aussehen:
Dyn1:=TLabel.Create(nil)
Delphi-Quellcode:
Dyn1:=TLabel.Create(self{form1})
|
Re: Dynmaische Label finden
Zitat:
form1 ist eine globale Variable! Was hat die denn da zu suchen? :gruebel: Bitte mal ![]() Außerdem ist die Prüfung auf eine Klasse der is-Operator. Richtig wäre also:
Delphi-Quellcode:
if Components[i] is TLabel then
Delphi-Quellcode:
Warum sollte man überhaupt nach einem Control per Namen suchen? :gruebel:
Label1 findet er. Doch die auch nachweisbar erstellte TLabel Komponente mit dem Namen Dyn1 findet er nicht, wenn ich diesen Code benutze. Warum?!?
Aber egal.... Hast du ihm auch wirklich einen Namen gegeben?
Delphi-Quellcode:
Control.Name := 'Dyn1';
|
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; |
Re: Dynmaische Label finden
@SirThornberry:
Ich stimme deiner signatur voll und ganz zu ;) Nein im Ernst. Verstehe es. hast schon recht. Habs allerdings noch nichts getestet. |
Re: Dynmaische Label finden
Hi,
Du könntest auch ![]() mfG mirage228 |
Re: Dynmaische Label finden
@SirThornberry: Und so muss man sich am Ende nicht um alles kümmern...
Delphi-Quellcode:
type TLabelList=class(TList) public procedure BeforeDestruction();override; procedure ClearLabelList(); end; //.... procedure TLabelList.ClearLabelList(); var i:Integer; currentObject:TObject; begin for i:=0 to Count-1 do begin currentObject:=TObject(Items[i]); currentObject.Free(); Items[i] := nil; end; while Count>0 do Delete(0); Clear(); end; procedure TLabelList.BeforeDestruction(); begin ClearLabelList(); inherited; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 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