Komfortabler Dateimanager mit vielen Funktionen

Verkürzte Baumansicht

By Sven on 26.10.2005 - 09:50 in Entwicklung

Windows bietet für die Anzeige von Elementen in der Baum- und Listenansicht zwei Möglichkeiten an. Die anzuzeigenden Informationen können entweder gleich beim Einfügen festgelegt werden oder später durch Nachfrage, wenn Windows die Informationen zum Anzeigen oder Sortieren benötigt. Zweiteres ist deutlich effektiver, wenn viele Elemente in die Ansicht eingefügt werden und die Informationen nicht sofort zur Verfügung stehen und erst ermittelt werden müssen.

Zur Abfrage von Name und Symbol verschickt die Baumansicht eine TVN_GETDISPINFO-Nachricht an das Elternfenster und dieses füllt dann die mitgelieferte TVITEM-Struktur mit den gewünschten Daten. Relevant für den Namen sind die Einträge pszText und cchTextMax:

pszText: Pointer to a null-terminated string that contains the item text if the structure specifies item attributes. If this member is the LPSTR_TEXTCALLBACK value, the parent window is responsible for storing the name. In this case, the tree-view control sends the parent window a TVN_GETDISPINFO notification message when it needs the item text for displaying, sorting, or editing and a TVN_SETDISPINFO notification message when the item text changes. If the structure is receiving item attributes, this member is the address of the buffer that receives the item text. Note that although the tree-view control allows any length string to be stored as item text, only the first 260 characters are displayed.

cchTextMax: Size of the buffer pointed to by the pszText member, in characters. If this structure is being used to set item attributes, this member is ignored.

Die Baumansicht kann durch Setzen des Flags TVIF_DI_SETITEM veranlasst werden, die abgefragte Information zu speichern. In diesem Fall erfolgt keine weitere Abfrage, wenn der Eintrag wieder angezeigt werden soll, stattdessen wird die gespeicherte Information verwendet.

Ein Anwender hat nun festgestellt, dass die Ordnernamen in der Baumansicht in SpeedCommander 11 nach ca. 70 Zeichen abgeschnitten werden. Im Debugger sah ich dann auch schnell den Grund dafür. Beim ersten Eintrag war der von der Baumansicht zur Verfügung gestellte Puffer 260 Zeichen groß, ab dem zweiten aber nur noch 64 Zeichen. Somit können auch nur die ersten 63 Zeichen des Ordnernamens in den Puffer kopiert und angezeigt werden.

Doch warum beschränkt die Baumansicht den Puffer ab dem zweiten Eintrag auf 64 Zeichen? Das ganze muss etwas mit der Einfügeposition in der TVINSERTSTRUCT-Struktur zu tun haben. SpeedCommander verwendet hier TVI_SORT für hInsertAfter, die Einträge werden so gleich beim Einfügen alphabetisch sortiert. Wenn ich den Wert nun auf TVI_LAST ändere, dann ist der Textpuffer in der TVN_GETDISPINFO-Nachricht bei allen Elementen plötzlich 260 Zeichen groß.

Wenn man sich das nun noch einmal in Ruhe durch den Kopf gehen lässt, dann ist die Erklärung für das Abschneiden der Ordnernamen auch recht einfach. Um die Elemente gleich beim Einfügen nach dem Namen zu sortieren, muss die Baumansicht auch die Namen der Elemente kennen. Diese werden über die TVN_GETDISPINFO-Nachricht ermittelt, die Baumansicht erachtet hier anscheinend einen Puffer von 64 Zeichen als ausreichend, um die Elemente sortieren zu können. Durch Setzen des Flags TVIF_DI_SETITEM werden die für die Sortierung ermittelten Einträge auch gleich gespeichert und die Anzeigefunktion greift nun auf den auf 63 Zeichen begrenzten Text zurück.

Beheben lässt sich das ganze, indem man auf die automatische Sortierung beim Einfügen verzichtet. Der eigentliche Fehler liegt aber eher in der Baumansicht selbst, der Puffer für die Sortierung sollte in der nächsten Windows-Version auf die üblichen 260 Zeichen vergrößert werden.

Es gibt einen Kommentar zu diesem Beitrag

Trackback URL | RSS-Feed für Kommentare

  1. Uwe Keim sagt:

    Da bewundere ich ja echt Deine Geduld bei so was. Für mich ist da alles ziemlich krank.

    Da hilft .NET auch nur ein bisschen; dafür haben die dann wieder „vergessen“ so ein Steuerelement wie den TreeView komplett auch zu wrappen.

    Alle doof 🙁

Top