unit TestForm;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls, Themes;
type
TForm1 =
class(TForm)
FileOpenDialog1: TFileOpenDialog;
Button1: TButton;
Label1: TLabel;
Button2: TButton;
Label2: TLabel;
Button3: TButton;
Label3: TLabel;
Label4: TLabel;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
(*
Aufgabe: Dialog soll auf dem Formular plaziert sein.
Lösung: Nutzung der Window-Handle im Execute() Aufruf.
Notlösung: Nutzung einer frei wählbaren Position per x und y
Alternativ: Auf passende Message reagieren?
(evtl über WM_NOTIFY tiefer rein
oder über WM_SHOWWINDOW eher global?
dies sind nur vermutungen
da die erste änderung bereits zum ziel führte.)
Bemerkungen: Alle varianten haben den gleichen Nachteil.
Die positionierung funktioniert nur beim ersten Aufruf wie erwartet.
Ab da an übernimmt BigBrother die automatik bis man das HauptFormular
Fenster etwas verschiebt, dann geht das Spiel von vorne los.
*)
uses
// Winapi.CommDlg // for hacking into dialogs; bind and use this unit
dlgPos
// Positionierbarer Dialog rein-intercepted
;
// der hier benötigt eine handle angabe damit er sich gut dazu positionieren kann
procedure TForm1.Button1Click(Sender: TObject);
begin
// if FileOpenDialog1.Execute() then
if FileOpenDialog1.Execute(Application.ActiveFormHandle)
then
Label1.Caption := FileOpenDialog1.FileName
else
Label1.Caption := '
canceled';
end;
(* Dynamisches Testen von Dialogen *)
// der hier erscheint immer gut positioniert bei mir ohne handle angabe
procedure TForm1.Button2Click(Sender: TObject);
var
Dlg: TOpenDialog;
// maintype probe
begin
Dlg := TOpenDialog.Create(
nil);
// da Dein FileOpenDialog1 über keinerlei Grundeinstellungen verfügt
// setze ich auch keine :-)
// ansonsten hier so filter, folder, labels usw setzen
// um letzendlich das hier machen zu dürfen:
if Dlg.Execute()
then
Label2.Caption := Dlg.FileName
else
Label2.Caption := '
canceled';
Dlg.Free;
end;
// der hier benötigt eine handle angabe damit er sich gut dazu positionieren kann
procedure TForm1.Button3Click(Sender: TObject);
var
Dlg: TFileOpenDialog;
// subtype testing
begin
Dlg := TFileOpenDialog.Create(
nil);
if Dlg.Execute(Application.ActiveFormHandle)
then
Label3.Caption := Dlg.FileName
else
Label3.Caption := '
canceled';
Dlg.Free;
end;
// dies hier arbeitet mit x und y
// und passt sich notfalls selbst an
procedure TForm1.Button4Click(Sender: TObject);
var
Dlg: TOpenDialog;
begin
Dlg := TOpenDialog.Create(Self);
if Dlg.Execute((Left + (Width
div 2)), (Top + (Height
div 2)))
then
Label4.Caption := Dlg.FileName
else
Label4.Caption := '
canceled';
Dlg.Free
end;
end.