![]() |
Problem mit "LVS_EX_AUTOCHECKSELECT"
Hi, ich habe folgendes Problem:
Unter Vista gibt es die Möglichkeit, in einer LISTVIEW-Komponente oben in der Kopfzeile eine Checkbox anzeigen zu lassen. Dies kann man mit dem fogenden Code erzeugen:
Delphi-Quellcode:
Mein Problem ist folgendes: Wenn bei einer entsprechenden LISTVIEW-Komponente (mit angezeigter CheckBox) sich die Abmessungen ändern, z.B. durch Resize, verschwindet die Checkbox aus der Kopfzeile. Erst durch das zurücknehmen und erneute setzen des Styles LVS_EX_AUTOCHECKSELECT wird die Checkbox wieder angezeigt!
SendMessage(ListView1.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_AUTOCHECKSELECT, LVS_EX_AUTOCHECKSELECT);
Woran liegt es, dass die Checkbox nach einem jedem resize verschwindet und nicht permanent angezeigt wird? Gruß Chris |
Re: Problem mit "LVS_EX_AUTOCHECKSELECT"
Das liegt daran, dass die VCL folgende Funktion verwendet:
Delphi-Quellcode:
Und dann so aufruft:
//Unit Commctrl
function ListView_SetExtendedListViewStyle(hwndLV: HWND; dw: DWORD): BOOL; begin Result := BOOL(SendMessage(hwndLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dw)); end;
Delphi-Quellcode:
Die VCL ist hier nicht darauf vorbereitet, dass es mal neue Styles geben könnte. :(
// Delphi 5 Source
procedure TCustomListView.ResetExStyles; var Styles: DWORD; TempImages: TCustomImageList; begin if HandleAllocated then begin TempImages := nil; if StateImages <> nil then begin TempImages := StateImages; StateImages := nil; end; Styles := LVS_EX_SUBITEMIMAGES or LVS_EX_INFOTIP; // *** if FCheckboxes then Styles := LVS_EX_CHECKBOXES; if FGridLines then Styles := Styles or LVS_EX_GRIDLINES; if FHotTrack then Styles := Styles or LVS_EX_TRACKSELECT; if FRowSelect then Styles := Styles or LVS_EX_FULLROWSELECT; if FFlatScrollBars then Styles := Styles or LVS_EX_FLATSB; if FFullDrag then Styles := Styles or LVS_EX_HEADERDRAGDROP; if FShowWorkAreas then Styles := Styles or LVS_EX_MULTIWORKAREAS; if htHandPoint in FHotTrackStyles then Styles := Styles or LVS_EX_ONECLICKACTIVATE else if FHotTrackStyles * [htUnderlineHot, htUnderlineCold] <> [] then Styles := Styles or LVS_EX_TWOCLICKACTIVATE; if htUnderlineHot in FHotTrackStyles then Styles := Styles or LVS_EX_UNDERLINEHOT; if htUnderlineCold in FHotTrackStyles then Styles := Styles or LVS_EX_UNDERLINECOLD; ListView_SetExtendedListViewStyle(Handle, Styles); if TempImages <> nil then StateImages := TempImages; end; end; In der Zeile, die oben mit drei *** markiert ist, müsste man eigentlich die bestehenden Styles abrufen und bestimmte Styles ausmaskieren (... AND not (LVS_EX_GRIDLINES or LVS_EX_TRACKSELECT ...)) so dass die Bits, die die VCL nicht kennt erhalten bleiben. |
Re: Problem mit "LVS_EX_AUTOCHECKSELECT"
Hi, Shmia.
Ich glaube nicht, dass das direkt die Ursache von meinem Problem ist. (Natürlich macht die unsaubere Implementierung Ärger.) Ich habe die beiden Funktionen unabhängig voneinander so manipuliert, dass das LVS_EX_AUTOCHECKSELECT-Flag immer gesetzt wurde. Das Ergebnis war immer das selbe: Zunächst war die Checkbox sichtbar, nach einem resize nichtmehr. Ohne Manipulation: Wenn man nach dem Resize die ExStyles-Flags ausliest, dann ist das entsprechende AUTOCHECKSELECT-Flag immer noch gesetzt. Es geht also scheinbar nichts "verloren". Für mich sieht es eher so aus, dass beim neuzeichnen der Komponente etwas daneben geht. Mir ist folgende Sache aufgefallen: Ohne das LVS_EX_AUTOCHECKSELECT-Flag wird vor jedem Eintrag eine Checkbox angezeigt (CheckBoxes := True). Wird das Flag gesetzt, passieren zwei Sachen: 1. In der Kopfzeile wird die neue Checkbox angezeigt und 2. die Boxen vor den Einträgen werden ausgeblendet (Der Platz bleibt leer; der Text wird nicht nach links verschoben). Ändere ich nun die Abmessungen (resize) dann verschwindet NUR die besagte Checkbox in der Kopfzeile. Der Rest bleibt unverändert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:23 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 by Thomas Breitkreuz