Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekte während der Programmlaufzeit erzeugen? (https://www.delphipraxis.net/114027-objekte-waehrend-der-programmlaufzeit-erzeugen.html)

cetinbiryoldayim 18. Mai 2008 16:11


Objekte während der Programmlaufzeit erzeugen?
 
Guten Abend meine Herren/Damen ;)

Ich hätte heute wieder einmal eine Frage an euch wenns recht ist.
Undzwar möchte ich Objekte von festgelegten Klassen (wie z.B. TButton, TImage, usw.) während der Laufzeit erzeugen und diesen bei der Erzeugung mit durch die Übergabe Parametern Eigenschaften zuteielen.

Ich habe schonmal bisschen probiert, doch lieg ich da glaube ich etwas falsch, denn es passiert nichts wenn ich auf Button1 klicke.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button2 := TButton.Create(Form1);
  Button2.Name := 'Button2';
  Button2.Enabled := true;
  Button2.Top := 50;
  Button2.Left := 50;
  Button2.Caption := 'Button2';
end;

end.
grüßchen

FAlter 18. Mai 2008 16:12

Re: Objekte während der Programmlaufzeit erzeugen?
 
Hi,

Delphi-Quellcode:
Button2.Parent := self;
Der Parent ist das, wo der Button drauf ist (kann z. B. auch ein Panel sein), du must ihn festlegen, sonst ist deine Komponente nirgends drauf.

Mfg
FAlter

toms 18. Mai 2008 16:13

Re: Objekte während der Programmlaufzeit erzeugen?
 
Hallo, was soll denn passieren, wenn du auf den Button klickst?
Du musst dem Button noch ein OnClick Ereignis zuweisen.

cetinbiryoldayim 18. Mai 2008 16:30

Re: Objekte während der Programmlaufzeit erzeugen?
 
@toms
würde es so gehen?

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  showmessage('Button2.Clicked');
end;

@FAlter
Danke, so funktioniert es.


Aber ich hätte noch eine Frage wenns geht:
Beim Komplementieren wird folgender Fehler gemeldet: "Feld Form1.Button2 besitzt keine entsprechende Komponente. Soll die Deklaration entfernt werden?" --> Ja/Nein/Abbrechen

Wenn ich es entfernen lasse erscheinen ein haufen Fehler, wenn ich Nein klicke so läuft es aber der Fehler besteht weiterhin...

Woran liegt das?

himitsu 18. Mai 2008 16:33

Re: Objekte während der Programmlaufzeit erzeugen?
 
Delphi-Quellcode:
Button2.OnClick := Button2Click;
der meckert immer rum, wenn solche Prozeduren nirgends zugewiesen sind ... sei's im QuellCode, oder im OI.

und du hast nur die Ereignisprozedur erstellt, aber sie nicht zugewiesen.

toms 18. Mai 2008 16:34

Re: Objekte während der Programmlaufzeit erzeugen?
 
Zitat:

Zitat von cetinbiryoldayim
@toms
würde es so gehen?

Nein, nicht so.

Zitat:

Zitat von toms
Du musst dem Button noch ein OnClick Ereignis zuweisen.

Delphi-Quellcode:
Button2.OnClick := DeinOnClickEreignis

cetinbiryoldayim 18. Mai 2008 16:49

Re: Objekte während der Programmlaufzeit erzeugen?
 
Sorry, aber habe es irgendwie nicht hingekriegt..
Meldet jetzt:
"Erste Zufalls-Exception bei $7C812A5B. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00455846 in Modul 'Project1.exe'. Schreiben von Adresse 00000124'. Prozess Project1.exe (2936)"

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button2 := TButton.Create(Form1);
  Button2.Parent := self;
  Button2.Name := 'Button2';
  Button2.Enabled := true;
  Button2.Top := 50;
  Button2.Left := 50;
  Button2.Caption := 'Button2';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  showmessage('Button2.Clicked');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2.OnClick := Button2Click;
end;

toms 18. Mai 2008 16:51

Re: Objekte während der Programmlaufzeit erzeugen?
 
Wenn du das Ereignis im OnCreate zuweist, existiert der Button noch nicht.
Darum gibt es eine AV.

cetinbiryoldayim 18. Mai 2008 16:56

Re: Objekte während der Programmlaufzeit erzeugen?
 
Alles klar :) jetzt gehts

danke euch allen !!

sx2008 18. Mai 2008 17:01

Re: Objekte während der Programmlaufzeit erzeugen?
 
Könntest du bitte die Überschrift ändern nach:
Controls während der Programmlaufzeit erzeugen
denn Controls sind zwar auch Objekte, aber ganz spezielle Objekte:
Visuelle Steuerelemente ist die deutsche Bezeichnung dafür.

Ich habe deinen Code mal überarbeitet, denn du hast noch 2 Fehler drinne:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    MyButton: TButton; // dynamisches Control gehört zur priv. Deklaration, da nicht von der IDE verwaltet
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyButton := TButton.Create(Form1);
  MyButton.Parent := self;
  MyButton.Name := 'MeinErsterButton';
  MyButton.Enabled := true;
  MyButton.Top := 50;
  MyButton.Left := 50;
  MyButton.Caption := 'Button2';
  MyButton.OnClick := Button2Click;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  showmessage((Sender as TControl).Name+'.Clicked');
end;


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