![]() |
label erstellen --> Name?
hallo, ich habe mal eine frage:
ich bin total der neuling aber ein fruend und ich langweilien uns ziemlich im informatikunterrich. es ist das erste halbjahr, aber wir wollen viel mehr lernen. unser problem: es wird mit jedem knopfdruck ein neues label unter das letzte geschrieben:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer; begin MyLabel := TLabel.Create(Form1); inc(anzahl); with MyLabel do begin Caption := 'test'; Top := 100+Anzahl*20; Left := 150; Parent := Form1; end; end; was muss man tun, damit die labels namen bekommen? wir wissen nämlich nicht, wie wir sie danach beschriften können (oder allgemein damit arbeiten), weil wir halt den namen der labels nicht kennen. es ist sicher nur ein kleines problem für euch, aber wir haben keine ahnung davon. |
Re: label erstellen --> Name?
Hi MAM2508 ... und herzlich willkommen in der DelphiPraxis! :hi: :hi:
Ein schlechte Nachricht gleich vorneweg: Deine Labels werden keinen Namen haben. Warum? Weil du sie ja nicht eindeutig deklarierst. Du hast sie kurze Zeit unter dem Namen "MyLabel" zur Verfügung. Aber eben nur so lange, wie die Variable nicht freigegeben (.Free) oder neu belegt wird. Was kannst du jetzt tun? Ein Weg führt über die Eingenschaft "Components" deines Formulars. Diese enthält eine List aller Komponenten, deren "Parent" das Formular ist. Du könntest also die Liste durchklappern und nach deinen Labels suchen.
Delphi-Quellcode:
Dadurch findest du natürlich alle Labels; auch die, die du mit dem Designer auf das Form gezogen hast. Um das zu vermeiden, könntest du dir in MyLabel.Tag eine Zahl speichern, die du später, in obiger Routine, kontrollierst.
var
idx : Integer; EinLabel : TLabel; begin for idx:=0 to FormularName.ComponentCount-1 do begin if (FormularName[idx].Components is TLabel) then //Nachsehen, ob diese Komponente vom Typ TLabel ist begin EinLabel:=TLabel(FormularName[idx].Components); //Wir holen uns die Komponente als TLabel EinLabel.MAchDiesUndMachDas .... end; end; end;
Delphi-Quellcode:
if (FormularName[idx].Components is TLabel) and (TLabel(FormularName[idx].Components).Tag=DeineZahl) then
|
Re: label erstellen --> Name?
Da Du die Labels zur Laufzeit erstellst, kann Du nicht schon im Quellcode über einen Namen darauf zugreifen. Du hast im Grunde 2 Möglichkeiten:
1. Du packst die Labels in ein array, und greifst dann über den Index auf das Label zu 2. Du verzichtest auf das Array und suchst beim Zugriff auf das Label mittels FindComponent danach. Du kannst im Label die Eigenschaft Tag setzen, den Du als Index für dein Label nehmen kannst... Du hast doch schon die Variable Anzahl. Ich würde als den Tag einfach mit dem Wert von Anzahl füllen. Wenn Du nun also das 3. erstellte Label suchst, könntest Du diese Funktion nutzen:
Delphi-Quellcode:
Der Aufruf würde dann etwa so aussehen:
function TForm1.LabelNr (Index : integer) : TLabel ;
var i : integer ; begin Result := nil ; for i := 0 to ComponentCount-1 do if Components[i] is TLabel then begin if (Components[i] as TLabel).Tag = Index then begin Result := Components[i] as TLabel ; abort ; end ; end ; end ;
Delphi-Quellcode:
procedure TForm1.MachWasMitDemLabel ;
var Label : TLabel ; begin Label := LabelNr (3) ; if assigned(Label) then with Label do begin // Mach irgend was. end ; end ; |
Re: label erstellen --> Name?
Aber als Variablennamen bitte nicht "Label" verwenden. Label ist ein reservierter Begriff und dient als Sprungziel für Goto (do not use ^^).
|
Re: label erstellen --> Name?
Zitat:
|
Re: label erstellen --> Name?
Mal ne ganz andere Frage... warum nicht einfach die Namen zur Laufzeit vergeben? Folgendes funktioniert bei mir zumindest:
Delphi-Quellcode:
type
// [...] private procedure SetMyLabelCaption(LabelName, Caption: String); end; var // [...] Anzahl: Integer; implementation procedure TForm1.Button1Click(Sender: TObject); var i: Integer; MyLabel: TLabel; begin MyLabel := TLabel.Create(Form1); inc(anzahl); with MyLabel do begin Caption := 'test'; Top := 100+Anzahl*20; Left := 150; Parent := Form1; Name := 'Label'+IntToStr(Anzahl); end; end; procedure TForm1.SetMyLabelCaption(LabelName, Caption: String); begin TLabel(FindComponent(LabelName)).Caption := Caption; end; procedure TForm1.Button2Click(Sender: TObject); begin SetMyLabelCaption('Label2', 'Hallo'); end; |
Re: label erstellen --> Name?
Ja klar, das klappt auch...
Aber trotzdem musst Du über FindComponent gehen, um deinen Label nachher anzusprechen. Ich denke mal, was hier gewollt war, ist dann irgendwo im Quelltext einfach mit label2.irgendwas zuzugreifen. Und das geht definitiv nicht. |
Re: label erstellen --> Name?
Ja sicher, das verweigert der compiler ja weil wegen gibts nicht. Gefällt mir aber so besser, als über den Tag drauf zuzugreifen.
|
Re: label erstellen --> Name?
Zitat:
|
Re: label erstellen --> Name?
naja aber vielleicht braucht man das tag später um noch irgendwelche anderen informationen dem label zuzuordnen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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 by Thomas Breitkreuz