Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Di 19.02.13 10:07
Ich habe gesucht, wie ich die letzte Position eines MessageDlg speichern kann. In dem Zusammenhang habe ich die Dialogs.pas durchsucht und mir angesehen, wie ein MessageDlg erzeugt wird. Es wird mit CreateMssageDlg ein Formular erzeugt. Da kam mir dann die Idee, wie ich die Position speichern kann.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function MsgDlgPos(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; var X, Y: Integer): Integer; var loForm : TForm; begin loForm := CreateMessageDialog(Msg, DlgType, Buttons); with loForm do try HelpContext := HelpCtx; HelpFile := ''; if X >= 0 then Left := X; if Y >= 0 then Top := Y; if (Y < 0) and (X < 0) then Position := poScreenCenter; Result := ShowModal; finally X := Left; Y := Top; Free; end; end; |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:
| function MsgDlgPos(const Typ: string; const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; var X, Y: Integer; const Col : TColor = clBtnFace): Integer; var loForm: TForm; MessageDatei : TIniFile; begin MessageDatei := TIniFile.Create(MessageName); with MessageDatei do begin X := ReadInteger(Typ, 'X', 0); Y := ReadInteger(Typ, 'Y', 0); Free; end; loForm := CreateMessageDialog(Msg, DlgType, Buttons); with loForm do try Color := Col; HelpContext := HelpCtx; HelpFile := ''; X := ImBereich(0,Screen.Width-Width-100,X); Y := ImBereich(0,Screen.Height-Height-50,Y); Left := X; Top := Y; Result := ShowModal; finally X := Left; Y := Top; MessageDatei := TIniFile.Create(MessageName); with MessageDatei do begin WriteInteger(Typ, 'X', X); WriteInteger(Typ, 'Y', Y); Free; end; Free; end; end;
function ImBereich(const von, bis: Integer; Wert: Integer): Integer; begin Wert := Min(bis, Wert); Wert := Max(von, Wert); Result := Wert; end;
|
(*1) Statt lokaler X,Y übergebe ich an die Prozedur MsgDlPos var-Parameter X,Y, so dass ich in den Parametern die Position speichern kann.
(*2) Bevor das Formular mit Free geschlossen wird, wird die aktuelle Position in X und Y gespeichert.
Nun erfolgt der Aufruf in zwei unterschiedlichen lokalen Funktionen wie folgt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function Entscheidung(Text: string): Integer; const X : integer = 0; Y : integer = 0; var Erg: Word; begin Erg := MsgDlgPos(Text, mtConfirmation, [mbYes, mbNo, mbNoToAll, mbYesToAll], 0, X, Y); Erg := MsgDlgPos('Entscheidung', Text, mtConfirmation, [mbYes, mbNo, mbNoToAll, mbYesToAll], 0, X, Y); Result := Erg; end;
function Frage(Text: string; const Col : TColor = clBtnFace): Boolean; const X : integer = 0; Y : integer = 0; var Erg: Word; begin Erg := MsgDlgPos(Text, mtConfirmation, [mbYes, mbNo, mbNoToAll, mbYesToAll], 0, X, Y); Erg := MsgDlgPos('Frage', Text, mtConfirmation, [mbYes, mbNo], 0, X, Y, Col); Result := (Erg = mrYes); end; |
Kleines Schmankerl bei Variante B: Man kann nun das Abfrage-Fenster mit anderer Farbe aufrufen. Das hat den Vorteil, dass bestimmte Abfragen deutlicher auf dem Bildschirm
zu erkennen sind (z.B. Abfragen zum Programmende). Aber das leuchtet ja logischerweise ein.
Nun ist das Fenster beim nächsten Aufruf von "Entscheidung" immer dort, wo ich es "verlassen" habe. Vielleicht kann jemand das gebrauchen.
Wichtig natürlich: DIALOGS muss eingebunden werden.
Grund der Bearbeitung: Neue Version und Erweiterungen. Weitere Erweiterungen kann man sich selber ausdenken (anderer Font, Fett, ...).
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
Für diesen Beitrag haben gedankt: Mathematiker
|