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 Formular Ableiten (https://www.delphipraxis.net/99058-formular-ableiten.html)

Hammer 6. Sep 2007 07:49


Formular Ableiten
 
Hallo

Ich habe ein Formular TMyForm von TForm abgeleitet. Dabei Überschreibe ich die Funktion Paint um dem Formular zur Laufzeit ein "Spezielles" Aussehen (Hintergrund) zu verleihen. Nun würde ich gerne TMyForm dahingehend erweitern dass ich bereits zu DesignTime also in der IDE sehe wie das Form dann zur laufzeit aussehen wird. Wie wenn ich die Eingenschaft Color usw. ändere ist dies ja in der IDE auch zu sehen.

Grüsse Adrian

uligerhardt 6. Sep 2007 08:20

Re: Formular Ableiten
 
Schau mal hier.

HTH,
Uli.

Hammer 6. Sep 2007 08:37

Re: Formular Ableiten
 
1. Danke

2. Habe ich mich wohl zu wenig genau ausgedrückt.
Eine neue Eigenschaft für TMyForm zu erstellen ist nicht mein Wunsch.

Ich möchte die Überschriebene Funktion "Paint" welche zur Laufzeit das aussehen des Formulars ändert auch zur DesignTime ausführen.

Phoenix 6. Sep 2007 08:45

Re: Formular Ableiten
 
Das sollte sie normalerweise automatisch tun.
Ausser natürlich, du fragst vor dem Zeichnen den ComponentState auf not csDesigning ab...

uligerhardt 6. Sep 2007 09:11

Re: Formular Ableiten
 
Zitat:

Zitat von Hammer
2. Habe ich mich wohl zu wenig genau ausgedrückt.
Eine neue Eigenschaft für TMyForm zu erstellen ist nicht mein Wunsch.

Dann lass den Teil mit NewProperty weg. :)

Zitat:

Zitat von Hammer
Ich möchte die Überschriebene Funktion "Paint" welche zur Laufzeit das aussehen des Formulars ändert auch zur DesignTime ausführen.

Und dafür muss die IDE ja irgendwie an deinen compilierten Paint-Code rankommen. Das riecht für mich nach Designtime-Package und irgendeiner Register...-Routine. Ob der Kram mit dem ModuleCreator notwendig ist, weiß ich nicht. Du kannst ja mal ein Minimal-Package ausschließlich mit dem RegisterCustomModule-Aufruf ausprobieren.

Zitat:

Zitat von Phoenix
Das sollte sie normalerweise automatisch tun.
Ausser natürlich, du fragst vor dem Zeichnen den ComponentState auf not csDesigning ab...

Kann ich mir nicht vorstellen. Die IDE führt AFAIK nur Code aus, der bei ihr durch ein Designtime-Package o.ä. registriert wurde.

Phoenix 6. Sep 2007 09:26

Re: Formular Ableiten
 
Zitat:

Zitat von uligerhardt
Zitat:

Zitat von Phoenix
Das sollte sie normalerweise automatisch tun.
Ausser natürlich, du fragst vor dem Zeichnen den ComponentState auf not csDesigning ab...

Kann ich mir nicht vorstellen. Die IDE führt AFAIK nur Code aus, der bei ihr durch ein Designtime-Package o.ä. registriert wurde.

Ich ging eigentlich davon aus, dass das Form in einem Package ist - sonst hätte er es ja auch gar nicht bei Datei->Neu->Formular registrieren können...

Oder hat er das gar nicht? :gruebel:

uligerhardt 6. Sep 2007 10:06

Re: Formular Ableiten
 
Zitat:

Zitat von Phoenix
Ich ging eigentlich davon aus, dass das Form in einem Package ist - sonst hätte er es ja auch gar nicht bei Datei->Neu->Formular registrieren können...

Da könntest du natürlich recht haben. :shock:

Zitat:

Zitat von Phoenix
Oder hat er das gar nicht? :gruebel:

Wir werden sehen. :)

Hammer 7. Sep 2007 14:17

Re: Formular Ableiten
 
Das Form ist nun in einem Package.

Aber wo kann ich den Code zum Zeichnen meines Formulars innerhalb der IDE aufrufen. (Sie tut das bei mir nicht selbst?!?)

Wenn ich Paint beim setzen der Eigenschaft NewProperty (aus dem Beispiel) aufrufe wird das Form auch richtig gezeichnet.



Wo krieg ich die Höhe und Breite des Formulars her ohne Titelleiste.

Grüsse
Adrian

Hammer 7. Sep 2007 14:39

Re: Formular Ableiten
 
Ich glaub ich hab das was gefunden.
Ich zeichne jetzt meine Formular in der IDE über WMPaint :

Delphi-Quellcode:
nit DescendantForm;

type
  TCustomNewDescendantForm = class(TForm)
  private
    procedure WMPaint(var msg: TWMPaint); message WM_PAINT;
  protected
    procedure Paint; override;
  end;

implementation

procedure TCustomNewDescendantForm.WMPaint(var msg: TWMPaint);
begin
   Inherited ;
   Paint;
end;
so gehts.

Die Grösse der zu nuzbaren Formular Fläche habe ich aber noch nicht gerausgefunden...

Grüsse
Adrian

uligerhardt 7. Sep 2007 14:49

Re: Formular Ableiten
 
Zitat:

Zitat von Hammer
Ich glaub ich hab das was gefunden.
Ich zeichne jetzt meine Formular in der IDE über WMPaint :

Schräg. Aber wenn's so funktioniert. :)

Zitat:

Zitat von Hammer
Die Grösse der zu nuzbaren Formular Fläche habe ich aber noch nicht gerausgefunden...

Meinst Du Form1.ClientRect?

Hammer 7. Sep 2007 15:01

Re: Formular Ableiten
 
Zitat:

Zitat von uligerhardt
Schräg. Aber wenn's so funktioniert. :)

Falls jemand ne bessere Idee als WMPaint hat, ich nehme jede Hilfe an.

Zitat:

Zitat von uligerhardt
Meinst Du Form1.ClientRect?

Für die Height, Width kann einfach ClientHeight und ClientWidth verwendet werden. (Hey nicht lachen... habe ich diese Eingeschaften schon mal gebraucht....)

Ein kleines Problem habe ich aber noch beim Zeichnen wird die Grösse des Formulars verändert wird nicht immer ganz sauber gezeichnet.


Grüsse
Adrian

Hammer 7. Sep 2007 15:14

Re: Formular Ableiten
 
Das Problem beim der Formulargrössenänderung lässt sich mit dem Überschreiben von
procedure Resizing(State: TWindowState); override;
und einem Refresh lösen.

Grüsse
Adrian

Hammer 10. Sep 2007 10:39

Re: Formular Ableiten
 
Hallo

Hier mein Aktueller Code, hat jemand noch ne idee denn das WMPaint scheint mir nicht Optimal zu sein.
Beim Anklicken von Kombos auf dem Form gibts Grafik Fehler und das Form wird nicht richtig gezeichnet!

Bin um jede Hilfe dankbar...

Grüsse
Adrian


Delphi-Quellcode:
unit DescendantForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;


type

  TCustomNewDescendantForm = class(TForm)
  private
    fContentWindow : Boolean ;
    procedure SetContentWindow(const Value: Boolean);
    procedure WMPaint(var msg: TWMPaint); message WM_PAINT;
  protected
    procedure Paint; override;
    procedure Resizing(State: TWindowState); override;
    property ContentWindow : Boolean  read fContentWindow  write SetContentWindow;
  public
    constructor Create(aOwner: TComponent); override;
    destructor Destroy; override ;
  end;
 
  TNewDescendantForm = class(TCustomNewDescendantForm)
  published
    property ContentWindow : Boolean  read fContentWindow  write SetContentWindow;
    property OnPaint;
    property OnResize;
  end;

implementation

{ TCustomNewDescendantForm }

constructor TCustomNewDescendantForm.Create(aOwner: TComponent);
begin
  Inherited;
end;

destructor TCustomNewDescendantForm.Destroy;
begin
  Inherited;
end;

procedure TCustomNewDescendantForm.Paint;
var xPoint1 : TPoint ;
    xRect1 : TRect ;
begin
  Color := clWhite ;
 
  aRect1.Left := 0 ;
  aRect1.Top := 0 ;
  aRect1.Bottom := ClientHeight ;
  aRect1.Right := ClientWidth ;
  Canvas.Brush.Color:= clWhite ;
  Canvas.FillRect( aRect1 ) ;

  Canvas.Pen.Color := clBlack ;
  Canvas.RoundRect(2, 2, ClientWidth - 2, ClientHeight - 2, 20, 20);

  aPoint1.X := 2 ;
  aPoint1.Y := 100 ;
  Canvas.Pen.Color := clBlack ; ;
  Canvas.PenPos := aPoint1 ;
  Canvas.LineTo(ClientWidth - 2 , 100) ;

  Canvas.Brush.Color:= clRed ; ;
  Canvas.FloodFill(10,10,clWhite,fsSurface) ;
end;

procedure TCustomNewDescendantForm.Resizing(State: TWindowState);
begin
  Refresh;
  Inherited;
end;

procedure TCustomNewDescendantForm.SetContentWindow(const Value: Boolean);
begin
  fContentWindow := Value ;
end;

procedure TCustomNewDescendantForm.WMPaint(var msg: TWMPaint);
begin
  Inherited ;
  Paint;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 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