Was verstehe ich denn jetzt nicht? Im Constructor wird doch der Owner gesetzt, nicht der Parent?
Versuch mal, die Parent-Zuweisung auszuklammern und zur Laufzeit zuzuweisen, nachdem der Constructor komplett durchgelaufen ist...
(Ich bin nicht sicher, aber vielleicht ist die Zuweisung zu früh.)
Alternativ kannst Du doch die Zeichnen-Funktion einfach abbrechen, wenn Width oder Height 0 sind.
Delphi-Quellcode:
procedure Zeichnen;
begin
if (Width = 0) or (Height = 0) then
Exit;
...
end;
Ich habe mir für ähnliche Zwecke eine TRaster erstellt. Diese liegt über einem "Designer" (TScrollBox). Sie ist transparent und Maustransparent, zeichnet ein Punkteraster und kann Laserlines für ein auf dem Designer selektiertes Objekt zeichnen. Vielleicht nützt Dir das ja als Anregung...
Delphi-Quellcode:
TRaster = class(TPaintBox)
private
FLaserControl: TControl;
procedure SetLaserControl(const Value: TControl);
protected
procedure CMHitTest(var Msg: TWMMouse); message CM_HITTEST;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Paint; override;
function Designer: TodDesigner; virtual;
property LaserControl: TControl read FLaserControl write SetLaserControl;
end;
{ TRaster }
procedure TRaster.CMHitTest(var Msg: TWMMouse);
begin
inherited;
Msg.Result := 0;
end;
constructor TRaster.Create(AOwner: TComponent);
begin
inherited;
end;
function TRaster.Designer: TodDesigner;
begin
if Owner is TodDesigner then
Result := (Owner as TodDesigner)
else
Result := nil;
end;
destructor TRaster.Destroy;
begin
inherited;
end;
procedure TRaster.Paint;
var
odDesigner: TodDesigner;
X, Y: Integer;
mi, ma: Integer;
begin
inherited;
if Owner is TodDesigner then
begin
odDesigner := (Owner as TodDesigner);
if (odDesigner.ShowRasterX > 1) and (odDesigner.ShowRasterY > 1) then
with Canvas do
begin
if (LaserControl <> nil) and (Designer <> nil) then
begin
ma := 1;
mi := 0;
Pen.Color := clSkyBlue;
MoveTo(0, Designer.VertScrollBar.Position + LaserControl.Top - ma);
LineTo(Width, Designer.VertScrollBar.Position + LaserControl.Top - ma);
MoveTo(0, Designer.VertScrollBar.Position + LaserControl.Top + LaserControl.Height - mi);
LineTo(Width, Designer.VertScrollBar.Position + LaserControl.Top + LaserControl.Height - mi);
MoveTo(Designer.HorzScrollBar.Position + LaserControl.Left - ma, 0);
LineTo(Designer.HorzScrollBar.Position + LaserControl.Left - ma, Height);
MoveTo(Designer.HorzScrollBar.Position + LaserControl.Left + LaserControl.Width - mi, 0);
LineTo(Designer.HorzScrollBar.Position + LaserControl.Left + LaserControl.Width - mi, Height);
Pen.Color := clBlack;
end;
Y := odDesigner.RasterFrame + odDesigner.RasterYDif;
while Y < Height do
begin
X := odDesigner.RasterFrame + odDesigner.RasterXDif;
while X < Width do
begin
Pixels[X, Y] := clGray;
Inc(X, odDesigner.ShowRasterX);
end;
Inc(Y, odDesigner.ShowRasterY);
end;
end;
end;
end;
procedure TRaster.SetLaserControl(const Value: TControl);
begin
if FLaserControl <> Value then
begin
FLaserControl := Value;
Refresh;
end;
end;