Thema: OpenDirDialog

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.105 Beiträge
 
Delphi 12 Athens
 
#52

AW: OpenDirDialog

  Alt 30. Aug 2010, 07:14
Wenn man selber Messages verschickt und dort der "Text" nur als zusätzlicher/unabhängiger Parameter mit übergeben wird, dann passiert nichts,
aber wenn man TextMessages nutzt, bei welchen explizit Text angegeben wird, dann wird dieses in Delphi 7, durch die Ansi-WinAPI, nach ANSI übersetzt.

Vielleicht hilft es dir ja etwas:
Delphi-Quellcode:
Uses Windows, Messages, ActiveX, ShlObj;

Type TFolderRec = Record
    Title, Caption, Folder: PWideChar;
  End;
  PFolderRec = ^TFolderRec;

Function FolderCallback(Dlg: HWND; Msg: LongWord; LParam: Pointer; Data: PFolderRec): LongWord; StdCall;
  Var Temp: Array[0..MAX_PATH-1] of WideChar;

  Begin
    Case Msg of
      BFFM_INITIALIZED: Begin
        If Data^.Title <> nil Then
          SendMessageW(Dlg, WM_SETTEXT, 0, Integer(Data^.Title));
        If Data^.Folder <> nil Then
          SendMessage(Dlg, BFFM_SETSELECTION, LongInt(True), Integer(Data^.Folder));
      End;
      BFFM_SELCHANGED: Begin
        SHGetPathFromIDListW(PItemIDList(LParam), @Temp);
        If SendMessageW(Dlg, BFFM_SETSTATUSTEXT, 0, LongWord(@Temp)) = 0 Then
          SetWindowTextW(GetDlgItem(Dlg, 14146), PWideChar(WideString(Data^.Caption)
            + sLineBreak + sLineBreak + Temp));
      End;
      BFFM_VALIDATEFAILED: Begin
        Result := 1;
        Exit;
      End;
    End;
    Result := 0;
  End;

Function BrowseForFolder(Wnd: HWND; Const Title, Caption, PreSelectedFolder: WideString; AllowNewFolder: Boolean; Var SelectedDir: WideString): Boolean;
  Var BI: TBrowseInfo;
    FolderRec: TFolderRec;
    pidlResult: PItemIDList;
    Temp: Array[0..MAX_PATH-1] of WideChar;
    Malloc: IMalloc;

  Begin
    Result := False;
    ZeroMemory(@BI, SizeOf(TBrowseInfo));
    BI.hwndOwner := Wnd;
    BI.lpszTitle := PWideChar(Caption);
    BI.ulFlags := BIF_STATUSTEXT {or BIF_NEWDIALOGSTYLE} or BIF_SHAREABLE or BIF_RETURNONLYFSDIRS;
    BI.lpfn := @FolderCallBack;
    BI.lParam := Integer(@FolderRec);
    If not AllowNewFolder Then BI.ulFlags := BI.ulFlags or BIF_NONEWFOLDERBUTTON;
    FolderRec.Title := PWideChar(Title);
    FolderRec.Caption := PWideChar(Caption);
    FolderRec.Folder := PWideChar(PreSelectedFolder);
    pidlResult := SHBrowseForFolderW(BI);
    If pidlResult = nil Then Exit;
    If SHGetPathFromIdListW(pidlResult, @Temp[0]) Then Begin
      Result := True;
      SelectedDir := Temp;
    End;
    If SHGetMalloc(Malloc) = S_OK Then
      Try
        Malloc.Free(pidlResult);
      Finally
        Malloc := nil;
      End;
  End;
Ich nutzte diesen Code allerdings selber nur mit Char/PChar/String und weiß jetzt nicht, ob er auch in Delphi 7 läuft.
In TDE lief er zwar auch als UnicodeVersion, aber das hat ja nicht viel zu sagen.

Wie gesagt, bei sowas wie SendMessage+WM_SETTEXT und SetWindowText mußt du aufpassen, da diese nach Ansi übersetzt werden könnten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Aug 2010 um 07:24 Uhr)
  Mit Zitat antworten Zitat