Hallo.
Ich möchte eine Komponente ableiten, sie jedoch bezüglich des Parents in ein Panel zeichnen. Das eigentliche Objekt soll also in einem Panel liegen, das zwischengeschaltet ist. Eine Wrapper-Klasse möchte ich nicht verwenden, da alle Dinge, die ich benötige direkt abgeleitet werden sollen. Ansonsten würde z.B. die Schreibarbeit zum Einen ins unendliche gehen, zum Anderen gäbe es dann keine IS-A-Beziehung mehr.
Ich habe folgenden Code geschrieben, jedoch erhalte ich im Create-Teil stets eine
AV. Was ist da falsch?
Delphi-Quellcode:
type
TPaneledImage = class(TImage)
private
FPanel: TPanel;
FParent: TWinControl;
FVisible: boolean;
procedure SetVisible(Value: boolean);
protected
procedure SetParent(AParent: TWinControl); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Parent: TWinControl read FParent write SetParent;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
property Visible: boolean read FVisible write SetVisible;
end;
constructor TPaneledImage.Create(AOwner: TComponent);
begin
FPanel := TPanel.Create(AOwner);
inherited Create(FPanel);
// Eigenschaften für das Image im Panel festlegen
Parent := FPanel;
Align := alClient;
Visible := true;
end;
destructor TPaneledImage.Destroy;
begin
FPanel.Free; // OK?
inherited;
end;
procedure TPaneledImage.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
// Das Image im Panel soll bei (0, 0) bleiben. Nur das Panel bewegt sich.
inherited SetBounds(0, 0, AWidth, AHeight);
FParent.Left := ALeft;
FParent.Top := ATop;
FParent.Width := AWidth;
FParent.Height := AHeight;
end;
procedure TPaneledImage.SetParent(AParent: TWinControl);
begin
if FParent <> AParent then
begin
FParent := AParent;
FPanel.Parent := AParent;
end;
inherited SetParent(FPanel);
// inherited Parent := FPanel;
end;
procedure TPaneledImage.SetVisible(Value: boolean);
begin
if FVisible <> Value then
begin
FVisible := Value;
FPanel.Visible := Value;
end;
end;
Gruß
blackdrake