AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi CheckListBox und virtuelle Einträge - wieso kein Checked?
Thema durchsuchen
Ansicht
Themen-Optionen

CheckListBox und virtuelle Einträge - wieso kein Checked?

Offene Frage von "Voyager07"
Ein Thema von Sir Rufo · begonnen am 19. Mai 2010 · letzter Beitrag vom 14. Apr 2017
Antwort Antwort
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#1

AW: CheckListBox und virtuelle Einträge - wieso kein Checked?

  Alt 22. Mär 2012, 13:05
So wie der Quelltext der Checklistbox aussieht ist das ganz nicht vorgesehen das jemand auf virtuell stellt.
Eine direkte Abfrage ob checked bzw. des State gibt es nicht. Das läuft (wie himitsu bereits erwähnt hat) intern alles über einen Wrapper. Und dieser wird per lb_setitemdata gesetzt und über lb_getitemdata abgefragt. Bei Virtual hat lb_setitemdata allerdings keinen Effekt so das man selbst auf die messages reagieren müsste.

Unvollständiges Beispiel (auf Löschen von Items wird zum Beispiel nicht reagiert):
Delphi-Quellcode:
  TCheckListbox = class(vcl.CheckLst.TCheckListBox)
  private
    fDict: TDictionary<Integer,TListBoxItemData>;
    procedure LBGetItemData(var amsg: TMessage); message LB_GETITEMDATA;
    procedure LBSetItemData(var amsg: TMessage); message LB_SETITEMDATA;
  public
    constructor Create(aOwner: TComponent); override;
    destructor Destroy; override;
  end;
[...]
{ TCheckListbox }

constructor TCheckListbox.Create(aOwner: TComponent);
begin
  inherited;
  fDict := TDictionary<Integer,TListBoxItemData>.Create;
end;

destructor TCheckListbox.Destroy;
begin
  fDict.Free;
  inherited;
end;

procedure TCheckListbox.LBGetItemData(var amsg: TMessage);
begin
  fDict.TryGetValue(aMsg.WParam, aMsg.Result);
end;

procedure TCheckListbox.LBSetItemData(var amsg: TMessage);
begin
  fDict.AddOrSetValue(amsg.WParam, aMsg.LParam);
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Voyager07

Registriert seit: 14. Apr 2017
1 Beiträge
 
#2

AW: CheckListBox und virtuelle Einträge - wieso kein Checked?

  Alt 14. Apr 2017, 22:21
Ich stieß ebenfalls auf dieses Problem habe das so gelöst:

1: Ableiten einer eigenen Klasse aus TCustomListBox, als Vorlage dazu nutzte ich TCheckListBox aus der Unit CheckLst.

2: Ergänzt vor der Definition der neuen Klasse:
Delphi-Quellcode:
TYPE
  TCheckListBoxData= RECORD
    Data: longint;
    State: TCheckBoxState;
    Disabled: boolean;
    Header: boolean;
  END;

  TOnGetCheckListBoxData= function(const Index: longint): TCheckListBoxData of object;
  TOnSetCheckListBoxData= procedure(const Index: longint; const Data: TCheckListBoxData) of object;
3: Ergänzt in der neuen Klasse:
Delphi-Quellcode:
public
    OnGetCheckListBoxData: TOnGetCheckListBoxData;
    OnSetCheckListBoxData: TOnSetCheckListBoxData;
4: Die Methode SetState geändert:
Delphi-Quellcode:
procedure TITfMMultiCheckListBox.SetState(Index: Integer; AState: TCheckBoxState);

VAR
  lbData: TCheckListBoxData;

begin
  if AState <> GetState(Index) then
  begin
    IF Style= lbVirtual THEN begin
      IF assigned(OnSetCheckListBoxData) AND assigned(OnGetCheckListBoxData) THEN begin
        lbData:= OnGetCheckListBoxData(Index);

        lbData.State:= AState;

        OnSetCheckListBoxData(Index, lbData);
      end;
    end
    ELSE begin
      TCheckListBoxDataWrapper(GetWrapper(Index)).State := AState;
    end;

    InvalidateCheck(Index);
  end;
end;
5: Die Methode GetState geändert:
Delphi-Quellcode:
function TITfMMultiCheckListBox.GetState(Index: Integer): TCheckBoxState;

begin
  Result := TCheckListBoxDataWrapper.GetDefaultState;

  IF Style= lbVirtual THEN begin
    IF assigned(OnGetCheckListBoxData) THEN begin
      Result:= OnGetCheckListBoxData(Index).State;
    end;
  end
  ELSE begin
    if HaveWrapper(Index) then
      Result := TCheckListBoxDataWrapper(GetWrapper(Index)).State
    else
      Result := TCheckListBoxDataWrapper.GetDefaultState;
  end;

end;
Damit ist jetzt auch State "virtualisiert".

Für den Fall, dass auch die anderen Felder von TCheckListBoxData virtualisiert werden sollen, müssten analog die Methoden wie GetHeader/SetHeader modifiziert werden.
  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 13:06 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-2025 by Thomas Breitkreuz