AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Komponente Image Designtime zeichnen
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente Image Designtime zeichnen

Ein Thema von Sender · begonnen am 6. Aug 2022 · letzter Beitrag vom 15. Aug 2022
Antwort Antwort
Sender

Registriert seit: 25. Nov 2008
2 Beiträge
 
Delphi 2009 Professional
 
#1

Komponente Image Designtime zeichnen

  Alt 6. Aug 2022, 00:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#2

AW: Komponente Image Designtime zeichnen

  Alt 6. Aug 2022, 07:53
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 6. Aug 2022 um 08:02 Uhr)
  Mit Zitat antworten Zitat
DBR

Registriert seit: 19. Jul 2005
38 Beiträge
 
#3

AW: Komponente Image Designtime zeichnen

  Alt 14. Aug 2022, 12:12
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
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Komponente Image Designtime zeichnen

  Alt 15. Aug 2022, 15:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#5

AW: Komponente Image Designtime zeichnen

  Alt 15. Aug 2022, 15:48
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:39 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