Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit "LVS_EX_AUTOCHECKSELECT" (https://www.delphipraxis.net/104019-problem-mit-lvs_ex_autocheckselect.html)

x13-g44 26. Nov 2007 12:11


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:
SendMessage(ListView1.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_AUTOCHECKSELECT, LVS_EX_AUTOCHECKSELECT);
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!

Woran liegt es, dass die Checkbox nach einem jedem resize verschwindet und nicht permanent angezeigt wird?



Gruß Chris

shmia 26. Nov 2007 14:49

Re: Problem mit "LVS_EX_AUTOCHECKSELECT"
 
Das liegt daran, dass die VCL folgende Funktion verwendet:
Delphi-Quellcode:
//Unit Commctrl
function ListView_SetExtendedListViewStyle(hwndLV: HWND; dw: DWORD): BOOL;
begin
  Result := BOOL(SendMessage(hwndLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dw));
end;
Und dann so aufruft:
Delphi-Quellcode:
// 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;
Die VCL ist hier nicht darauf vorbereitet, dass es mal neue Styles geben könnte. :(
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.

x13-g44 26. Nov 2007 17:14

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