Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dynmaische Label finden (https://www.delphipraxis.net/49397-dynmaische-label-finden.html)

TheMiller 10. Jul 2005 21:34


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:
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;
Wie kann ich jetzt zum Bleistift alle Labels von "Buchstabe" löschen, oder auf einzelne zugreifen?

Danke im Voraus

Aenogym 10. Jul 2005 21:40

Re: Dynmaische Label finden
 
hi,

so geht das:

Delphi-Quellcode:
//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;
aenogym

TheMiller 10. Jul 2005 21:47

Re: Dynmaische Label finden
 
Oh,

danke. Werd es mal testen.

TheMiller 10. Jul 2005 21:48

Re: Dynmaische Label finden
 
Naja,

ich habe hier aber nicht nur dynamische Labels, sondern auch 4 statische Labels... stehe ich auf dem Schlauch?

leddl 10. Jul 2005 21:51

Re: Dynmaische Label finden
 
Dann benamse die dynamischen Labels so, daß du sie später erkennst.

jfheins 10. Jul 2005 22:02

Re: Dynmaische Label finden
 
Oder tu sie dir in ein Array of TLabel im private Teil des Forms ;)

Robert_G 10. Jul 2005 22:31

Re: Dynmaische Label finden
 
Zitat:

Zitat von jfheins
Oder tu sie dir in ein Array of TLabel im private Teil des Forms ;)

Entweder das, oder eine Ableitung von TLabel nehmen.
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
        ...

TheMiller 10. Jul 2005 23:00

Re: Dynmaische Label finden
 
So,

habe jetzt diesen Code:

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 = 'Label1' then
      ShowMessage('JA');
    end;
  end;
end;
Label1 findet er. Doch die auch nachweisbar erstellte TLabel Komponente mit dem Namen Dyn1 findet er nicht, wenn ich diesen Code benutze. Warum?!?

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;

sniper_w 10. Jul 2005 23:14

Re: Dynmaische Label finden
 
Vielleicht ist das falsch:
Delphi-Quellcode:
Dyn1:=TLabel.Create(nil)
und sollte so aussehen:
Delphi-Quellcode:
Dyn1:=TLabel.Create(self{form1})

Robert_G 10. Jul 2005 23:14

Re: Dynmaische Label finden
 
Zitat:

Zitat von DJ-SPM
habe jetzt diesen Code:
Delphi-Quellcode:
if form1.Components[i].ClassType = TLabel then

Autsch... :?
form1 ist eine globale Variable! Was hat die denn da zu suchen? :gruebel: Bitte mal hier nach "Prost Mahlzeit! :cheers: " suchen... :roll:
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:
Label1 findet er. Doch die auch nachweisbar erstellte TLabel Komponente mit dem Namen Dyn1 findet er nicht, wenn ich diesen Code benutze. Warum?!?
Warum sollte man überhaupt nach einem Control per Namen suchen? :gruebel:
Aber egal.... Hast du ihm auch wirklich einen Namen gegeben?
Delphi-Quellcode:
Control.Name := 'Dyn1';

TheMiller 10. Jul 2005 23:17

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;

sniper_w 10. Jul 2005 23:25

Re: Dynmaische Label finden
 
Das:
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;
sollte so aussehen:
Delphi-Quellcode:
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;
oder gar so:
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;

TheMiller 10. Jul 2005 23:29

Re: Dynmaische Label finden
 
Auch mit deinen beiden Codes findet er nix...

Was mach ich denn falsch??

Robert_G 10. Jul 2005 23:30

Re: Dynmaische Label finden
 
Zitat:

Zitat von DJ-SPM
Auch mit deinen beiden Codes findet er nix...
Was mach ich denn falsch??

Zitat:

Zitat von sniper_w
Vielleicht ist das falsch:
Delphi-Quellcode:
Dyn1:=TLabel.Create(nil)
und sollte so aussehen:
Delphi-Quellcode:
Dyn1:=TLabel.Create(self{form1})


TheMiller 10. Jul 2005 23:41

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:

Robert_G 11. Jul 2005 00:09

Re: Dynmaische Label finden
 
Zitat:

Zitat von DJ-SPM
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:

Hast du dich nicht gewundert, wie das Form wissen kann, was es für Labels besitzt?
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:
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;
Jetzt kannst du deine Erzeugung der labels damit ersetzen:
Delphi-Quellcode:
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;
Der Zugriff wäre damit ganz easy (schließlich weißt du ja, dass alle TDynLabels deine dyn. Labels sind :zwinker: ):
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;

TheMiller 11. Jul 2005 00:19

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

Robert_G 11. Jul 2005 00:53

Re: Dynmaische Label finden
 
Du musst auch von hinten löschen. Du reduzierst ja dabei die Anzahl der Controls. ;)
Delphi-Quellcode:
for i := ControlCount - 1 downto 0 do
begin
  if Controls[i] is TDynLabel then
    Controls[i].Free();
end;
Wozu brauchst du eigentlich soviele Labels? :gruebel:

TheMiller 11. Jul 2005 00:55

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:

SirThornberry 11. Jul 2005 07:38

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;

TheMiller 11. Jul 2005 09:14

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.

mirage228 11. Jul 2005 09:21

Re: Dynmaische Label finden
 
Hi,

Du könntest auch Delphi-Referenz durchsuchenTObjectList (ab Delphi 6) verwenden. Dann sparst Du Dir das manuelle Freigeben der Controls, da per default alle Objekte der TObjectList beim Zerstören mit freigegeben werden. Zudem musst Du beim Zugriff nicht auf TObject casten.

mfG
mirage228

sniper_w 11. Jul 2005 10:26

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 18:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz