Announcement

Collapse
No announcement yet.

Verzeichnisauswahls-Dialog

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verzeichnisauswahls-Dialog

    Jetzt habe ich noch eine Lösung gefunden:

    LPSTR szPath = new char[MAX_PATH];
    ...
    delete[] szPath;

    Unglaublich, aber so gehts auch.

    Schöne Grüße

    Roma

  • #2
    Verzeichnisauswahls-Dialog

    Hi.
    Für mein Programm benötige ich den Dialog, den Windows standardmäßig für
    eine Verzeichnisauswahl verwendet (z.B. bei "<b>Start</b>/Suchen/Dateien/Ordner" und dann "<b>Durchsuchen</b>".
    Ich hatte den Befehl schon mal in der BCB-Hilfe gefunden, aber wieder vergessen.

    Danke
    Jan U.

    Comment


    • #3
      <html>

      <head>
      <meta http-equiv="Content-Type"
      content="text/html; charset=iso-8859-1">
      <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
      <title>Normale Seite ohne Titel</title>
      </head>

      <body bgcolor="#FFFFFF">

      <p>Hallo Jan, die Funktion die Du suchst, ist ShBrowseForFolder. Hier
      ein Anwendungsbeispiel:</p>

      <pre>
      #include &lt;shlobj.h&gt;

      #pragma argsused
      int WINAPI BrowseCallbackProc(HWND hWnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
      {
      switch( uMsg )
      {
      case BFFM_INITIALIZED:
      SendMessage(hWnd,BFFM_SETSELECTION,TRUE,(long)&quo t;c:\\temp&quot;
      break;
      case BFFM_SELCHANGED:
      {
      LPSTR szPath=new char[MAX_PATH];
      SHGetPathFromIDList( (LPITEMIDLIST)lParam, szPath);
      SendMessage(hWnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szPa th);
      delete szPath;
      }
      break;
      }
      return 0;
      }

      void __fastcall TForm1::Button1Click(TObject *Sender)
      {
      LPSTR szPath=new char[MAX_PATH];
      LPITEMIDLIST pidl;
      BROWSEINFO bi;
      bi.hwndOwner = Handle;
      bi.pidlRoot = NULL;
      bi.pszDisplayName = szPath;
      bi.lpszTitle = &quot;Verzeichnis auswählen&quot;;
      bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
      bi.lpfn = BrowseCallbackProc;
      bi.lParam = 0;
      CoInitialize(NULL);
      pidl=SHBrowseForFolder( &amp;bi );
      if(pidl)
      {
      ShowMessage(szPath);
      SHGetPathFromIDList( pidl,szPath);
      ShowMessage(szPath);
      CoTaskMemFree(pidl);
      }
      CoUninitialize();
      delete szPath;
      }
      </pre>
      </body>
      </html&gt
      Günther

      Comment


      • #4
        Hat geklappt.
        Danke

        Comment


        • #5
          Hallo Günther,

          die Zeile

          LPSTR szPath = new char[MAX_PATH];
          ...
          delete szPath;

          kann unter Umständen zu Problemen führen. Dank CodeGuard, der immer wieder Recource leaks und sonstiges zu maulen hatte bei dieser Konstellation, habe ich nun herausgefunden, wie es 100% richtig ist:

          Statt wie oben, tippe einfach

          char szPath[MAX_PATH];//ohne delete

          und die Sache ist astrein.

          Übrigens, als ich dein Code-Snippet ausprobiert habe, hatte ich Probleme mit shlobj.h. Da gibt es 4 Structs bei denen der Compiler reklamiert. (Zur Info: Ich benutze bereits den BCB5). Ich habe sofort bei Borland interveniert und sie haben mir vorläufig recht gegeben, daß dies ein Bug sein könnte. Als ich das gleiche Snippet unter BCB4 erstellte funktionierte alles tadellos.

          Schöne Grüße

          Roma

          Comment


          • #6
            Hallo Roman, das ist alles schon sehr seltsam.

            Bevor ich mit dem Builder angefangen hatte, hab ich meine Variablen immer mit char Name[Groesse]; deklariert. Beim Umstieg auf BCB1.0 hatte ich seinerzeit Probleme und bin deshalb auf die umständlichere Variante mit new und delete ausgewichen. Der Verdacht, daß das nicht mehr notwendig ist, war mir auch schon gekommen.

            Ich hab den BrowseDialog in einem Borland C++5.02 Projekt. Da erhalte ich zwei Warnungen über undefinierte Strukturen: _IMAGELIST und _TREEITEM. Wenn ich in einem BCB 4.0 Projekt einfach nur die shlobj.h einbinde, gibt es keine Warnung.
            Gruß - Günthe
            Günther

            Comment


            • #7
              Hallo Günther,

              wie schon gesagt hatte ich mit dem BCB4 auch keinerlei Probleme. Da gab es überhaupt nichts, und das Programm lief auch tadellos zur Runtime.

              Beim BCB5 hatte ich konkret Probleme mit 4 Strukturen (die mir jetzt aus dem Kopf heraus nicht mehr einfallen). Ich habe dann shlobj.h soweit modifiziert, daß das dann lief.

              Noch ein Wort zu CodeGuard:

              Dieses Tool wird mit dem BCB5 ausgeliefert. Ich weiß jetzt nicht genau ob dieses Feature auch beim Standard oder Professional mitgeliefert wird. Auf alle Fälle spürt dieses Tool Memory Leaks und sonstige Recource Leaks auf. Dieses Feature kann man über die Projekt Optionen hinzuschalten. Wenn dieses Tool deaktiviert ist, dann mekkert der Compiler auch nicht. Dies soll nur auf versteckte Probleme hinweisen, die unter normalen Umständen zu keinen Komplikationen führen sollten, aber könnten. Ich habe dann halt so lange rumprobiert bis CodeGuard nichts mehr zu melden hatte, und wie gesagt nach langer Suche (2 Tage) habe ich dann die Lösung gefunden, wie oben beschrieben.

              Schöne Grüße

              Roma

              Comment

              Working...
              X