• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 669
  • Last Modified:

Saving ListView Items to String (and Restoring ListView Items from String) ????

I allow my users to build a filter string, from a form. They seelct combobox items and enter values in edit boxes, and click the add button to add the filter criteria to a ListView control (3 columns).

Field, Operator, Value

Example:  Year = 2008

The problem is, that the third colum could have values which include a space in the string

example:  Finish = Antique Silver

When there is a space, things get truncated and i loose half of the string

see code snipplets
function ListViewToFilter(LV: TListView): String;
var
  Items: TStringList;
  I: Integer;
  Part1, Part2, Part3: String;
begin
  Items := TStringList.Create;
  for I := 0 to LV.Items.Count - 1 do
  begin
   Part1:= LV.Items[I].Caption;
   Part2:= LV.Items[I].SubItems[0];
   Part3:= LV.Items[I].SubItems[1];
   if Part3 = '' then Part3:= QuotedStr(Part3);
   Items.Add(Part1 +',' + Part2 + ',' + Part3);
  end;
  result:= Items.Text;
end;
 
procedure FilterToListView(FStr: String; LV: TListView);
var
 SL, RL: TStringList;
 LI: TListItem;
 I: Integer;
begin
 SL:= TStringList.Create;
 SL.Text:= Copy(FStr, 2, pos(']', FStr)-2);
 LV.Items.Clear;
 for I:= 0 to SL.Count-1 do
 begin
  LI:= LV.Items.Add;
  RL:= TSTringList.Create;
  RL.CommaText:= SL[I];
  LI.Caption:= RL[0];
  LI.SubItems.Add(RL[1]);
  LI.SubItems.Add(RL[2]);
  RL.Free;
 end;
 SL.Free;
end;

Open in new window

0
geocoins-software
Asked:
geocoins-software
  • 6
1 Solution
 
mikelittlewoodCommented:
That is because you set the value sl.text, it sees the space as a new word and adds a second entry for it.
0
 
geocoins-softwareAuthor Commented:
yes, i figured it was that - and i tried CommaText, but it doesn't work either.

Do you have a fix?
0
 
Geert GruwezOracle dbaCommented:
use Delimited Text and AnsiDequotedStr
and use 2 StringLists to inflate or deflate
function ListViewToFilter(LV: TListView): String;
var
  Filter: Items: TStringList;
  I: Integer;
begin
  Filter := TStringList.Create;
  try
    Items := TStringList.Create;
    try
      Items.Delimiter := ';';
      for I := 0 to LV.Items.Count - 1 do
      begin
        Items.Clear;
        Items.Add(QuotedStr(LV.Items[I].Caption)));
        Items.Add(QuotedStr(LV.Items[I].SubItems[0]));
        Items.Add(QuotedStr(LV.Items[I].SubItems[1]));
        Filter.Add(Items.DelimitedText);
      end;
    finally
      FreeAndNil(Items);
    end;
    result:= Filter.Text;
  finally
    FreeAndNil(Filter);
  end;
end;
 
procedure FilterToListView(FStr: String; LV: TListView);
var
 SL, RL: TStringList;
 LI: TListItem;
 I: Integer;
begin
  LV.Items.Clear; 
  SL:= TStringList.Create;
  try
    SL.Text := FStr; 
    RL:= TSTringList.Create;
    try
      RL.Delimiter := ';';
      for I:= 0 to SL.Count-1 do
      begin
        RL.DelimitedText := SL[I];
        LI:= LV.Items.Add;
        LI.Caption:= AnsiDequotedStr(RL[0]);
        LI.SubItems.Add(AnsiDequotedStr(RL[1]));
        LI.SubItems.Add(AnsiDequotedStr(RL[2]));
      end;
    finally
      FreeAndNil(RL);
    end;
  finally
    FreeAndNil(SL);
  end; 
end;

Open in new window

0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
geocoins-softwareAuthor Commented:
Geert_Gruwez:

I have posted screenshots of your code in action

Screenshot 1 is what the filter string would look like stored in the registry after using the

ListViewToFilter

Screenshot2 is what the ListView would look like after using the

FilterToListView

thanks



screenshot1.jpg
screenshot2.jpg
0
 
geocoins-softwareAuthor Commented:
Should look like this
screenshot3.jpg
0
 
geocoins-softwareAuthor Commented:
Geert_Gruwez:

Disregard my last two comments. I found a bug on my side....i will get back to you

0
 
geocoins-softwareAuthor Commented:
GREAT!  Thanks.
0
 
geocoins-softwareAuthor Commented:
I am creating another question related
0

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

  • 6
Tackle projects and never again get stuck behind a technical roadblock.
Join Now