Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auf das Öffnen einer anderen Form/Dialog reagieren? (https://www.delphipraxis.net/184692-auf-das-oeffnen-einer-anderen-form-dialog-reagieren.html)

kaju74 15. Apr 2015 07:36

Delphi-Version: 2010

Auf das Öffnen einer anderen Form/Dialog reagieren?
 
Moin.

Ich hätte da mal eine Frage bzw. ein Problem:

Ich müsste auf das Öffnen einer Sub-Form oder eines Dialogs aus der MainForm meiner Windows-App reagieren. D.h.: Wenn ich z.B. in einer Toolbar auf einen Button klicke, dann geht eine andere Form (modal) auf. Darauf möchte ich in der MainForm reagieren, um zuvor noch etws anderes machen zu können.

Auf welche Botschaft muss die MainForm da reagieren?

Ein 'OnDeativate' funktioniert hier nicht, genausowenig ein WM_KILLFOCUS.

Ich möchte hier nicht für jeden Aufruf einer Form extra Logik programmieren müssen, da es ein paar Dutzend sind...

Irgendeine Idee, wie man sich da 'rein-hookt'?

Danke & lG,
Marc

TRomano 15. Apr 2015 07:49

AW: Auf das Öffnen einer anderen Form/Dialog reagieren?
 
Ich weiß zwar nicht, was Du genau machen willst, aber Du hast ja das OnClick-Event des jeweiligen Buttons bzw. die TAction, die mit dem Button verbunden ist. Da kann man doch reagieren ...

uligerhardt 15. Apr 2015 08:13

AW: Auf das Öffnen einer anderen Form/Dialog reagieren?
 
Vielleicht Delphi-Referenz durchsuchenTApplication.OnModalBegin?

DeddyH 15. Apr 2015 08:15

AW: Auf das Öffnen einer anderen Form/Dialog reagieren?
 
Cool, kannte ich noch gar nicht.

kaju74 15. Apr 2015 08:20

AW: Auf das Öffnen einer anderen Form/Dialog reagieren?
 
Zitat:

Zitat von uligerhardt (Beitrag 1297770)

Cool! Kannte ich auch noch nicht. Funktioniert auch schon fast: Es fehlt jetzt nur noch eine Möglichkeit, auch auf aufpoppende System-Dialoge - wie z.B. PrinterDialog - reagieren zu können.

[GELÖST]

Okay - das geht mit "Application.OnGetActiveFormHandle".

Perfekt & Danke,
Marc

Perlsau 15. Apr 2015 08:23

AW: Auf das Öffnen einer anderen Form/Dialog reagieren?
 
Offenbar hab ich das Problem falsch verstanden - Beitrag kann gelöscht werden ... :(

Zitat:

Zitat von kaju74 (Beitrag 1297764)
Irgendeine Idee, wie man sich da 'rein-hookt'?

Einen Hook benötigst du dazu nicht. Ich gehe mal davon aus, daß die Unit deiner SubForm in der Unit deiner MainForm unterhalb des Implementation-Abschnitts in der Uses-Klausel steht, so daß du von der MainForm aus die SubForm aufrufen/ansprechen kannst. Wenn dem so ist, deklarierst du in der SubForm ein Ereignis, dem du in der MainForm eine Methode zuweist:
Delphi-Quellcode:
UNIT SubForm;

INTERFACE

USES
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes, System.Actions,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

TYPE
  TToolButtonClickedEvent = Procedure of Object;

TYPE
  TFormSub = CLASS(TForm)
...

  PRIVATE { Private-Deklarationen }
    fToolButtonClicked : TToolButtonClickedEvent;
...
  PUBLIC { Public-Deklarationen }
...
    Property OnToolButtonClicked : TToolButtonClickedEvent read fToolButtonClicked write fToolButtonClicked;
  END;

VAR
  FormMain: TFormMain;

IMPLEMENTATION
...
Da deinen ToolButtons vermutlich unterschiedliche Ereignisbehandlungsmethoden zugewiesen werden, löst du in jeder dieser Ereignisbehandlungen dieses Event aus:
Delphi-Quellcode:
Procedure TFormSub.MyToolBtn1Execute(Sender: TObject);
begin
  MachIrgendwas;
  ...
  If Assigned(fToolButtonClicked) Then fToolButtonClicked;
end;
In deiner MainForm-Unit reagierst du dann mit der gewählten Methode auf das Ereignis in der SubForm:
Delphi-Quellcode:
Procedure TFormMain.FormActivate(Sender: TObject);
begin
  ...
  SubForm.OnToolButtonClicked := MeineReaktionsMethode;
  ...
end;

kaju74 15. Apr 2015 08:26

AW: Auf das Öffnen einer anderen Form/Dialog reagieren?
 
@Perlsau:

Danke - aber genau dies wollte ich vermeiden, da es sehr, sehr viele Stellen im Programm sind, die entweder eigene Dialoge oder System-Dialog öffnen. Vielleicht mal zum eigentlichen Problem:

Ich habe einen eigenen Hint, der detailliert Auskunft über bestimmte Dinge gibt. Dieses HintWindow bleibt ~20 Sekunden stehen, damit man genügend Zeit zum Lesen hat. Ruft man nun einen System-Dialog aus einem Menü auf, und die Maus ist zufälligerweise auf einem Eintrag mit einem Hint, dann poppt der entsprechende Dialog auf, aber das Hint-Window eben auch. Und genau dieses möchte ich dann eben vorher explizit schließen können. Darum muss ich mich global da irgendwie reinhooken.

Mit oben genannten Botschaften bzw. Events scheint das aber nun zu klappen.

Danke,
Marc

himitsu 15. Apr 2015 08:28

AW: Auf das Öffnen einer anderen Form/Dialog reagieren?
 
Ich hoffe du hast Delphi-Referenz durchsuchenTApplicationEvents.OnModalBegin verwendet, wenn es das bei dir schon gibt. :stupid:


Wenn ein Systemdialog aufgeht, geht an dein Fenster ein WM_ENABLE mit wParam=0 (False) raus.
Und nachher dann mit wParam<>0 (True).

kaju74 15. Apr 2015 08:31

AW: Auf das Öffnen einer anderen Form/Dialog reagieren?
 
Zitat:

Zitat von himitsu (Beitrag 1297775)
Ich hoffe du hast Delphi-Referenz durchsuchenTApplicationEvents.OnModalBegin verwendet, wenn es das bei dir schon gibt. :stupid:


Wenn ein Systemdialog aufgeht, geht ein dein Fenster ein WM_ENABLE mit wParam=0 (False) rause.
Und nachher dann mit wParam<>0 (True).


Habe ich - danke. Geht nun auch so wie gewünscht ;-)

BadenPower 15. Apr 2015 08:59

AW: Auf das Öffnen einer anderen Form/Dialog reagieren?
 
Zitat:

Zitat von DeddyH (Beitrag 1297771)
Cool, kannte ich noch gar nicht.

Schaut ihr Euch eigentlich die Komponenten die Delphi mitliefert nicht an und probiert deren Funktionen aus?

Das ist jetzt eine ernstgemeinte Frage und kein Spruch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 Uhr.
Seite 1 von 2  1 2      

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