AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte OpenDirDialog
Thema durchsuchen
Ansicht
Themen-Optionen

OpenDirDialog

Ein Thema von Garfield · begonnen am 22. Jul 2007 · letzter Beitrag vom 27. Jun 2011
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

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.
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#2

AW: OpenDirDialog

  Alt 30. Aug 2010, 09:19
Unter Turbo Delphi wird der Text so zugewiesen:
Delphi-Quellcode:
    TVN_GETDISPINFOW:
    with PTVDispInfoW(NMHdr)^
    do begin
      Node := GetNodeFromItem(item);
      if Node <> nil
      then begin
        if (item.mask and TVIF_TEXT) <> 0
        then lStrCpyNW(item.pszText, PWideChar(Node.Text), item.cchTextMax - 1);
        if (item.mask and TVIF_IMAGE) <> 0
        then begin
          GetImageIndex(Node);
          item.iImage := Node.ImageIndex;
        end;
        if (item.mask and TVIF_SELECTEDIMAGE) <> 0
        then begin
          GetSelectedIndex(Node);
          item.iSelectedImage := Node.SelectedIndex;
        end;
      end;
    end;
Unter Delphi 7 hat man dann einen leeren Eintrag und muss Node.Text in einen String umwandeln, damit man einen Text bekommt.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#3

AW: OpenDirDialog

  Alt 5. Okt 2010, 13:51
Kleines Update.

05.10.2010 - Build 15
  • destructor TOpenDirDialog.Destroy entfernt.
  • procedure TOpenDirDialog.FormClose eingefügt.
  • Auswertung von DelphiCompilerVersionen eingefügt.
  • Root war als String anstelle als Widestring deklariert.
Die beiden Formulare werden mit ShowModal angezeigt. Deshalb habe ich für diese ein FormClose mit der Zeile "Action := caFree;" eingefügt. Das Überschreiben von Destroy ist nicht notwendig und wurde entfernt.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#4

AW: OpenDirDialog

  Alt 27. Jun 2011, 13:28
Die Komponente unterstützt anscheinend Delphi XE nicht.

Ich kann sie installieren aber auf die Oberfläche lässt es sich nicht ziehen.

Code:
  // Delphi XE
  {$ifdef VER220}
    {$define DELPHI_10_UP}
    {$define DELPHI_9_UP}
    {$define DELPHI_7_UP}
  {$endif}
habe ich schon hinzugefügt.

edit:

keiner eine Idee?

So, ich hab nicht dem Problem nochmal angenommen. Was bei mir hilft ist ein inherited; im constructor .

Ist zwar schon besser als der alte W*-Kram, aber immer noch nicht das was ich haben will. --> Win7 -> Rechtsklick(Taskleiste) -> "Neue Symbolleiste..."

Ich hab mich schon wund gesucht (wohl auch wegen dem verschwundenen Plus Operator in google). Ich kann einfach keine Möglichkeit finden (noch nicht mal für andere Sprachen)

Geändert von David Martens ( 4. Jan 2012 um 13:08 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz