从checklistbox到tcxchecklistbox(将状态保存到TMemoryStream)

时间:2016-02-22 10:51:38

标签: delphi devexpress delphi-xe

任何人都可以帮助我如何将其转换为与tcxchecklistbox一起使用?

我的保存程序看起来像......

  procedure Tfrm_A.SaveCheckListBoxData(S: TMemoryStream;
  CheckListBox: TCheckListBox);
  var
    i: longint;
    b: boolean;
    buf : string;
  begin
    S.Clear;
    buf := CheckListBox.Items.Text;
    i := Length(buf);

    S.Write(i, SizeOf(i));
    if i > 0 then begin
    S.Write(buf[1], i);

   for i:= 0 to Pred(CheckListBox.Items.Count) do
   begin
     b:= CheckListBox.Checked[i];
     s.Write(b,1);
   end;
  end;
 end;

我的加载程序看起来像......

procedure Tfrm_A.LoadCheckListBoxData(S: TMemoryStream;
CheckListBox: TChecklistBox);
var
  i: longint;
  b: Boolean;
  buf : string;
begin
  S.Position := 0;
  S.Read(i, SizeOf(i));

  if i > 0 then begin
    SetLength(buf, i);
  S.Read(buf[1], i);
  CheckListBox.Items.Text := buf;

 for i:= 0 to Pred(CheckListBox.Items.Count) do
 begin
   s.Read(b,1);
   CheckListBox.Checked[i] := b;
  end;
 end;
end;

我的问题是

buf := CheckListBox.Items.Text; 

TcxChecklistbox有checklistbox.items[Index].text属性

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用TStringStream执行此操作。基本上,这只是一个问题,即迭代cxCheckBoxList Items并向StringStream写一个字符,指示是否选中了复选框,然后一次读回一个字符。< / p>

function StateToString(Checked : Boolean) : String;
begin
  if Checked then
    Result := '+'
  else
    Result := '-';
end;

procedure TForm1.SaveStatesToStream(SS : TStringStream);
var
  i : integer;
begin
  SS.Clear;
  SS.Position := 0;
  for i := 0 to cxCheckListBox1.Items.Count - 1 do begin
    SS.WriteString(StateToString(cxCheckListBox1.Items[i].Checked));
  end;
  Memo1.Lines.Add('>' + SS.DataString + '<');
end;

procedure TForm1.LoadStatesFromStream(SS : TStringStream);
var
  i : integer;
  S : String;
begin
  CheckBoxList.ClearCheckmarks;
  SS.Position := 0;
  i := 0;
  while (i <= cxCheckListBox1.Items.Count - 1) and (SS.Position < SS.Size) do begin
    S := SS.ReadString(1);
    cxCheckListBox1.Items[i].Checked := S = '+';
    Inc(i);
  end;
end;

在Delphi Seattle测试