Property zu einem bestehenden Objekt hinzufügen?
spacer
Autor Nachricht
GR-Thunderstorm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 198



BeitragVerfasst: Mo 02.01.12 20:41 
Auf meiner Form verwende ich mehrere TImages. Diese Images möchte ich anhand von Arrays zeichnen, die jeweils Bestandteil der Komponente sein sollen.

Meine bisherige Idee war es, eine eigene Klasse auf Grundlage von TImage zu erstellen und in dieser dann ein entsprechendes Property einzufügen. Aber wie genau kann ich das dann auf meiner Form verwenden? Ich habe im Texteditor der Form die Klassenbezeichner meiner Objekte entsprechend abgewandelt, aber dann kommt die Meldung, dass meine Klasse nicht gefunden werden kann und er entfernt die entsprechende Deklaration.

Am liebsten würde ich TImage so abändern, dass ich noch eine Variant-Variable hinzufüge und diese dann als variables Array gebrauche.


Hat jemand hierzu eine Lösung parat?


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 02.01.2012 um 20:33
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 8118
Erhaltene Danke: 251

Win XP, Win 7
D7 PE, RAD Studio 2009 Professional
BeitragVerfasst: Mo 02.01.12 21:18 
Wenn du das "erweiterte TImage" im Formeditor verwenden willst, musst du eine neue Komponente schreiben und diese auch installieren. Dieses Tutorial im Delphi-Treff sollte das erklären. :)

_________________
Oel ngati kameie.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 198



BeitragVerfasst: Fr 06.01.12 15:39 
Das kann ich so leider nicht machen, da ich ein Programm für meinen Professor schreibe und er muss den Code ohne weiteres kompilieren können.
Ich habe mich also entschlossen, eine neue Klasse zu erstellen:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
type TSpecimen = class(TImage)
private
Feld: Variant;
procedure FeldWrite(Value: Variant);

public
constructor Create(AOwner: TComponent); override;

property PixArray : Variant read Feld write FeldWrite;
end;

implementation

constructor TSpecimen.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
self.Parent:= inherited Parent;
end;

procedure TSpecimen.FeldWrite(Value: Variant);
begin
self.Feld:=Value;

end;


Ich erzeuge die entsprechenden Komponenten zur Laufzeit durch...

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type TForm1 = class(TForm)
K1: TPanel;
K2: TPanel;
K3: TPanel;
procedure FormCreate(Sender: TObject);
end;
var KC: array[1..3] of TImage;

implementation

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
for i:=1 to 3 do
begin
KC[i]:=TSpecimen.Create(FindComponent('K'+IntToStr(i)) as TPanel);
end;
end;



Mein Problem: Meine TSpecimen haben allesamt Parent = nil!
Wie kann das sein? Habe ich einen Fehler beim Constructor gemacht oder muss ich extra die Parent-Propertys separat eingeben?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 8118
Erhaltene Danke: 251

Win XP, Win 7
D7 PE, RAD Studio 2009 Professional
BeitragVerfasst: Fr 06.01.12 15:44 
Du gibst im Create ja nur den Owner an. Das ist die Komponente, die hinterher fürs Aufräumen zuständig ist. Das Parent (also die Komponente, auf der das angezeigt wird) muss nach dem Constructor zusätzlich gesetzt werden.

D.h.
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
constructor TSpecimen.Create(AOwner: TComponent);
begin
inherited Create(AOwner); // Parent ist noch NIL, auch das "inherited Parent" (was immer das auch sein soll ;-) )
self.Parent:= inherited Parent; // Parent ist immer noch NIL, weil hier Parent := Parent gesetzt wird.
end;

_________________
Oel ngati kameie.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 198



BeitragVerfasst: Fr 06.01.12 18:45 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Du gibst im Create ja nur den Owner an. Das ist die Komponente, die hinterher fürs Aufräumen zuständig ist. Das Parent (also die Komponente, auf der das angezeigt wird) muss nach dem Constructor zusätzlich gesetzt werden.

D.h.
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
constructor TSpecimen.Create(AOwner: TComponent);
begin
inherited Create(AOwner); // Parent ist noch NIL, auch das "inherited Parent" (was immer das auch sein soll ;-) )
self.Parent:= inherited Parent; // Parent ist immer noch NIL, weil hier Parent := Parent gesetzt wird.
end;


Stimmt, ich dachte immer, AOwner wird bei vorinstallierten Komponenten automatisch zu Parent. Hab schon zu lange nix mehr zur Laufzeit erstellen lassen. ^^
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home