this slowpoke moves

Change Windows OpenDialog

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

Beliebte Posts

Translate