当listview的viewstyle为vsReport时,能否读取和保存listview的设置?

解决方案 »

  1.   

    listview的设置指的是什么,如果单指运行时用户可以修改的那些属性则不管是否在vsreport都可保存,保存无非就是把修改过的属性的值保存到ini文件或注册表中,不知你的意思是不是这样的?
      

  2.   

    是指保存listview里面的数据到text文件或ini文件或注册表,然后需要的时候读取
      

  3.   

    这是从我的代码中摘出来的,摘出后没有调试,自己试去吧var dataHead: string = '我的自定义文件格式';
    procedure TForm1.SaveData(Sender: TObject);
    var
      li_count,li_idx: integer;
      MyFile:TFileStream;
      ls_select: string;
      function WriteString(TheString:pchar):integer;
      begin
        result := strlen(TheString);
        MyFile.write(result,sizeof(integer));
        if result > 0 then result := MyFile.write(TheString[0],strlen(TheString))
      end;
    begin
      if not SaveDialog1.execute then exit;
      MyFile := TFileStream.create(SaveDialog1.filename,fmCreate);
      with MyFile do try
        WriteString(pchar(DataHead));
        with listview1.items do begin
          li_count := count;
          ls_select := stringofchar('0',li_count);
          write(li_count,sizeof(li_count));
          for li_idx := li_count - 1 downto 0 do with item[li_idx] do begin
            if selected then ls_select[li_idx + 1] := '1';
            WriteString(pchar(subitems.text));
            //在这里保存该项的data包含的数据
            WriteString(pchar(caption));
            write(imageindex,sizeof(integer));
          end;
          WriteString(pchar(ls_select));
        end;
      finally
        free;
      end;
    end;procedure TForm1.LoadData(TheFile:string);
    var
      li_count,li_idx,li_buff: integer;
      MyFile:TFileStream;
      ls_select: string;
      function ReadString:string;
      var li_len:integer;
      begin
        MyFile.Read(li_len,sizeof(integer));
        if (li_len = 0) or (li_len > 10000) then result := '' else begin
          result := stringofchar(#0,li_len);
          MyFile.Read(result[1],li_len);
        end;
      end;
    begin
      MyFile := TFileStream.create(TheFile,fmOpenRead + fmShareDenyNone);
      with MyFile do try
        if ReadString <> DataHead then begin
          showmessage('无效的数据文件格式');
          exit;
        end;
        with listview1.items do begin
          clear;
          Read(li_count,sizeof(li_count));
          for li_idx := 1 to li_count do with insert(0) do begin
            subitems.text := ReadString;
            //在这里读取并设置data属性
            caption := ReadString;
            Read(li_buff,sizeof(integer));
            imageindex := li_buff;
          end;
          ls_select := ReadString;
          for li_idx := 1 to li_count do
            if ls_select[li_idx] = '1' then item[li_idx - 1].selected := true;
        end;
      finally
        free;
      end;
    end;
      

  4.   

    当然,你还可以在这两个方法中再附加一些listview的属性值,比如当前排序字段、字段显示颜色等,这样会更好
      

  5.   

    procedure TManagerForm.actExportListExecute(Sender: TObject);
    var
      FileName, Decollator: string;
      i, j: Integer;
      F: TextFile;
    begin
      if SaveDialog.Execute then
      begin
        FileName := SaveDialog.FileName;
        if SaveDialog.FilterIndex = 1 then
        begin
          Decollator := #9;
          if RightStr(FileName, 4) <> '.txt' then
            FileName := FileName + '.txt';
        end
        else
        begin
          Decollator := ',';
          if RightStr(FileName, 4) <> '.csv' then
            FileName := FileName + '.csv';
        end;
        try
          AssignFile(F, FileName);
          ReWrite(F);
          for i := 0 to WorkList.Columns.Count - 1 do
          begin
            if i = WorkList.Columns.Count - 1 then
              Writeln(F, WorkList.Columns[i].Caption)
            else
              Write(F, WorkList.Columns[i].Caption + Decollator);
          end;
          for i := 0 to WorkList.Items.Count - 1 do
          begin
            if WorkList.Items[i].SubItems.Count > 0 then
              Write(F, WorkList.Items[i].Caption + Decollator)
            else
              Writeln(F, WorkList.Items[i].Caption);
            for j := 0 to WorkList.Columns.Count - 2 do
            begin
              if j = WorkList.Columns.Count - 2 then
                Writeln(F, WorkList.Items[i].SubItems[j])
              else
                Write(F, WorkList.Items[i].SubItems[j] + Decollator);
            end;
          end;
        finally
          CloseFile(F);
        end;
      end;
    end;