![]() |
Komponente Image Designtime zeichnen
Hi,
ich würde gern zur Designtime der neuen Komponente den gesamten Canvas vom Image so zeichnen, wie bei csDesigning angegeben, bekomme ich aber nicht gebacken. Picture und Bitmap und Graphic habe ich erfolglos versucht. Hat jemand einen Tipp? 10.1
Delphi-Quellcode:
unit DelphiPaxisTest;
interface uses System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.Graphics; type TDelphiPaxisTest = class(TImage) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } end; procedure Register; implementation constructor TDelphiPaxisTest.Create(AOwner: TComponent); begin inherited Create(AOwner); if csDesigning in ComponentState then begin Canvas.Pen.Color := clGray; Canvas.Brush.Color:= clWhite; Canvas.Brush.Style:= bsSolid; Canvas.Rectangle(0, 0, Width, Height); end else begin //passt schon end; end; destructor TDelphiPaxisTest.Destroy; begin inherited; end; procedure Register; begin RegisterComponents('Samples', [TDelphiPaxisTest]); end; end. |
AW: Komponente Image Designtime zeichnen
Du mußt diesen ComponentState beim Owner prüfen (wenn es ihn gibt).
Deine Komponente wird "hier" gerade erst erstellt ... wie sollte da jemand jetzt schon diese Eigenschaft gesetzt haben? (nein, es gibt im TObject/TComponent.Create keinen Code dafür und, wie bei TForm, wird vom Formdesigner das Objekt auch nicht erstellt, bevor Create ausgeführt wird) Auf den Canvas zu malen ist dort eh falsch, weil erst nach dem Create der Parent zugewiesen wird, also erst da wird erstmalig wirklich gezeichnet. Und beim nächsten Repaint ist dein dort Gemaltes sowieso wieder weg. Bitmap.Canvas oder und das Bitmä vorher auf passende Größe sezten. Dann beim Resize erneut malen. Oder notfals im (ersten) OnPaint Paint malen. ODER, so wie es nahezu jede andere Komponete macht, also im OnPaint Paint bei csDesigning immer das Alternative "wirklich" auf direkt den Canvas malen (inherited womöglich nicht ausführen). PS: Deine Komponente zu debggen, oder zumindestens ein ShowMessage in das IF (oder Loggen oder den Zustand in Published-Property speichern), hätte dir gezeigt, daß dein Code dort niemals ausgeführt wurde. |
AW: Komponente Image Designtime zeichnen
Warum nicht einfach
Code:
Gruß DBR
constructor TDelphiPaxisTest.Create(AOwner: TComponent);
begin inherited Create(AOwner); Canvas.Pen.Color := clGray; Canvas.Brush.Color := clWhite; Canvas.Brush.Style := bsSolid; Canvas.Rectangle(0, 0, Width, Height); end; |
AW: Komponente Image Designtime zeichnen
Deine Zeichenroutine gehört nicht ins Create, sondern ins Paint der Komponente. Dazu musst du die Paint Methode überschreiben:
Delphi-Quellcode:
unit DelphiPaxisTest;
interface uses System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.Graphics; type TDelphiPaxisTest = class(TImage) private { Private-Deklarationen } protected { Protected-Deklarationen } procedure Paint; override; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } end; procedure Register; implementation constructor TDelphiPaxisTest.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TDelphiPaxisTest.Destroy; begin inherited; end; procedure TDelphiPaxisTest.Paint; begin inherited; if csDesigning in ComponentState then begin Canvas.Pen.Color := clGray; Canvas.Brush.Color:= clWhite; Canvas.Brush.Style:= bsSolid; Canvas.Rectangle(0, 0, Width, Height); end else begin //passt schon end; end; procedure Register; begin RegisterComponents('Samples', [TDelphiPaxisTest]); end; end. |
AW: Komponente Image Designtime zeichnen
Zitat:
Mit der Ausnahme, dass es sich hier um ein TImage handelt und man im Create natürlich auf das interne Bitmap malen kann, auch wenn beim Resize es vermutlich neu gezeichnet werden sollte. Also ja, im Paint ist es einfach und man braucht es dann nur an der Stelle. -> zur Laufzeit normal und im Designer was Alternatives. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 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