Пока не забыл: ещё фиксы. По сути, обёртка над LB_SETITEMDATA+LB_GETITEMDATA.
Часть 1. Декларация:
procedure _val_arr_set(var Item:TData; var Val:TData);
function _val_arr_get(Var Item:TData; var Val:TData):boolean;
function _val_arr_count:integer;
//...
procedure _var_ValueArray(var _Data:TData; Index:word);
Часть 2. Имплементация
procedure THIListBox._val_arr_set;
var ind:integer;
begin
ind := ToIntIndex(Item);
if(ind >=0 )and(ind < Control.Count)then
Control.Perform(LB_SETITEMDATA, ind, ReadInteger(Val, NULL, 0));
end;
function THIListBox._val_arr_get;
var ind:integer;
begin
ind := ToIntIndex(Item);
Result := (ind >=0 )and(ind < Control.Count);
if Result then
dtInteger(Val,integer(Control.Perform(LB_GETITEMDATA, ind, 0)));
end;
function THIListBox._val_arr_count;
var i:smallint;
begin
Result := Control.Count;
end;
procedure THIListBox._var_ValueArray;
begin
if ValArr = nil then
ValArr := CreateArray(_val_arr_set,_val_arr_get,_val_arr_count,nil);
dtArray(_Data,ValArr);
end;
Это черновой вариант кода. Что хотел бы сделать, да не умею :
* По doAdd принимать не только строку, но и MT-пару [строка; dword для массива Value]
* По onClick соответственно выдавать такую же МТ-пару