Welcher Eintrag ist ausgewählt?


Es gibt eine relativ einfache Möglichkeit, den gerade markierten Eintrag herauszufinden: Sie reagieren in Ihrem Programm mindestens auf die Benachrichtigung "TVN_SELCHANGED", die als Teil von "WM_NOTIFY" gesendet wird. "Mindestens" bedeutet, dass Sie alternativ auch auf "TVN_SELCHANGING" reagieren können. Diese Benachrichtigung wird ausgelöst, sobald sich die aktuelle Auswahl ändert. Dagegen wird "TVN_SELCHANGED" erst ausgelöst, sobald sich die Auswahl geändert hat.


Die Variante des Beispielprogramms

Da das Beispielprogramm beim Laden der Ordner einen anderen Weg geht, stehen im Normalfall nur die Namen der Ordner im Baum. Nun könnten Sie sich zwar quasi nach "oben durch loopen", das wäre aber in dem Fall ineffizient, weil Ihnen mit über die Shell ein schnellerer Weg zur Verfügung steht. Dazu müssen Sie lediglich auf das gespeicherte Interface und die gespeicherte ID des Ordners zugreifen und aus letzterer den Namen ermitteln. Das Beispielprogramm enthält dazu die Funktion "GetDisplayName", die auch beim Füllen des Baumes benutzt wird.
Zunächst müssen Sie auf die gespeicherten Werte zugreifen. Da Ihnen bei der Bearbeitung einer der o.g. Nachrichten im lParam ein Zeiger auf ein TNMTreeView-Record übergeben wird, haben Sie relativ einfach Zugriff darauf. Sie benutzen das Flag TVIF_PARAM und den Wert der Membervariablen itemNew.hItem:

TVN_SELCHANGED:
  begin
    tv.mask       := TVIF_PARAM;
    tv.hItem      := itemNew.hItem;
    if(TreeView_GetItem(hdr.hwndFrom,tv)) then
    begin

Über einen Typecast können Sie nun die Eigenschaften der TFolderId-Klasse benutzen, um mit Hilfe der Funktion "GetDisplayName" den Ordnernamen zu ermitteln. Wichtig in dem Fall sind hier die beiden Flags, speziell SHGDN_FORPARSING. Dieses sorgt dafür, dass der Name des Ordners inkl. aller Pfade zurückgeliefert wird.

      fid         := TFolderId(tv.lParam);
      if(fid <> nil) then
      SendMessage(hStatusBar,SB_SETTEXT,SB_SIMPLEID,
        LPARAM(pchar(GetDisplayName(fid.Folder,fid.pidl,
        SHGDN_NORMAL or SHGDN_FORPARSING))));
    end;
  end;

Würden Sie SHGDN_FORPARSING weglassen, dann würden Sie nur den Namen des Ordners sehen, so wie er auch bereits im Tree-View sichtbar ist.


Die einfache Variante

Wenn Sie den Text des ausgewählten Knotens ermitteln wollen und Ihnen dabei kein Weg wie der o.g. zur Verfügung steht, dann müssen Sie auf die Membervariable pszText des TNMTreeView-Records zugreifen.
Zuerst setzen Sie in der mask-Membervariablen das Flag TVIF_TEXT:

itemNew.mask       := TVIF_TEXT;

Als nächstes weisen Sie einen Textpuffer und dessen Größe zu. Wenn Sie dies nicht tun, dann sehen Sie entweder irgendwelche unsinnigen Zeichen oder bestenfalls gar nichts:

itemNew.pszText    := buf;
itemNew.cchTextMax := sizeof(buf);

Ob Sie danach die Membervariable pszText oder den Textpuffer nutzen, das bleibt Ihnen überlassen. Wichtig ist nur, dass Sie überhaupt einen Textpuffer angeben!
Mit Hilfe des Makros "TreeView_GetItem" können Sie dann den Text auslesen und an eine string-Variable übergeben:

if(TreeView_GetItem(hdr.hwndFrom,itemNew)) then
  SendMessage(hStatusBar,SB_SETTEXT,SB_SIMPLEID,LPARAM(@buf));