Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Button von Nutzer erstellen (https://www.delphipraxis.net/171835-button-von-nutzer-erstellen.html)

Smaraner 27. Nov 2012 16:19

Delphi-Version: 7

Button von Nutzer erstellen
 
Hallo,

gibt es eine Möglichkeit, vom User einen Button zu erstellen? Also, wenn er auf einen Button klick das ein neuer erstellt wird.

Gruß Sebastian

WM_CLOSE 27. Nov 2012 16:22

AW: Button von Nutzer erstellen
 
Delphi-Quellcode:
var
  Button: TButton;
begin
  Button := TButton.Create;
  Button.Parent := Form;
  Button.Text := "Muh!";
end;
Bitte korrigiert mich, wenn ich falsch liege.

Smaraner 27. Nov 2012 16:26

AW: Button von Nutzer erstellen
 
Es wird jetzt der Fehler ausgegeben:

Nicht genügend Parameter bei
Delphi-Quellcode:
Button := TButton.Create

Jonas Shinaniganz 27. Nov 2012 16:28

AW: Button von Nutzer erstellen
 
Dann übergibst du noch einen Owner, am besten die Form.

Grüß

Smaraner 27. Nov 2012 16:30

AW: Button von Nutzer erstellen
 
Danke, hat geklappt. :-D

Smaraner 27. Nov 2012 16:55

AW: Button von Nutzer erstellen
 
Wie kann ich es jetzt hinbekommen, das dieser ersellte Button das beim klicken ausführt:

Delphi-Quellcode:
 Application.MessageBox('Test', 'Test', MB_ICONQUESTION or MB_OK);

nuclearping 27. Nov 2012 17:00

AW: Button von Nutzer erstellen
 
Delphi-Quellcode:
unit Form1;

interface

...

type
  TForm1 = class(TForm)
    ...
  private
    procedure CreateButton;
    procedure MyButtonClick(Sender: TObject);
  public
    ...
  end;

implementation

procedure TForm1.CreateButton;
var
  Button: TButton;
begin
  Button := TButton.Create;
  Button.Parent := Form;
  Button.Caption := 'Muh!';
  Button.Name := 'MeinButton1';
  Button.OnClick := MyButtonClick;
end;

procedure TForm1.MyButtonClick(Sender: TObject);
var
  Button: TButton;
begin
  if not (Sender is TButton) then
    Exit;

  Button := Sender as TButton;
  ShowMessage(Button.Name + ' wurde angeklickt: ' + Button.Caption);
end;

...

end.

Smaraner 27. Nov 2012 17:34

AW: Button von Nutzer erstellen
 
Der Button wird ja aber vom Nutzer erstellt, nicht von mir, und der kann den Button ja beliebig benennen.

DeddyH 27. Nov 2012 17:44

AW: Button von Nutzer erstellen
 
Lass die Namenszuweisung weg, das klappt eh nur 1 mal. Und benennen kann der User den Button wohl kaum, höchstens beschriften.

uligerhardt 27. Nov 2012 18:02

AW: Button von Nutzer erstellen
 
Zitat:

Zitat von nuclearping (Beitrag 1193262)
Delphi-Quellcode:
  if not (Sender is TButton) then
    Exit;
  Button := Sender as TButton;

Wenn man schon mit
Delphi-Quellcode:
is
geprüft hat, ob ein Cast zulässig ist, kann man beherzt hart casten:
Delphi-Quellcode:
Button := TButton(Sender);
Gibt's eigentlich irgendwo eine Seite, die das gut erklärt, damit man was zum Verlinken hat?

DeddyH 27. Nov 2012 18:16

AW: Button von Nutzer erstellen
 
Zumindest hier in der DP wurde das schon mehrfach erwähnt.

nuclearping 28. Nov 2012 01:31

AW: Button von Nutzer erstellen
 
Zitat:

Zitat von Smaraner (Beitrag 1193266)
Der Button wird ja aber vom Nutzer erstellt, nicht von mir, und der kann den Button ja beliebig benennen.

Und in was für einer Relevanz steht das zu dem geposteten Beispiel-Code? Wenn du nicht willst, dass auf dem Button "Muh!" steht, sondern das, was der Benutzer angegeben hat, musst du das halt entsprechend abfragen und an den Button weitergeben (zB mit einem Parameter für die CreateButton-Funktion):
Delphi-Quellcode:
procedure TForm1.CreateButton(ACaption: String);
begin
  ...
  Button.Caption := ACaption;
  ...
end;

hoika 28. Nov 2012 05:03

AW: Button von Nutzer erstellen
 
Hallo,

Um deine Buttons intern besser zu unterscheiden,
gäbe es dann noch das Property Tag.
Das ist ein Integer zu Deiner freien Verwendung.

Heiko

DeddyH 28. Nov 2012 07:01

AW: Button von Nutzer erstellen
 
Oder man packt sie in eine TObjectlist/TComponentlist, dann kann man sie über ihren Listenindex ansprechen. Man muss sich nur überlegen, wer für die Speicherverwaltung zuständig sein soll, Owner oder Liste.

Sir Rufo 28. Nov 2012 08:00

AW: Button von Nutzer erstellen
 
Zitat:

Zitat von DeddyH (Beitrag 1193315)
Oder man packt sie in eine TObjectlist/TComponentlist, dann kann man sie über ihren Listenindex ansprechen. Man muss sich nur überlegen, wer für die Speicherverwaltung zuständig sein soll, Owner oder Liste.

Warum eigentlich nicht das naheliegenste?
Delphi-Quellcode:
type
  TForm1 = class( TForm )
  ..
  private
    ButtonOwner : TComponent;
  ..
  end;

// Bei der Form Erstellung
ButtonOwner := TComponent.Create( Self );

DeddyH 28. Nov 2012 08:04

AW: Button von Nutzer erstellen
 
Den Ansatz verstehe ich ehrlich gesagt nicht. :gruebel:

Sir Rufo 28. Nov 2012 08:08

AW: Button von Nutzer erstellen
 
Delphi-Quellcode:
TButton.Create( ButtonOwner );

DeddyH 28. Nov 2012 08:14

AW: Button von Nutzer erstellen
 
Um dann über die Komponente bzw. ihr Components-Array auf die Buttons zuzugreifen? Da erscheint mir eine Liste aber logischer.

Sir Rufo 28. Nov 2012 08:29

AW: Button von Nutzer erstellen
 
Zitat:

Zitat von DeddyH (Beitrag 1193330)
Um dann über die Komponente bzw. ihr Components-Array auf die Buttons zuzugreifen? Da erscheint mir eine Liste aber logischer.

Wo ist der Unterschied, ausser dass du bei der Verwendung einer normalen Liste den Overhead mit der Nachführung beim Hinzufügen und Entfernen von diesen Buttons hast?

DeddyH 28. Nov 2012 08:38

AW: Button von Nutzer erstellen
 
Die eine Zeile in der CreateButton-Methode macht den Kohl doch auch nicht fett. Für mich sieht es nur komisch aus, wenn man ein VCL-Element wie TComponent dazu benutzt, um Listenelemente zu verwalten. Wobei ich damit nicht sagen will, dass man das nicht machen darf, es funktioniert ja auch. Allerdings würde ich mich vermutlich wundern, wenn in einem Code plötzlich eine Komponente auftaucht, die scheinbar nirgends genutzt wird, außer wenn man ihre Components anspricht.

Sir Rufo 28. Nov 2012 08:45

AW: Button von Nutzer erstellen
 
Zitat:

Zitat von DeddyH (Beitrag 1193335)
Für mich sieht es nur komisch aus, wenn man ein VCL-Element wie TComponent dazu benutzt...

Das war mir irgendwie entgangen, dass TComponent direkt zur VCL gehört?
Ich dachte immer, dass ist ein Basistyp (Delphi-Referenz durchsuchenSystem.Classes.TComponent), der auch von der VCL (oder auch FMX) benutzt wird :stupid:

Jonas Shinaniganz 28. Nov 2012 09:01

AW: Button von Nutzer erstellen
 
Zitat:

Wie kann ich es jetzt hinbekommen, das dieser ersellte Button das beim klicken ausführt:

Application.MessageBox('Test', 'Test', MB_ICONQUESTION or MB_OK);

Zuerst erstellst du dir ein Event, welches deinen Code ausführt.

Delphi-Quellcode:
unit Form1;

interface

...

type
 
  TForm1 = class(TForm)
  private
    procedure MyButtonClick(Sender: TObject);
  end;

implementation


procedure TForm1.MyButtonClick(Sender: TObject);
begin
  Application.MessageBox('Test', 'Test', MB_ICONQUESTION or MB_OK);
end;

end.
Jetzt muss der Button noch wissen, das er dieses Event auch aufrufen soll:
(Die Zuweisung kannst du z.b. dort machen, wo du den Button auch erstellst)

Zitat:

Button.OnClick := MyButtonClick; // das Event dem OnClick deines Buttons zuweisen
Weiterführend dazu kannst du dir noch durchlesen:
(procedure of object)
http://www.delphi-treff.de/object-pa...ethodenzeiger/

DeddyH 28. Nov 2012 09:04

AW: Button von Nutzer erstellen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1193336)
Das war mir irgendwie entgangen, dass TComponent direkt zur VCL gehört?

Das wird mir jetzt zu blöd. Ich persönlich ordne TComponent allein schon aufgrund des Bezeichners unter VCL ein, wenn Du das nicht tust, ist das eben Deine Sache.

himitsu 28. Nov 2012 09:30

AW: Button von Nutzer erstellen
 
Nja, bis vor FMX wurde es von Delphi selber ja praktisch fast ausschließlich nur für die VCL genutzt ... da könnte man schon auf den Gedanken kommen, daß der Typ auch zu VCL gehört.

Ab TWinControl isses definitiv für die "visuelle" VCL, davor sind es einfach nur Komponenten, welche über eine gemeinsame Owner-Beziehung verfügen.

Jonas Shinaniganz 28. Nov 2012 09:32

AW: Button von Nutzer erstellen
 
Der Neuling hat doch noch nichtmal nach der Referenzverwaltung gefragt oder überhaupt das Problem entdeckt. Vielleicht ist sein Button ja auch nach dem ersten "KLICK" disabled oder sowas.

Das sind Kommentare die (projeziert) gegen CleanCode verstoßen und ich hoffe, dass sich dasGeschwätz nicht von hier bis zu euren Sourcen erstreckt. :-D (hui, ich hab eine unpolitische Aussage getroffen)

Trefft euch auf einen Kaffe, ich sehe da viel Gesprächsstoff-Potential :D


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