Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 19:53
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;
Miniaturansicht angehängter Grafiken
raster.png  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat