Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 Events zur Designtime (https://www.delphipraxis.net/110184-events-zur-designtime.html)

Medium 14. Mär 2008 10:26


Events zur Designtime
 
Moinmoin!

Gibt es eine Möglichkeit die IDE dazu zu überreden, dass Events wie MouseMove oder MouseDown zur Designtime an eine von TCustomControl abgeleitete Komponente zu übergeben? Es dürfen auch gerne schmutzige Tricks sein, aber ich würde es schon recht dringend brauchen (nicht im Sinne von "sofort jetzt" sondern von "ich brauchs echt"). Es geht um Delphi 7 Ent.

Besten Dank schonmal,
Das Medium

mkinzler 14. Mär 2008 10:49

Re: Events zur Designtime
 
Warum brauchst du das zur Entwurfszeit?

Medium 14. Mär 2008 10:59

Re: Events zur Designtime
 
Ich erstelle eine ganze Reihe von Prozessabbildern, und in diesen sind eine Fülle sehr unterschiedlich gestalteter Elemente. Für all diese jeweils eine völlig eigene Komponente zu entwickeln, bzw. immer diese zu erweitern wäre nah an Folter. Was all die Elemente gemein haben ist, dass sie sich wunderbar über einen Polygonzug realisieren ließen, und dessen Ecken will ich zur Entwurfszeit umherschubsen können. Weil wenn ich die Koordinaten im Code erst setzte, könnte ich gleich die Kompos bauen. Zudem wäre es dann mehr als schwierig zu bearbeiten.

stahli 14. Mär 2008 11:39

Re: Events zur Designtime
 
Hallo Medium,

ich weiß nicht, ob ich Dich richtig verstehe... Du könntest die entsprechende Behandlung direkt in der Klasse definieren, dann funktioniert das grundsätzlich auch zur Designtime

Delphi-Quellcode:
  protected
    procedure MouseDown(Button:TMouseButton;Shift:TShiftState;X,Y:Integer); override;
    ...

procedure TXyz.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited;
  SysUtils.Beep;
end;
Jetzt sollte die Kompo auch in der IDE klingeln, wenn Du sie anklickst.

Die Komponenten reagieren allerdings in der IDE anders als zur Laufzeit. Schau Dir dazu mal ComponentState und evtl. ComponentStyle an...

stahli

Medium 14. Mär 2008 11:53

Re: Events zur Designtime
 
Funktioniert leider nur zur Laufzeit. Was mich überhaupt dazu gebracht hat, dass das irgendwie gehen muss ist: Ich hab in den bereits bestehenden Komponenten einen TTimer, der das Element auf Wunsch blinken lässt. Und es blinkt auch zur Entwurfszeit, wenn ich es nicht selbst mit Hilfe von ComponentState unterbinde. Da TTimer prinzipiell über eine Fenstermsg arbeitet, sollte das an und für sich nun kein Problem sein, aber ich hab es bisher nicht geschafft Maus-Events zu erhalten.

Medium 14. Mär 2008 13:32

Re: Events zur Designtime
 
Ich hab glaub ich einen Weg gefunden, und ja, er ist ausgesprochen schmutzig :twisted:

Ich erzeuge nun in meiner Komponente ein neues TForm. Dieses erhält auch im Designer alle Messages, und ich kann damit tun was ich mag. Zur Runtime kann es dann ja weg bleiben.

sirius 14. Mär 2008 13:36

Re: Events zur Designtime
 
Und genauso wie du das mit einem TForm amchst, kannst du das auch mit einem TcustomControl machen.

stahli 14. Mär 2008 13:40

Re: Events zur Designtime
 
Zitat:

Zitat von Medium
und ja, er ist ausgesprochen schmutzig

Da bist Du auch noch stolz drauf? ;-)

Ich kann mir nicht so recht vorstellen, was Du da machst. Wozu brauchst Du ein DummyForm?
Mal ein stückl Code...?

Meinen Vorschlag von oben kann ich heute Abend mal testen. Hätte gedacht, dass das funktioniert.

stahli

Medium 14. Mär 2008 13:43

Re: Events zur Designtime
 
Wahrscheinlich, ja. Der Kniff dabei ist nur, dass ich keine Messages für die Komponente an und für sich empfange. Bette ich darin aber ein weiteres Control ein, entzieht sich dieses der Sonderbehandlung durch die IDE, und man kann alles damit machen wie zur Laufzeit. Einfaches Überschreiben der Eventhandler der Komponente selbst ging leider nicht.

Medium 14. Mär 2008 13:50

Re: Events zur Designtime
 
Hallo roter Kasen!

@stahli: Naja, stolz nur, weil ich endlich einen Weg gefunden habe.

Stück Code:
Delphi-Quellcode:
type
  TPoly = class(TCustomControl)
  private
    FForm: TForm;
  protected
    procedure Paint; override;
    procedure _MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
  end;

implementation

constructor TPoly.Create(AOwner: TComponent);
begin
  inherited;
  FForm := TForm.CreateParented(TForm(AOwner).Handle); // Der Cast ist Murks, einer auf TWinControl dürft auch gehen
  FForm.BorderStyle := bsNone;
  FForm.Width := Width;
  FForm.Height := Height;
  FForm.Color := clRed; // nur damit man es gut sieht zum Test
  FForm.OnMouseMove := _MouseMove;
  FForm.Top := Top;
  FForm.Left := Left;
  FForm.Visible := true;
  FForm.BringToFront;
end;

destructor TPoly.Destroy;
begin
  FForm.Free;
  inherited;
end;

procedure TPoly._MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  self.Color := clFuchsia; // Um zu sehen, ob das Event ankommt. Es wird normal noch etwas gezeichnet, das hab ich hier rausgenommen
end;

procedure TPoly.Paint;
begin
  inherited;

  // Um das Form immer brav mitzuziehen
  FForm.Left := Left;
  FForm.Top := Top;
  FForm.Width := Width;
  FForm.Height := Height;
  FForm.BringToFront;
end;
Was noch fehlt sind ein paar Methoden, damit die Komponente im Designer wieder anwählbar ist und dergleichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 Uhr.
Seite 1 von 4  1 23     Letzte »    

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