Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Property zu einem bestehenden Objekt hinzufügen?


GR-Thunderstorm - Mo 02.01.12 19:41
Titel: Property zu einem bestehenden Objekt hinzufügen?
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


Gausi - Mo 02.01.12 20: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 [http://www.delphi-treff.de/tutorials/vcl/komponenten-entwicklen] sollte das erklären. :)


GR-Thunderstorm - Fr 06.01.12 14: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:


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:
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...


Delphi-Quelltext
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..3of 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?


Gausi - Fr 06.01.12 14: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.

Delphi-Quelltext
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;


GR-Thunderstorm - Fr 06.01.12 17: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.

Delphi-Quelltext
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. ^^