Der Öffne mit Dialog von Windows hat eine bestimmte Vorgabe, wie er auszusehen hat und welche Komponenten sich auf ihm befinden. Wer aber diesen Dialog für sein eigenes Programm verändern oder etwas hinzufügen möchte, kann das folgende Beispiel dafür anwenden.
Hier wird eine weitere Edit Box im unteren Teil des Dialogs erstellt.
procedure TForm1.OpenDialog1Show(Sender: TObject);
var
hParent: THandle;
rect: TRect;
hEdit: THandle;
begin
// OpenDialog1.Handle ist irgendwie das falsche :?
hParent := GetParent(OpenDialog1.Handle);
// Position und Größe ermitteln
GetWindowRect(hParent, rect);
// Dialog vergrößern für Edit
SetWindowPos(hParent, 0, 0, 0, rect.Right - rect.Left, rect.Bottom - rect.Top
+ 25, SWP_NOMOVE);
// Edit erzeugen, ID = 101
hEdit := CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', '', WS_VISIBLE or WS_CHILD,
// Die 47 steht für die Höhenposition des Box
195, rect.Bottom - rect.Top - 47, 170, 20, hParent, 101, 0, nil);
if hEdit = 0 then
RaiseLastOSError;
end;
procedure TForm1.OpenDialog1Close(Sender: TObject);
var
hParent: THandle;
hEdit: THandle;
Buffer: PChar;
len: Integer;
begin
hParent := GetParent(OpenDialog1.Handle);
// Handle des Edits ermitteln, ID = 101 siehe oben
hEdit := GetDlgItem(hParent, 101);
// Speicher allozieren
len := SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0);
GetMem(Buffer, len + 1);
try
ZeroMemory(Buffer, len + 1);
// Text aus Edit holen
SendMessage(hEdit, WM_GETTEXT, len, lParam(Buffer));
ShowMessage(Buffer);
finally
FreeMem(Buffer, len + 1);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// eigene EventHandler zuweisen
OpenDialog1.OnShow := OpenDialog1.OnShow;
OpenDialog1.OnClose := OpenDialog1.OnClose;
// aufrufen
if OpenDialog1.Execute then
begin
ShowMessage(OpenDialog1.FileName);
end;
end;
Keine Kommentare:
Kommentar veröffentlichen