Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi label erstellen --> Name? (https://www.delphipraxis.net/60636-label-erstellen-name.html)

MAM2508 10. Jan 2006 13:23


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.

chaosben 10. Jan 2006 13:33

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:
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;
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.
Delphi-Quellcode:
if (FormularName[idx].Components is TLabel) and (TLabel(FormularName[idx].Components).Tag=DeineZahl) then

Jelly 10. Jan 2006 13:34

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:
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 ;
Der Aufruf würde dann etwa so aussehen:

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 ;

Daniel Schuhmann 10. Jan 2006 13:44

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 ^^).

Jelly 10. Jan 2006 13:46

Re: label erstellen --> Name?
 
Zitat:

Zitat von Daniel Schuhmann
Aber als Variablennamen bitte nicht "Label" verwenden. Label ist ein reservierter Begriff und dient als Sprungziel für Goto (do not use ^^).

Stimmt, da war ich kurz abwesend :-)

Daniel Schuhmann 10. Jan 2006 13:57

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;

Jelly 10. Jan 2006 14:06

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.

Daniel Schuhmann 10. Jan 2006 14:11

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.

Jelly 10. Jan 2006 15:13

Re: label erstellen --> Name?
 
Zitat:

Zitat von Daniel Schuhmann
Gefällt mir aber so besser, als über den Tag drauf zuzugreifen.

Das hängt vielleicht von der Situation ab. Indirekt bringst Du ja auch den Wert von Anzahl im Labelnamen unter. Ich schreib ihn in den Tag. Ich denk das ist gehupst wie gedupst, alles wohl Geschmackssache.

mumu 10. Jan 2006 15:25

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 05:53 Uhr.
Seite 1 von 2  1 2   

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