Autor Beitrag
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
//Variante A:

function MsgDlgPos(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons; HelpCtx: Longint; var X, Y: Integer): Integer; //(*1)
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 < 0and (X < 0then Position := poScreenCenter;
      Result := ShowModal;
    finally
      X := Left;
      Y := Top;
      Free; //(*2)
    end;
end;

ausblenden volle Höhe 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:
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:
// Variante B: (Speichern der letzten Position in einer Ini-Datei + andere Farbgebung)

function MsgDlgPos(const Typ: stringconst 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;

// Die Funktion "ImBereich" ist wie folgt definiert:

function ImBereich(const von, bis: Integer; Wert: Integer): Integer;
begin
  Wert := Min(bis, Wert);
  Wert := Max(von, Wert);
  Result := Wert;
end;

// Unit Math einbinden!!

// Dann ist das Fenster immer im sichtbaren Bereich, selbst wenn es vorher mal aus Versehen ganz an den Rand geschoben wurde oder sehr viel größer als das
// vorherige Abfrage-Fenster ist

// Dann muss Inifiles eingebunden werden und die globale Variable MessageName belegt werden:
// z.B.: MessageName := ExtractFilePath(ParamStr(0))+'MessagePos.TXT';
// Typ bitte immer mit einem String belegen!! z.B. 'Frage', 'Eingabe' ... 
// Dann kann jedem Abfragetyp eine andere Position zugeordnet und wieder hergestellt werden.

(*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:

ausblenden 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);                   // (Variante A)
  Erg := MsgDlgPos('Entscheidung', Text, mtConfirmation, [mbYes, mbNo, mbNoToAll, mbYesToAll], 0, X, Y);   // (Variante B)
  Result := Erg;
end;

function Frage(Text: stringconst 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);                   // (Variante A)
  Erg := MsgDlgPos('Frage', Text, mtConfirmation, [mbYes, mbNo], 0, X, Y, Col);   // (Variante B)
  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