Autor Beitrag
GR-Thunderstorm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 02.01.12 19: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
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 sollte das erklären. :)

_________________
We are, we were and will not be.
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



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

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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.
ausblenden 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;

_________________
We are, we were and will not be.
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: 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.
ausblenden 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. ^^