Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Canvas ändern? (https://www.delphipraxis.net/96287-canvas-aendern.html)

Martin K 21. Jul 2007 17:05


Canvas ändern?
 
Hi,
mein Problem ist folgendes:
Ich will die Canvas um ein paar nützliche Funktionen erweitern und diese dann bei meiner Form verwenden können.
Doch das funzt leider nicht, es kommt immer folgende Exception, wenn ich auf die Canvas zugreifen will:
Zitat:

Bild/Leinwand erlaubt kein Zeichnen.
So sieht meine Unit aus (vereinfacht):
Delphi-Quellcode:
unit MyUnit;

interface

uses
  {...}

type
  TMyCanvas = class(TCanvas)
    {...}
  end;

  TMyForm = class(TForm)
    {...}
    procedure DoSomething;
  private
    ACanvas: TMyCanvas;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Canvas: TMyCanvas read ACanvas write ACanvas;
  end;

var
  MyForm: TMyForm;

implementation

{$R *.dfm}

constructor TMyForm.Create(AOwner: TComponent);
begin
  inherited;
  ACanvas := TMyCanvas.Create;
end;

destructor TMyForm.Destroy;
begin
  ACanvas.Free;
  inherited;
end;

procedure TMyForm.DoSomething;
begin
  Canvas.MoveTo(0, 0); // hier krachts
end;

end.
Meine Frage ist nun:
Warum gibt es diese Exception und wie kann ich es ändern damit es klappt?

KrasserChecker 21. Jul 2007 17:56

Re: Canvas ändern?
 
Weil dein Canvas gar nicht weiß, wo er hinzeichnen soll. Damit das funktioniert mußt Du ihn noch mit dem Formular "verbinden":

Delphi-Quellcode:
constructor TMyForm.Create(AOwner: TComponent);
begin
  inherited;
  ACanvas := TMyCanvas.Create;

  ACanvas.Handle := Canvas.Handle; // <- Das hier fehlt noch
end;
Ach: Damit das auch wirklich funktioniert solltest Du deinen eigenen Canvas nicht per Eigenschaft "Canvas" bereitstellen, da Du dait eine bereits bestehende Eigenschaft überdeckst. Nenne deine Eigenschaft lieber "AdvancedCanvas" oder so.

Martin K 21. Jul 2007 18:07

Re: Canvas ändern?
 
Thx, so gehts!
Da ich aber die alte Canvas ersetzen wollte, bleibe ich bei der normalen Canvas-Eigenschaft.
Dabei fiel mir dann aber auf, das folgendes noch beachtet werden muss (bei Überschreiben der Canvas-Eigenschaft):
Delphi-Quellcode:
constructor TMyForm.Create(AOwner: TComponent);
begin
  inherited;
  ACanvas := TMyCanvas.Create;

  ACanvas.Handle := inherited Canvas.Handle; // <- Das hier fehlt noch
end;
Denn ohne inherited greife ich ja schon auf meine neue Canvas-Eigenschaft zu ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz