![]() |
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? |
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 |
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.
|
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:
|
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:
, die bei Aufruf die Position des TKalenderForms an den Sender anpasste und dann das Form modal aufrief.
function ShowModalAt(Sender:TWincontrol):TModalResult;
Dazu noch OnClick- und OnKeyDown-Ereignisse in denen ich jeweils das ModalResult gesetzt habe. Nun mache ich es folgendermassen:
Delphi-Quellcode:
im Create setze ich das FFenster.OnDeactivate auf self.DeactivateWin.
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; In den KeyDown-Ereignissen für FFenster kommt dann:
Delphi-Quellcode:
wichtig dabei, das ModalResult nach dem Hide zu setzen, da sonst das Hide selbst ModalResult setzt und eventuell manuell gesetzte Werte überschreibt.
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 Ä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:
So funzt es wunderbar - auch mein ursprüngliches Anliegen ist erfüllt.
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; Das Einzige, was jetzt noch stört ist diese Nummer:
Delphi-Quellcode:
Jemand von Euch 'ne bessere Idee?
while FPopUpCal.ModalResult = 0 do Application.ProcessMessages;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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