AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Dialog, um einen Pfad auszuwählen

Ein Thema von Matze · begonnen am 28. Apr 2004
Antwort Antwort
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

Dialog, um einen Pfad auszuwählen

  Alt 28. Apr 2004, 13:45
Hi!

Ich bin hier des Öfteren auf die Frage gestoßen, wie man mittels eines Dialogs nur einen Ordner, und keine Datei auswählen kann.

Es gibt da 2 Möglichkeiten:

1. Möglichkeit [VCL]

Delphi-Quellcode:
uses FileCtrl;

...
procedure TForm1.Button1Click(Sender: TObject);
var Pfad: string;
begin
  SelectDirectory('Ordner auswählen', '' ,Pfad);
end;
Hier wird der Pfad der String-Variable Pfad zugewisen, somit kann man leicht mit dieser Pfadangabe arbeiten.


2. Möglichkeit [NonVCL]

Diese hat Luckie hier veröffentlicht.

Delphi-Quellcode:
uses shlobj;

...

function TFrmMain.OpenFolder(root: Integer; Caption: string): string; //Verzeichnis-Öffnen-Dialog-Funktion
var
  bi: TBrowseInfo;
  lpBuffer: PChar;
  pidlPrograms, pidlBrowse: PItemIDList;
begin
  if (not SUCCEEDED(SHGetSpecialFolderLocation(GetActiveWindow, root,
    pidlPrograms))) then
    exit;
  lpBuffer := StrAlloc(MAX_PATH);
  bi.hwndOwner := GetActiveWindow;
  bi.pidlRoot := pidlPrograms;
  bi.pszDisplayName := lpBuffer;
  bi.lpszTitle := PChar(Caption);
  bi.ulFlags := BIF_RETURNONLYFSDIRS;
  bi.lpfn := nil;
  bi.lParam := 0;

  pidlBrowse := SHBrowseForFolder(bi);
  if (pidlBrowse <> nil) then
    if SHGetPathFromIDList(pidlBrowse, lpBuffer) then
      Result := lpBuffer;
  StrDispose(lpBuffer);
end;

// Beispielaufruf
procedure TfrmMain.cmdOpenClick(Sender: TObject);
begin
  txtPath.Caption := OpenFolder(CSIDL_DRIVES, 'Verzeichnis wählen'); //Übergabe des gewählten Verzeichnisses
end;
3. Möglichkeit (Erweiterung der 2. Möglichkeit) [NonVCL]

Luckies Code wurde von turboPASCAL erweitert:

Delphi-Quellcode:
uses ShlObj;

// Erweiterte Verzeichnis-Öffnen-Dialog-Funktion
// Caption: Optionaler Subtitel
// DefPath: Vorauswahl des Verzeichnises
// Result: Verzeichnis als String
function OpenFolder(Caption, DefPath: string): string;
var
  bi: TBrowseInfo;
  lpBuffer: PChar;
  pidlPrograms, pidlBrowse: PItemIDList;

  function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: Cardinal;
    lpData: Cardinal): Integer; stdcall;
  var
    PathName: array[0..MAX_PATH] of Char;
  begin
    case uMsg of
      BFFM_INITIALIZED:
        SendMessage(Hwnd, BFFM_SETSELECTION, Ord(True), Integer(lpData));
      BFFM_SELCHANGED:
        begin
          SHGetPathFromIDList(PItemIDList(lParam), @PathName);
          SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, Longint(PChar(@PathName)));
        end;
    end;
    Result := 0;
  end;

begin
  Result := '';
  if (not SUCCEEDED(SHGetSpecialFolderLocation(GetActiveWindow, CSIDL_DRIVES,
    pidlPrograms))) then exit;

  GetMem(lpBuffer, MAX_PATH);

  FillChar(BI, SizeOf(BrowseInfo), 0);
  bi.hwndOwner := GetActiveWindow;
  bi.pidlRoot := pidlPrograms;
  bi.pszDisplayName := lpBuffer;
  bi.lpszTitle := PChar(Caption);
  bi.ulFlags := BIF_RETURNONLYFSDIRS or BIF_STATUSTEXT;
  bi.lpfn := @BrowseCallbackProc;
  bi.lParam := Integer(PChar(DefPath));

  pidlBrowse := SHBrowseForFolder(bi);
  if (pidlBrowse <> nil) then
    if SHGetPathFromIDList(pidlBrowse, lpBuffer) then
      Result := String(lpBuffer);

  if (lpBuffer <> nil) then FreeMem(lpBuffer);
end;
Hierbei wird ein Dialog geöffnet, bei dem das ausgewählte Verzeichnis im oberen Teil des Dialoges angezeigt wird. Eine Vorauswahl des Verzeichnisnamens ist möglich.

Delphi-Quellcode:
// Beispielaufruf
procedure Test;
var
  Dir: string;
begin
  Dir := OpenFolder('Bitte Verzeichnis wählen:', 'c:\');

  if Dir <> 'then MessageBox(0, PChar(Dir), 'Info', MB_OK)
    else MessageBox(0, 'Keine Auswahl (Abbruch durch Benutzer).', 'Info', MB_OK);
end;

Sichbegriffe: Dialog
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz