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 TComponent "unsichtbar" in eine Form einbauen (https://www.delphipraxis.net/62993-tcomponent-unsichtbar-eine-form-einbauen.html)

sir-archimedes 12. Feb 2006 14:48


TComponent "unsichtbar" in eine Form einbauen
 
Hallo,

ich möchte gerne eine Componente unsichtbar in eine Form einbauen:

habe eine Form, die vererbt wird und diese Form soll auf verschiedene Messages reagieren können. Dazu habe ich ein TApplicationEvent protected eingebaut, welches im Constructor auch einwandfrei instanziert wird.

In abgeleiteten Formen jedoch wird dieses TApplicationEvent im Formulareditor angezeigt. Das will ich allerdings nicht. Die Form soll also nach außen quasi genauso aussehen, wie jede andere Form auch. Geht so etwas irgendwie?

Ich hoffe, irgendwer konnte verstehen, was ich meine ;-)

Gruß,
Dominik

turboPASCAL 12. Feb 2006 15:02

Re: TComponent "unsichtbar" in eine Form einbauen
 
Von was hast denn du abgeleited ? Ein Tobject sollte reichen. Oder hab ich dich falsch Verstanden...

sir-archimedes 12. Feb 2006 15:06

Re: TComponent "unsichtbar" in eine Form einbauen
 
Dann hast du mich falsch verstanden. Ich habe quasi folgendes:

Delphi-Quellcode:
type
  TMyForm = class(TForm)
  private
    AppMessages : TApplicationEvents;
    procedure AppMessagesOnMessage(var Msg: tagMSG; var Handled: Boolean);
  public
    constructor Create(AOwner : TComponent); override;
  end;

constructor TMyForm .Create(AOwner : TComponent);
begin
  inherited;
  AppMessages := TApplicationEvents.Create(Self);
  AppMessages.OnMessage := AppMessagesOnMessage;
end;

procedure TMyForm .AppMessagesOnMessage(var Msg: tagMSG;
  var Handled: Boolean);
begin
  // Hier eine Menge MEssage-Behandlung
end;
Und wenn ich nun eine neue Form erzeuge, die von TMyForm erbt, also z.B.
Delphi-Quellcode:
type
  TNeueForm = class(TMyForm)
  end;
Dann habe ich im Formulareditor ein ApplicationEvent, welches eigentlich unsichtbar hätte bleiben sollen, da es ja nur intern verwendet wird!

Gruß,
Dominik

SirThornberry 12. Feb 2006 15:16

Re: TComponent "unsichtbar" in eine Form einbauen
 
ist doch klar, schließlich schreibst du:
Delphi-Quellcode:
TApplicationEvents.Create(Self);
übergib als owner "nil" und schon trägt es sich nicht in die Components-List des Forms ein.

SirThornberry 12. Feb 2006 15:17

Re: TComponent "unsichtbar" in eine Form einbauen
 
im übrigen würde ich dir eher die messagehandler per extra-methode empfehlen da dein Application-Events auch die messages von anderen Forms abfängt. Wenn du also zwei von deinen forms nutzt wertest du die messages wohlmöglich doppelt aus. Richtiger wäre es doch aber wenn du wirklich nur die messages für das form auswertest oder nicht?

sir-archimedes 12. Feb 2006 16:15

Re: TComponent "unsichtbar" in eine Form einbauen
 
Zitat:

Zitat von SirThornberry
ist doch klar, schließlich schreibst du:
Delphi-Quellcode:
TApplicationEvents.Create(Self);
übergib als owner "nil" und schon trägt es sich nicht in die Components-List des Forms ein.

Oh ja, tatsächlich - das wars... Manchmal ist man einfach blind ;-)

Zitat:

Zitat von SirThornberry
im übrigen würde ich dir eher die messagehandler per extra-methode empfehlen da dein Application-Events auch die messages von anderen Forms abfängt. Wenn du also zwei von deinen forms nutzt wertest du die messages wohlmöglich doppelt aus. Richtiger wäre es doch aber wenn du wirklich nur die messages für das form auswertest oder nicht?

Stimmt schon - aber ich möchte eine Form quasi komplett sperren, um ein "modales MDI-Fenster" zu erstellen. Das heißt, dass alle Klicks - auch auf Children der Form - geschluckt werden sollen und das modale MDI-Fenster wieder aktiviert wird. Das mache ich so:

Delphi-Quellcode:
procedure TInstantiableForm.AppMessagesOnMessage(var Msg: tagMSG;
  var Handled: Boolean);
var
  Ctrl : TWinControl;
begin
  if csDesigning in ComponentState then
    exit;
  if Assigned(RelativeModalForm) then
    begin
      if ((Msg.message >= WM_LBUTTONDOWN) AND (Msg.message <= WM_MOUSELAST)) then
        begin
          Ctrl := FindControl(Msg.hwnd);
          while Assigned(Ctrl) do
            begin
              if Ctrl = Self then
                begin
                  RelativeModalForm.BringToFront;
                  Handled := true;
                  Break;
                end;
              Ctrl := Ctrl.Parent;
            end;
        end;
    end;
end;
Da sieht man auch, dass ich tatsächlich nur Messages an meine Form behandle ;-)

Hab es jetzt auf jeden Fall wie gewünscht am Laufen =)

Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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 by Thomas Breitkreuz