AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem mit "LVS_EX_AUTOCHECKSELECT"
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit "LVS_EX_AUTOCHECKSELECT"

Ein Thema von x13-g44 · begonnen am 26. Nov 2007 · letzter Beitrag vom 26. Nov 2007
Antwort Antwort
x13-g44

Registriert seit: 16. Jun 2007
Ort: Bad Wurzach
3 Beiträge
 
Delphi 2007 Architect
 
#1

Problem mit "LVS_EX_AUTOCHECKSELECT"

  Alt 26. Nov 2007, 11:11
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:

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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Problem mit "LVS_EX_AUTOCHECKSELECT"

  Alt 26. Nov 2007, 13:49
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.
Andreas
  Mit Zitat antworten Zitat
x13-g44

Registriert seit: 16. Jun 2007
Ort: Bad Wurzach
3 Beiträge
 
Delphi 2007 Architect
 
#3

Re: Problem mit "LVS_EX_AUTOCHECKSELECT"

  Alt 26. Nov 2007, 16:14
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz