Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Eigenes Objekt


covel - Di 28.03.06 20:43
Titel: Eigenes Objekt
Guten Abend,

ich möchte gern ein "Objekt" definieren. Das Objekt soll z.B. ein Panel mit 2 Button sein. Diesem Panel bzw. den Buttons möchte ich noch gerne eine eingene Methode (könnten auch mehrere werden) zuweisen. Anschließend möchte ich das Objekt (am besten als array) zur Laufzeit erstellen (mit create).

Wie kann ich da machen ?? ;-)

Grüße Covel


mkinzler - Di 28.03.06 20:54
Titel: Re: Eigenes Objekt
user profile iconcovel hat folgendes geschrieben:
Guten Abend,


ich möchte gern ein "Objekt" definieren. Das Objekt soll z.B. ein Panel mit 2 Button sein.

Dann erzeuge eine von TPanel abgeleitete Klasse.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
 TMypanel = class(TPanel)
    Buton1: TButton;
    Button2: TButton;
    constructor Create;
end;

constructor TMyPanel.Create;
begin
  Button1 := TButton.Create(self);
  Button1 := TButton.Create(self);
end;


Achtung: schnell dahingetippt; keine haftung bei Fehlern ;-)

Zitat:
Diesem Panel bzw. den Buttons möchte ich noch gerne eine eingene Methode (könnten auch mehrere werden) zuweisen.

Diese Klasse kannst du dann problemlos um weitere Methoden erweitern.
Zitat:
Anschließend möchte ich das Objekt (am besten als array) zur Laufzeit erstellen (mit create).

Erzeuge einen Array deiner Klasse und weise ihm die neu erzeugten Instanzen zu


Kroko - Mi 29.03.06 07:37


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
 TMypanel = class(TPanel)
    Buton1: TButton;
    Button2: TButton;
    constructor Create;
end;

constructor TMyPanel.Create;
begin
  Button1 := TButton.Create(self);
  Button1 := TButton.Create(self);
  Button1.Parent := Self;
  Button2.Parent := Self;
end;
sollte es doch schon heißen, :wink:


mkinzler - Mi 29.03.06 08:05

Eigentlich sollte das .Create(self); den parent setztn.


Kroko - Mi 29.03.06 08:35

user profile iconmkinzler hat folgendes geschrieben:
Eigentlich sollte das .Create(self); den parent setztn.

.Create (Self9 setzt den Owner, nicht den Parent !


covel - Mi 29.03.06 11:14


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button2Click(Sender: TObject);
var
 TMypanel=class(TPanel)
    Buton1: TButton;
    Button2: TButton;
    constructor Create;
  end;

  constructor TMyPanel.Create;
  begin
    Button1 := TButton.Create(self);
    Button1 := TButton.Create(self);
  end;

  begin
end;


[Fehler] Unit1.pas(132): ',' oder ':' erwartet, aber '=' gefunden

was mache ich falsch?


Grishnak - Mi 29.03.06 11:22


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
type
 TMypanel=class(TPanel)
    Button1: TButton;
    Button2: TButton;
    constructor Create;
  end;

{...}

implementation

{...}

constructor TMyPanel.Create;
  begin
    Button1:=TButton.Create(self);
    Button2:=TButton.Create(self);
  end;

{...}

procedure TForm1.Button2Click(Sender: TObject);
  begin
    MyPanel:=TMyPanel.Create;
  end;


"MyPanel" sollte vorher aber noch irgendwo deklariert werden (am besten in der Form).


covel - Mi 29.03.06 12:42


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button2Click(Sender: TObject);

begin
  MyPanel:=TMyPanel.Create;
  with MyPanel do
  begin
    top:=100;
    left:=100;
    width:=100;
    height:=100;
    visible:= true;
  end;

end;


habe noch ne frage warum bekomme ich bei visible:= true oder parent:= form1 eine EAccessViolation Exception?


mkinzler - Mi 29.03.06 12:50

Muß heißen MyPanel:=TMyPanel.Create( self);


mkinzler - Mi 29.03.06 12:51

user profile iconmkinzler hat folgendes geschrieben:
Muß heißen MyPanel:=TMyPanel.Create( self);

und parent := self;


covel - Mi 29.03.06 12:59

Bekomme leider nur die fehlermeldung "zuviel Parameter"


mkinzler - Mi 29.03.06 13:10

Habe hier nen kleinen Fehler im constructor gemacht

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
constructor TMyPanel.Create( AWwner: TObject);
begin
    Owner := AOwner;
    Parent := AOwner;
    Button1 := TButton.Create(self);
    Button1.Parent := self;
    Button2 := TButton.Create(self);
    Button2.Parent := self;
end;


Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


alzaimar - Mi 29.03.06 14:09

Sollte im überschriebenen Konstruktor nicht doch der Konstruktor des Vorgänges aufgerufen werden?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
constructor TMyPanel.Create( AWwner: TObject);
begin
  inherited// <<-------------- MÖÖÖP
    Owner := AOwner;
    Parent := AOwner;
    Button1 := TButton.Create(self);
    Button1.Parent := self;
    Button2 := TButton.Create(self);
    Button2.Parent := self;
end;


mkinzler - Mi 29.03.06 14:33

Zitat:
Sollte im überschriebenen Konstruktor nicht doch der Konstruktor des Vorgänges aufgerufen werden?

Natürlich, heute ist nicht mein Tag

Moderiert von user profile iconraziel: Doppelposting entfernt.


F34r0fTh3D4rk - Mi 29.03.06 15:20

und die buttons sollten am besten auch noch freigegeben werden


Kroko - Mi 29.03.06 15:47

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
und die buttons sollten am besten auch noch freigegeben werden

nein, wenn Owner gesetzt, kümmert der sich darum!


Vera - Mi 29.03.06 15:54

Das stimmt schon. Ich mache es aber grundsätzlich so: Wenn ich ein Objekt erzeuge dann gebe ich dieses auch frei - Immer!

Wenn man sich daran mal gewöhnt hat dann vergisst man es an anderen "wichtigen" Stelle nicht mehr so schnell. ;-)


F34r0fTh3D4rk - Mi 29.03.06 15:55

ok da war ja doch eine version mit owner, davor waren aber einige ohne :P


covel - Mi 29.03.06 19:41

erstmal besten dank für eure hilfe

aber ich bekomme immer mehr fehler


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
  type TMypanel=class(TPanel)
    Button1: TButton;
    Button2: TButton;
    constructor Create(AWwner: TObject);
  end;

var
  Form1: TForm1;
  test: Tbutton;

MyPanel : TMyPanel;

implementation
constructor TMyPanel.Create( AWwner: TObject);
begin
  inherited// <<-------------- MÖÖÖP      hier kommt der Fehler
    Owner := AOwner;
    Parent := AOwner;
    Button1 := TButton.Create(self);
    Button1.Parent := self;
    Button2 := TButton.Create(self);
    Button2.Parent := self;
end;


Fehler:[Fehler] Unit1.pas(52): Inkompatible Typen

lasse ich das inherited weg kommt bei Owner:=AOwner folgenden fehlermeldung :
[Fehler] Unit1.pas(53): Einer Nur-Lesen Eigenschaft kann kein Wert zugewiesen werden


Waldheini - Mi 29.03.06 20:07

Versuch es mal mit:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
  type TMypanel=class(TPanel)  
    Button1: TButton;  
    Button2: TButton;  
    constructor Create(AWwner: TObject); override;  // überschreiben der 
                                                    // Vorgängermethode 
  end;  

 
var  
  Form1: TForm1;  
  test: Tbutton;  

 
MyPanel : TMyPanel;  

 
implementation  
constructor TMyPanel.Create( AWwner: TObject);  
begin  
  inherited Create(Self); 
    Owner := AOwner;  
    Parent := AOwner;  
    Button1 := TButton.Create(self);  
    Button1.Parent := self;  
    Button2 := TButton.Create(self);  
    Button2.Parent := self;  
end;


covel - Mi 29.03.06 21:11


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    pnl_lab: TPanel;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);

  private

  public

  end;

  type TMypanel=class(TPanel)
    Button1: TButton;
    Button2: TButton;
    constructor Create(AWwner: TObject); override;  // Deklaration von 'Create' unterscheidet sich von vorheriger Deklaration
                                                 
  end;

var
  Form1: TForm1;
  test: Tbutton;

MyPanel : TMyPanel;

implementation
constructor TMyPanel.Create( AWwner: TObject);        Deklaration von 'Create' unterscheidet sich von vorheriger Deklaration
begin
 // inherited; // <<-------------- MÖÖÖP
    Owner := AOwner;
    Parent := AOwner;
    Button1 := TButton.Create(self);
    Button1.Parent := self;
    Button2 := TButton.Create(self);
    Button2.Parent := self;
end;
{$R *.dfm}


procedure TForm1.Button2Click(Sender: TObject);

begin
  {MyPanel:=TMyPanel.Create;
  with MyPanel do
  begin
    top:=100;
    left:=100;
    width:=100;
    height:=100;
    visible:= true;
  end;  }


end;

end.



constructor TMyPanel.Create( AWwner: TObject); AWner oder AOwner

komme einfach nicht weiter daher habe ich mal den ganzen Quelltext gepostet


Waldheini - Mi 29.03.06 22:42

Entschuldige, habe nicht richtig gelesen und die Fehler mitgepostet, richtig ist natürlich:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
unit Unit1;  

 
interface  

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

 
type  
  TForm1 = class(TForm)  
    Button1: TButton;  
    pnl_lab: TPanel;  
    Button2: TButton;  
    procedure Button2Click(Sender: TObject);  

 
  private  

 
  public  

 
  end;  

 
  type TMypanel=class(TPanel)  
    Button1: TButton;  
    Button2: TButton;  
    constructor Create(AOwner: TComponent); override;  // AWwner war hier der Fehler, und der Typ ist TComponent, nicht TObject
                                                   
  end;  

 
var  
  Form1: TForm1;  
  test: Tbutton;  

 
MyPanel : TMyPanel;  

 
implementation  
constructor TMyPanel.Create( AOwner: TComponent);   // hier war auch AWwner falsch und der Typ
begin  
    inherited Create(AOwner) // Das muß bleiben, um den überschriebenen Constructor der Klasse aufzurufen! 
    Owner := AOwner;  
    Parent := AOwner;  
// hier solltest Du die Variable AOwner benutzen und nicht Self
    Button1 := TButton.Create(AOwner);  
    Button1.Parent := AOwner;  
    Button2 := TButton.Create(AOwner);  
    Button2.Parent := AOwner;  
end;  
{$R *.dfm}  

 

 
procedure TForm1.Button2Click(Sender: TObject);  

 
begin  
  {MyPanel:=TMyPanel.Create;  
  with MyPanel do  
  begin  
    top:=100;  
    left:=100;  
    width:=100;  
    height:=100;  
    visible:= true;  
  end;  }
  

 
end;  

 
end.


AOwner ist der Variablenname und vom Typ TComponent bei Create. Normalerweise kannst Du die Variablennamen selber wählen, nur eben nicht dort, wo Du Dich auf Methoden des Vorgängers beziehst, wie hier Create, ebenso muß der Typ identisch sein.


JayEff - Mi 29.03.06 22:47


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
constructor TMyPanel.Create({aWwner?! aOwner meinste wohl!} AWwner: TObject); //<-- MÖÖÖÖÖÖÖÖÖÖHÖHÖHÖHÖHÖÖÖP!!!!
begin     
  inherited Create(Self);    
    Owner := AOwner;   //<-- so wie eben hier!  
    Parent := AOwner;     
    Button1 := TButton.Create(self);     
    Button1.Parent := self;     
    Button2 := TButton.Create(self);     
    Button2.Parent := self;     
end;

DREIFACHMÖP! *mist zu spät..*


covel - Do 30.03.06 08:45

Es sind immer noch ein paar fehler drin



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
constructor TMyPanel.Create( AOwner: TComponent);    //TCompenent  oder TObject?????
begin
    inherited// <<-------------- MÖÖÖP
    Owner := AOwner;                 //Fehler:Einer Nur-Lesen Eigenschaft kann kein Wert zugewiesen werden
    Parent := AOwner;                //Fehler:Inkompatible Typen: 'TWinControl' und 'TComponent'
    Button1 := TButton.Create(self);
    Button1.Parent := self;
    Button2 := TButton.Create(self);
    Button2.Parent := self;
end;


Kroko - Do 30.03.06 10:59


Delphi-Quelltext
1:
constructor TMyPanel.Create( AOwner: TComponent);    //TCompenent  oder TObject?????                    
sieh einmal in der Hilfe nach TPanel+F1 und create :wink: (TComponent ist richtig)

Delphi-Quelltext
1:
2:
begin
    inherited Create (Self);

setzt die Owner-Eigenschaft

Delphi-Quelltext
1:
    Owner := AOwner;                 //Fehler:Einer Nur-Lesen Eigenschaft kann kein Wert zugewiesen werden                    
fällt dann weg!

Delphi-Quelltext
1:
    Parent := AOwner;                //Fehler:Inkompatible Typen: 'TWinControl' und 'TComponent'                    
würde ich von außen setzen, wenn schon in der Klasse dann

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
   Parent := TWinControl(AOwner);
   Button1 := TButton.Create(self);
   Button1.Parent := self;
   Button2 := TButton.Create(self);
   Button2.Parent := self;
end;

Ich glaube mal Einrückung gleich 2 reicht aus!