Meine Dialog-
Unit ist fürs erste fertig.
Wesentlich einfacher in der Handhabung als die bekannten Prozeduren und Wrapper, aber gleichzeitig extrem flexibel.
Der Dialog besteht aus drei Teilen:
Standardmässig
1. ein Label mit einer beliebig langen, auch mehrzeiligen Nachricht bzw. Frage angezeigt wird
2. eine Buttonleiste mit bis zu 5 Buttons.
3. Will man in den Dialog zusätzliche Felder packen, ist das denkbar einfach: Man erstellt in der
IDE im aufrufenden Formular visuelle Controls (TEdit, TCombobox, oder auch ein TPanel mit mehreren Komponenten darauf) und setzt für diese Komponente visible:=false. Vor dem Aufruf des Dialog selbst wird dann mit Hilfe der Procedure AskAddControl dieses Control von Hauptformular an den Fragedialog "verborgt".
Darüber hinaus können, ebenfalls vor dem Aufruf des Dialogs, noch eine Reihe von Dialogparametern gesetzt werden. So lässt sich jeder derartige Dialog visuell in der
IDE gestalten, ohne dass man für den Dialog ein eigenes Formular machen muss:
procedure AskSetposition (left,top: integer);
definiert die Position des Dialogs. Standardmässig wird der Fragedialog relativ zum gerade vorher aktiven Dialog zentriert.
procedure AskSetIcon(icon: PWidechar);
Erlaubt ein individuelles Icon. Die Standardicons werden automatisch abhängig von der Aufrufart gesetzt.
procedure AskSettimeout (ms: integer; result: integer=1);
Wenn ein Timeout (in Millisekunden) gesetzt wird, wird der Dialog automatisch nach Ablauf der Zeit geschlossen. Modalresult wird dann mit dem Wert belegt, der in result übergeben wird.
Achtung: Im Parameter Result darf der Wert 0 nicht übergeben werden, sonst wird der Diaog nach Ablauf der Zeit nicht geschlossen.
Delphi-Quellcode:
type
TCanClose = function(ButtonNr: integer): boolean;
TCanCloseM = function(ButtonNr: integer): boolean of object;
procedure AskSetCanClose (Canclose: TCanClose); overload;
procedure AskSetCanClose (Canclose: TCanCloseM); overload;
Die beiden überladenen Prozeduren ermöglichen es, wahlweise eine einfache Funktion oder eine Methode (des aufrufenden Formulars) festzulegen, die in Abhängigkeit der eingegebenen Daten und des gedrückten Buttons überprüft, ob der Dialog geschlossen werden darf.
procedure AskAddControl (co: TWinControl; const caption: String='');
Das angegebene Control wird direkt über der Buttonleiste eingefügt. Ist eine Caption angegeben, dann wird die links vom Control angezeigt. Control+Caption werden zentriert ausgegeben. Wenn der Platz dafür aber nicht ausreicht, wird die Form entsprechend vergrössert.
procedure AskReset;
Die Einstellungen der Form werden automatisch zurückgesetzt, nachdem eine der Frageroutinen aufgerufen worden ist. Hat man schon irgendwelche Parameter gesetzt und ruft dann in der Folge doch keine der Frageroutinen auf, muss man die Einstellungen mittels AskReset wieder zurücksetzen, damit für den nächsten Aufruf an einer anderen Stelle des Programms wieder die Standardwerte eingestellt sind.
procedure AskSetStandardFontSize (size: integer);
Der einzige Parameter, der via AskReset nicht zurückgesetzt wird, ist die Schriftgrösse, in der standardmässig der obere Label angezeigt wird. Damit kann also die Schriftgrösse für alle nachfolgenden Aufrufe einheitlich festgelegt werden. Bei jedem Aufruf kann individuell für diesen Aufruf die Schriftgrösse verändert werden, indem man dem auszugebenden Text z.B. :8: oder :15: voranstellt, dann wird der Text mit size=8 bzw. mit size=15 angezeigt.
Folgende Fragedialoge sind verfügbar:
Delphi-Quellcode:
procedure Msg (const Msg, a1: string);
procedure ErrMsg (const Msg: string);
procedure WarnMsg (const Msg: string);
procedure InfoMsg (const Msg: string; Timeout: integer=0);
function Ask (const question: string): boolean; overload;
function Ask (const question, a1,a2: string): boolean; overload;
function WarnContinue (const Warning, Abort, Continue: string): boolean;
procedure Ask (const question, a1: string); overload;
function Ask (const question, a1,a2,a3: string): integer; overload;
function Ask (const question, a1,a2,a3,a4: string): integer; overload;
function Ask (const question, a1,a2,a3,a4,a5: string): integer; overload;
Die Aufrufe mit zwei Buttontext-Parametern liefern als Ergebnis boolean, bei mehr als zwei Möglichkeiten ist der Ergebnistyp integer.
WarnContinue macht das Gleiche wie die Prozedur Ask mit zwei Buttontexten, zeigt aber das Warnsymbol statt des Fragesymbols an.
Der Aufruf
if Warncontinue('Vorsicht!', 'Abbrechen', 'Weitermachen') then ...
ist gleichbedeutend mit
Delphi-Quellcode:
AskSetIcon(IDI_WARNING);
if Ask('Vorsicht!', 'Abbrechen', 'Weitermachen') then ...
Ebenso sind die Aufrufe
Ask('Frage')
und
Ask('Frage','Nein','Ja')
gleichbedeutend.