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
covel 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
mkinzler 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
mkinzler 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
raziel: 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; 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
raziel: 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
F34r0fTh3D4rk 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; 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; 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; end;
var Form1: TForm1; test: Tbutton;
MyPanel : TMyPanel;
implementation constructor TMyPanel.Create( AWwner: TObject); Deklaration von 'Create' unterscheidet sich von vorheriger Deklaration begin 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
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; end;
var Form1: TForm1; test: Tbutton;
MyPanel : TMyPanel;
implementation constructor TMyPanel.Create( AOwner: TComponent); begin inherited Create(AOwner) Owner := AOwner; Parent := AOwner; Button1 := TButton.Create(AOwner); Button1.Parent := AOwner; Button2 := TButton.Create(AOwner); Button2.Parent := AOwner; end; {$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
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: TObject); begin inherited Create(Self); Owner := AOwner; 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); begin inherited; Owner := AOwner; Parent := AOwner; 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); |
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
fällt dann weg!
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!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!