Avatar billede mysitesolution Nybegynder
18. januar 2003 - 17:53 Der er 15 kommentarer og
1 løsning

txt -> listview

Jeg har en txt fil som fx kunne se ud som denne:

23|Adobe Photoshop|noget
23|Adobe Photoshop|noget
06|Microsoft|noget
23|Adobe Photoshop|nogetandet

denne fil vil jeg så have ind i en listview, altså en linie i filen skal være en linie i listboxen,, og så skal det inden det første | være caption og de næste subitems, det vil sige subitems[0] og subitems[1]
Avatar billede dj Nybegynder
18. januar 2003 - 18:10 #1
Jeg går ud fra dit problem er at parse textfilen, til dette kan du bruge en lille algoritme jeg har skrevet:

--------------------------------------
procedure Tokenize(text: string; token: char; Result: Tstrings);
{
Splits a string into a stringlist seperated by the given token.

Part of JCL - Project JEDI (www.delphi-jedi.org)

Author: Daniel Møller aka _DJ_
        SGUFT Software
}
var
  temp1,temp2: string;
begin
  result.clear;
  temp1:=text;
  while (Length(temp1) > 0) and (pos(token,temp1)>0) do begin
    temp2:=temp1;
    temp1 := Copy(temp1, 0, pos(token,temp1)-1);
    Result.Add(temp1);
    temp1 := copy(temp2,pos(token,temp2)+1,length(temp2));
  end;
  if temp1 <> '' then Result.Add(temp1);
end;
--------------------------------------

Hvis vi nu siger at du har en TStringList kaldet "linjer" der indeholder linjerne fra txtfilen (linjer.LoadFromFile('c:\myfile.txt');), så kan du f.eks. gøre følgende:

var
  Params: Tstringlist;
  I: Integer;
begin
  for I := 0 to linjer.count-1 do begin
    tokenize(linjer[I],'|',params);
    for I := 0 to params.count-1 do begin  end;
      if params.count>2 do begin
        MyListItem.Caption := params[0];
        MyListItem.SubItems[0] := params[1];
        MyListItem.SubItems[1] := params[2];
      end;
    end;
end;

Håber du fangede pointen og jeg kunne være til hjælp :)

Mvh. Daniel Møller aka _DJ_
Avatar billede dj Nybegynder
18. januar 2003 - 18:12 #2
Hov der røg lige et "end;" ind midt i koden ;)
Btw så er koden ikke testet så jeg kan ikke garantere den compiler, men princippet skulle gerne være der :)

Btw. er det ikke en grusom masse reklamer der er kommet her på sitet ? :/
Avatar billede stone Forsker
18. januar 2003 - 18:19 #3
jo...men det er nok desværre nødvendigt. Den HP reklame er temlig anmasende.
Avatar billede mysitesolution Nybegynder
18. januar 2003 - 18:51 #4
virker ikke.... vil du ikke lave et project med den og så ligge det op?
Avatar billede dkn Nybegynder
18. januar 2003 - 19:12 #5
er det altid "|" som splitter teksten?
Avatar billede mysitesolution Nybegynder
18. januar 2003 - 19:14 #6
ja, men hvis det er så må det da også være et andet tegn som fx ¤ :)
Avatar billede dkn Nybegynder
18. januar 2003 - 19:21 #7
procedure TForm1.Button1Click(Sender: TObject);
const
  splitter = '|';
var
  st1, st2, st3, Line: string;
  i: integer;
  st: tstringlist;
  item: tlistitem;
begin
  st := tstringlist.create;
  st.loadfromfile('teksten.txt');
  for i := 0 to st.count - 1 do
  begin
    line := st.Strings[I];
    st1 := copy(line, 1, pos(splitter, line) - 1);
    st2 := copy(line, pos(splitter, line) + 1, lastdelimiter(splitter, line) - 4);
    st3 := copy(line, lastdelimiter(splitter, line) + 1, length(line));
    item := ListView1.Items.Add;
    item.Caption := st1;
    item.SubItems.Add(st2);
    item.SubItems.Add(st3);
  end;
end;
Avatar billede mysitesolution Nybegynder
18. januar 2003 - 19:30 #8
hmm.... når jeg skriver:

bus|bus|bus
hej|hej|hej
dumme|dumme|dumme

så får jeg:

bus  bus|  bus
hej  hej|  hej
dumme  dumme|du  dumme
Avatar billede dkn Nybegynder
18. januar 2003 - 19:32 #9
okay tænkte det det ville give problemmer, den her metode skulle være sikker:

procedure TForm1.Button1Click(Sender: TObject);
const
  splitter = '|';
var
  st1, st2, st3, Line: string;
  i: integer;
  st: tstringlist;
  item: tlistitem;
begin
  st := tstringlist.create;
  st.loadfromfile('teksten.txt');
  for i := 0 to st.count - 1 do
  begin
    line := st.Strings[I];
    st1 := copy(line, 1, pos(splitter, line) - 1);
    line := copy(line, pos(splitter, line)+1, length(line));
    st2 := copy(line, 1, pos(splitter, line) - 1);
    st3 := copy(line, pos(splitter, line)+1, length(line));
    item := ListView1.Items.Add;
    item.Caption := st1;
    item.SubItems.Add(st2);
    item.SubItems.Add(st3);
  end;
end;
Avatar billede dj Nybegynder
18. januar 2003 - 19:51 #10
mysitesolution: Nej, jeg vil ikke lave et projekt med det i. Jeg har givet dig alt hvad du skal bruge og tilmed mere til i form af et eksempel der viser princippet i parsingen. Jeg foretrækker at give hjælp til selvhjælp, det er dig og ikke mig der skal lære noget af det og så er det jo tilladt at tænke selv :)
Avatar billede mysitesolution Nybegynder
18. januar 2003 - 19:59 #11
Den virkede perfekt! tak
Avatar billede mysitesolution Nybegynder
18. januar 2003 - 20:01 #12
dkn kan du ikke også lige lave den med 10 felter, altså hvis du vil :)
Avatar billede dkn Nybegynder
18. januar 2003 - 20:08 #13
jo...
Avatar billede mysitesolution Nybegynder
18. januar 2003 - 20:09 #14
tak!!
Avatar billede dkn Nybegynder
18. januar 2003 - 20:12 #15
skulle være nem at ændre hvis du ønsker mere end 10

procedure TForm1.Button1Click(Sender: TObject);
const
  splitter = '|';
var
  Line: string;
  text: array[1..10] of string;
  i, i2: integer;
  st: tstringlist;
  item: tlistitem;
begin
  st := tstringlist.create;
  st.loadfromfile('teksten.txt');
  for i := 0 to st.count - 1 do
  begin
    line := st.Strings[I];
    for i2 := 1 to high(text) do
    begin
      text[i2] := copy(line, 1, pos(splitter, line) - 1);
      line := copy(line, pos(splitter, line) + 1, length(line));
      if i2 = high(text) then
        text[i2] := line;
    end;
    item := ListView1.Items.Add;
    item.Caption := text[1];
    for i2 := 2 to high(text) do
      item.SubItems.Add(text[i2]);
  end;
end;
Avatar billede mysitesolution Nybegynder
18. januar 2003 - 22:44 #16
Tusinder tak!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester