Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

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