Danke Lucky - Danke Christian!
Lucky hat mir auf den Gaul gehülft:
Ich habe in TLsPopUpCal eine public-Methode:
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:
while FPopUpCal.ModalResult = 0 do Application.ProcessMessages;
Jemand von Euch 'ne bessere Idee?