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 Ereigniss/Msg in HauptForm aus ModalGeshowtem Form abfangen (https://www.delphipraxis.net/11518-ereigniss-msg-hauptform-aus-modalgeshowtem-form-abfangen.html)

Leuselator 8. Nov 2003 10:46


Ereigniss/Msg in HauptForm aus ModalGeshowtem Form abfangen
 
Heute habe ich mal wieder eine Ladehemmung:

eigenes Control ähnlich TDateTimePicker ruft bei Click auf Mini-Schaltfläche mit Kalendersymbol mit ShowModal ein TForm auf, auf dem der Kalender und OK- / Abbrechenbutton sitzt.

Funzt soweit auch alles wunderbar.

Nun hätte ich gern implementiert, das wenn der User nochmals auf die Mini-Schaltfläche des eigentlichen Controls klickt, das Kalenderform wieder verschwindet. Da dieser Klick aber ausserhalb des Modal "geshowten" Kalenderforms stattfindet, fällt mir i.M. nix ein, wie ich das Dingen auf die Art geschlossen kriege.

Wer kann mir da mal auf's Pferd helfen?

Leuselator 8. Nov 2003 15:02

Re: Ereigniss/Msg in HauptForm aus ModalGeshowtem Form abfan
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ergänzung: nichtmodal anzeigen geht nicht, da ich ein und dasselbe KalenderForm für alle DateEdits der Application nutze.

Zur Illustration noch ein Screenshot

Luckie 8. Nov 2003 15:10

Re: Ereigniss/Msg in HauptForm aus ModalGeshowtem Form abfan
 
Wenn du eine Fenster modal öffnest, dann ist das übergeordnete Fenster so lange blockiert, bis das modale Fenster geschlossen wird. So ist das Prinzip. Damit erzähle ich dir wohl nichts neues. Was ich aber damit sagen will ist, dass du das Fenster nicht modal anzeigen musst und dir einen Trick überlegen musst, wie du ein modales Verhalten simulierst.

Christian Seehase 8. Nov 2003 15:15

Re: Ereigniss/Msg in HauptForm aus ModalGeshowtem Form abfan
 
Moin Leuselator,

das dürfte schwierig werden, da ja das Modale Formular das einzige der Anwenundung ist, dass Eingaben entgegennehmen kann.
Könntest Du das statt auf ein Formular nicht auch beispielsweise auf ein Panel legen, so dass es als DropDown Kalender für das jeweils gewählte Feld dient?

Zitat:

Zitat von Leuselator
nichtmodal anzeigen geht nicht, da ich ein und dasselbe KalenderForm für alle DateEdits der Application nutze.

Nicht schön, weil u.U. unübersichtlich, aber Du könntest den zweiten Aufruf unterdrücken, indem Du diesen nur zulässt, wenn das Formular nicht vorhanden/sichtbar ist.

Leuselator 8. Nov 2003 16:05

Re: Ereigniss/Msg in HauptForm aus ModalGeshowtem Form abfan
 
Danke Lucky - Danke Christian!
Lucky hat mir auf den Gaul gehülft:
Ich habe in TLsPopUpCal eine public-Methode:
Delphi-Quellcode:
function ShowModalAt(Sender:TWincontrol):TModalResult;
, die bei Aufruf die Position des TKalenderForms an den Sender anpasste und dann das Form modal aufrief.
Dazu noch OnClick- und OnKeyDown-Ereignisse in denen ich jeweils das ModalResult gesetzt habe.

Nun mache ich es folgendermassen:
Delphi-Quellcode:
type
  TLsPopUpCal = class(TComponent)
  private
    FFenster    : TForm;
  protected
    procedure DeactivateWin(Sender:TObject);  // darauf wird OnDeactivate von FFenster
                                               // gesetzt
    function GetMResult: TModalResult;       // mappt auf FFenster.ModalResult
    procedure SetMResult(Value: TModalResult);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ShowModalAt(Sender:TWincontrol); // nun Procedure - keine Function mehr...
    property ModalResult : TModalResult read GetMResult write SetMResult; // neues Property
  end;
im Create setze ich das FFenster.OnDeactivate auf self.DeactivateWin.
In den KeyDown-Ereignissen für FFenster kommt dann:
Delphi-Quellcode:
  if      (Key = VK_ESCAPE) then
  begin
    FFenster.Hide;
    FFenster.ModalResult := mrCancel;
  end
  else if ((Key = ORD('O')) and (ssAlt in Shift))
       or (Key = VK_RETURN) then
  begin
    FFenster.Hide;
    FFenster.ModalResult := mrOK;
  end
wichtig dabei, das ModalResult nach dem Hide zu setzen, da sonst das Hide selbst ModalResult setzt und eventuell manuell gesetzte Werte überschreibt.
Äquivalent gehe ich in den OnClick's der Button's un im DeactivateWin vor.
Der Aufruf aus einer DateEdit-Komponente sieht dann so aus:
Delphi-Quellcode:
procedure TLsDateEdit.ShowDaPop;
var DasTempDatum : TDateTime;
begin
  DasTempDatum := FDatum;
  FPopUpCal.ModalResult := 0;
  FPopUpCal.ShowModalAt(self);
  while FPopUpCal.ModalResult = 0 do Application.ProcessMessages; // hmm - eher nicht so schön
  if FPopUpCal.ModalResult <> mrOk then begin
    FDatum := DasTempDatum;
    FedtEdit.Text := StrIf((DasTempDatum = ChristiGeburt),'',DateToStr(FDatum));
  end else begin
    FDatum := FPopUpCal.Ls_Datum;
    FedtEdit.Text := StrIf((FDatum = ChristiGeburt),'',DateToStr(FDatum));
  end;
end;
So funzt es wunderbar - auch mein ursprüngliches Anliegen ist erfüllt.
Das Einzige, was jetzt noch stört ist diese Nummer:
Delphi-Quellcode:
  while FPopUpCal.ModalResult = 0 do Application.ProcessMessages;
Jemand von Euch 'ne bessere Idee?


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