Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Dynamisch Erstellter Button - NAME (https://www.delphipraxis.net/162255-dynamisch-erstellter-button-name.html)

thomasschaf 14. Aug 2011 20:36

Delphi-Version: 5

Dynamisch Erstellter Button - NAME
 
Hallo,

habe jetzt dank Hilfe hier im Forum, es geschafft einem dynamisch erstellten Button ein On...-Event zuzuweisen.
(http://www.delphipraxis.net/162254-b...vents-wie.html)

Jetzt möchte ich mehrere Buttons erstellen.

Diese sollen jetzt am besten ein "NAME" haben, damit ich sie ansteuern kann.

Wie krieg ich das hin`?

Bernhard Geyer 14. Aug 2011 20:41

AW: Dynamisch Erstellter Button - NAME
 
Dynamisch erstellt Controls brauchen keinen "Namen". Du kannst Sie entweder mittels lokaler Variable referenzieren oder falls es mehrer gleichgartete Controls sind über ein Array oder Liste. Das Namens-Property ist nur für das DFM-Streaming relevant damit beim einlesen der DFM beim Programmablauf klar ist welche DFM-"Variable" zu welcher realen Formularvariable gemappt werden soll.

hans ditter 14. Aug 2011 22:21

AW: Dynamisch Erstellter Button - NAME
 
Tja, also wenns viele Buttons werden sollen, dann stimme ich Bernhard zu. Ansonsten kannst du über die Referenzvariable den Namen zuweisen:
Delphi-Quellcode:
var
  MeinButton: TButton;
begin
  MeinButton := TButton.Create(self);
  MeinButton.Name := 'DasIstMeinButton';
end;
So sollte das funktionieren. Bei vielen dynamisch erstellten Buttons solltest du die aber wirklich lieber über ein Array oder eine Liste verwalten.

LG; hans ditter

thomasschaf 15. Aug 2011 17:33

AW: Dynamisch Erstellter Button - NAME
 
Ok, aber wie würde das mit den Arrays gehen ?

Also ich würde dann so was in der Art machen:


Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  a: TButton;
  i: Integer;
begin
  for i:=1 to 100 do begin

  a    := TButton.Create(self);
  a.Parent := Form1;
  a.Visible := True;
  a.Top := 50*i+10;
  a.Left := 10;
  a.Width := 100;
  a.Height := 45;
  a.Caption := 'Der '+inttostr(i)+'. Button!';

  end;
end;
Aber wie meint ihr das mit dem Array ?

Danke!

himitsu 15. Aug 2011 17:36

AW: Dynamisch Erstellter Button - NAME
 
Delphi-Quellcode:
var
  a: TButton;
Variable für eine Komponente ... wie würde man da wohl ein Array reinbauen?
Delphi-Quellcode:
array of ...
+ SetLength
oder
Delphi-Quellcode:
array[1..100] of ...
.
oder eine TObjectList

hans ditter 15. Aug 2011 22:41

AW: Dynamisch Erstellter Button - NAME
 
Hey Thomas!
Ich bin mir nicht ganz sicher, aber so wie du das gemacht hast, würde es wohl sowieso nicht funktionieren, da du dann 100 Buttons hast, aber nur einer davon durch die Variable ansprechbar ist.

Mit dem Array würde es dann, wie Himitsu schon sagte, so gehen:
Delphi-Quellcode:
var
  MyButtons: array[1..100] of TButton;
begin
  for i:= 0 to 100 do
  begin
    MyButtons[i] := TButton.Create;
    MyButtons[i].Left := 100;
    {etc. blabla}
  end;
end;
Über TObjectList kannst du dich auch im Netz informieren... einfach mal bei Google 'delphi tobjectlist' eingeben und schon solltest du was finden!

hoika 16. Aug 2011 06:29

AW: Dynamisch Erstellter Button - NAME
 
Hallo,

ich bringe mal FindComponent ins Spiel.
Dann könnte man sich das Array sparen.

Delphi-Quellcode:
procedure TForm1.TuWas;
var
  Btn: TButton;
begin
  Btn:= TButton(FindComponent('MeinButton1'));
  if Assigned(Btn) then
  begin
  end;
end;

himitsu 16. Aug 2011 06:58

AW: Dynamisch Erstellter Button - NAME
 
Jedesmal in einer Liste nach dem Namen zu suchen ist aber etwas "umständlicher", als mal kurz einen Index auf ein(e) Array/Liste anzuwenden.

FredlFesl 16. Aug 2011 07:04

AW: Dynamisch Erstellter Button - NAME
 
Zitat:

Zitat von hoika (Beitrag 1117103)
Hallo,
ich bringe mal FindComponent ins Spiel.
Dann könnte man sich das Array sparen.

Nimm die mal lieber wieder aus dem Spiel. FindComponent ist doch nix. Zu langsam, zu umständlich.
Unterm Strich hätte man doch nichts gespart.

Wenn 100 Buttons (oder wie viele auch immer) dynamisch erzeugt werden sollen, steckt mehr dahinter
=> Eigene Komponente, Frame o.ä.
=> Zugriff dort hin verschieben
=> Zugriff über Array-Property
=> Implementierung egal (FindComponent, Array, TList, TObjectList)

[zu spät]

hoika 16. Aug 2011 07:16

AW: Dynamisch Erstellter Button - NAME
 
Hallo,

Zitat:

Nimm die mal lieber wieder aus dem Spiel. FindComponent ist doch nix. Zu langsam, zu umständlich.
Einspruch ! ;)
Was glaubst, was FindComponent macht ?
Die Methode durchläuft eine Array/TList (?) (Components).
OK, das Array/TList ist größer, aber was hat das mit "Zu langsam" zu tun.

100 Buttons werden erzeugt und mit einer Ereignis-Methode verknüpft.
Und danach ?
Ich schätze mal, der Code in der Ereignis-Methode dauert länger als das Suchen.

Zitat:

umständlich.
Eine Form-globale Array-Variable zu erzeugen und zu verwalten ist nicht umständlich ?

So, musste mal gesagt werde und jetzt wird fleissig gearbeitet
mit aufs vorm gepappten Buttons ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 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