Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Komponente Image Designtime zeichnen (https://www.delphipraxis.net/211167-komponente-image-designtime-zeichnen.html)

Sender 6. Aug 2022 00:35

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.

himitsu 6. Aug 2022 07:53

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.

DBR 14. Aug 2022 12:12

AW: Komponente Image Designtime zeichnen
 
Warum nicht einfach

Code:
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;
Gruß DBR

Rolf Frei 15. Aug 2022 15:06

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.

himitsu 15. Aug 2022 15:48

AW: Komponente Image Designtime zeichnen
 
Zitat:

Zitat von Rolf Frei (Beitrag 1510164)
Deine Zeichenroutine gehört nicht ins Create, sondern ins Paint der Komponente.

Im Prinzip hast'e Recht, so wie es bereits gesagt wurde.

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 14:45 Uhr.

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