Avatar billede Slettet bruger
04. august 2005 - 13:40 Der er 11 kommentarer og
1 løsning

indlæs txt fil i listview

jeg har en listview med 4 items

1 2 3 4

hvordan kan man indlæse en txt fil ind i de forskellige items?
og kan man fordele indhold i txt fil ud på de forskellige items?
eller skal man have 4 txt filer

f.eks vil jeg gerne i item 2 have indlæst en del navne som jeg har i en txt fil
Avatar billede hrc Mester
04. august 2005 - 14:00 #1
"Hva ba?" var mit første indfald. Du har ikke beskrevet det ret godt - men lad os prøve.

Jeg antager:

Du har et TListView med 4 kolonner (en caption og tre subitems) og du har en tekst-fil hvis indhold er linier med hver 4 klumper data adskildt af et komma, elsempelvis: "Hvor,er,lille,Grethe"

type
  TDataClass = class
  private
    fList : TStringList;
  public
    constructor Create(aFilename : string); reintroduce;
    destructor Destroy; override;
    procedure FillListView(aListView : TListView);
  end;

constructor TDataClass.Create(aFilename : string);
begin
  inherited Create;
  fList := TStringList.Create;
  fList.LoadFromFile(aFileName);
end;

destructor TDataClass.Destroy;
begin
  fList.Free;
  inherited;
end;

procedure TDataClass.FillListView(aListView : TListView);
var
  i, j : integer;
  tmp : TStringList;
begin
  with aListView do
  begin
    tmp := TStringList.Create;
    tmp.CommaDelimiter := ',';
    Items.BeginUpdate;
    try   
      Items.Clear;
      for i := 0 to fList.Count - 1 do
      begin
        tmp.CommaText := fList[i];
        for j := 0 to tmp.Count - 1 do
          with Items.Add do
            if j = 0 then
              Caption := Tmp[j]
            else
              SubItems.Add(Tmp[j]);
      end;
    finally
      Items.EndUpdate;
      tmp.Free;
    end;
  end;
end;
   
Disclaimer: Jeg er ikke i nærheden af en Delphi så CommaDelimiter og CommaText er taget udfra hukommelsen. De findes men er måske stavet forkert.

Jeg lavede det som en klasse - syntes det var let sådan, men du kan naturligvis også bruge denne:

procedure FillListView(const aFileName : string; aListView : TListView);
var
  i, j : integer;
  data, tmp : TStringList;
begin
  data := nil; tmp := nil;

  with aListView do
  begin
    data := TStringList.Create;
    data.LoadFromFile(aFileName);
    tmp := TStringList.Create;
    tmp.CommaDelimiter := ',';
    Items.BeginUpdate;
    try   
      Items.Clear;
      for i := 0 to fList.Count - 1 do
      begin
        tmp.CommaText := fList[i];
        for j := 0 to tmp.Count - 1 do
          with Items.Add do
            if j = 0 then
              Caption := Tmp[j]
            else
              SubItems.Add(Tmp[j]);
      end;
    finally
      Items.EndUpdate;
      if assigned(tmp) then
        tmp.Free;
      if assigned(data) then
        data.Free;
    end;
  end;
end;
Avatar billede Slettet bruger
04. august 2005 - 18:56 #2
jeg har kun 4 items med caption 1 2 3 4

kan man ikke indlæse en txt så den står i listeform ud for f.eks items 2 og ud for items 3 skal den tage en anden del fra txt filen,
Avatar billede hrc Mester
06. august 2005 - 18:33 #3
Dit TListView skal have ViewStyle = vsReport. Derefter dobbeltklikker du på komponenten og opretter de 3 subitems. Så langt så godt - og så langt er du vist også kommet.

Du skriver (lettere omskrevet): Kan man ikke indlæse en tekst så den står i listeform ud for f.eks, subitem 1. Ud for listitem 2 skal den vise en anden del af tekstfilen.

I subitem[1] og 2 for den sags skyld, vil du gerne have flere linier end den ene som altid vises. Så må du ind og sætte OwnerDraw = true og så programmere den i OnDrawItem.

Vi har en linie i et TListView der ser således ud:

Caption  SubItem[0]    SubItem[1] (tekstfildata)  SubItem[2] (tekstfildata)
----------------------------------------------------------------------------
Kalle    Petersen      Fiat                      Billige arbejdsheste
                        Opel
                        Tatra
                        Zil
----------------------------------------------------------------------------

Undskyld der udpensles, men inden jeg går igang med et eksempel, så har jeg for tit lavet x og spørgeren ønsket y.
Avatar billede Slettet bruger
06. august 2005 - 20:05 #4
ja det er netop det jeg søger
Avatar billede hrc Mester
06. august 2005 - 23:57 #5
Her må jeg give fortabt. Kan godt bruge OnDrawItem til at placere tekst under hinanden, men da jeg ikke kan ændre liniens højde er det en fiasko.

Troede umiddelbart at det ville være muligt at lave individuel højdeindstilling, måske skulle jeg sende nogle messages afsted, men absolut muligt, men der var jeg lidt for optimistisk med Microsofts komponent.

Kan ikke udelukke at hvis man erstatter TListItem med en nedarvet, at man derfra kan lave et eller andet. Har prøvet en del på det sidste og det er svært men muligt. Det er lige før jeg hellere laver TListView på den rigtige måde. At man ikke kan angive en nedarving af TListItem i TListView således, at det er den der oprettes ved Items.Add, det er noget tankeløst skod!

Beklager - måske kan nogle af de kloge hoveder bidrage??
Avatar billede Slettet bruger
07. august 2005 - 00:52 #6
ok tak for dit forsøg, har du et bud på en anden mulighed uden brug af database en opstilling af data i kolonner hentet fra en txt fil
Avatar billede hrc Mester
07. august 2005 - 02:08 #7
Jeg ville synes at en TListView faktisk er løsningen - men med data ordnet på en anden måde. Kan du ikke smide et eksempel på de data du vil have vist - det kan måske hjælpe.

Hvis data er hierarkisk ordnet, så er det vel et TTreeView.
Avatar billede Slettet bruger
07. august 2005 - 03:03 #8
de data jeg vil have vist er:

navne  bord  værdi
pedro  1    2000
alias  1    1800
viggo osv..  osv..
Avatar billede hrc Mester
07. august 2005 - 11:02 #9
Øh.. Hvis du bare har en kommasepareret tekstfil som denne

pedro,1,2000
alias,1,1800
viggo,2,1210

og hver linie skal på hver sin TListView linie (TListItem), så er vi tilbage ved det første eksempel jeg lavede. Nu har jeg rettet og testet det og proceduren ser således ud nu:

procedure FillListView(const aFileName : string; aListView : TListView);
var
  i, j : integer;
  data, work : TStringList;
begin
  with aListView do
  begin
    data := TStringList.Create;
    data.LoadFromFile(aFileName);
    work := TStringList.Create;
    work.Delimiter := ',';
    Items.BeginUpdate;
    try   
      Items.Clear;
      for i := 0 to data.Count - 1 do
      begin
        work.CommaText := data[i];
        with Items.Add do
          for j := 0 to work.Count - 1 do
            if j = 0 then
              Caption := work[j]
            else
              SubItems.Add(work[j]);
      end;
    finally
      Items.EndUpdate;
      if assigned(work) then
        work.Free;
      if assigned(data) then
        data.Free;
    end;
  end;
end;

Tekstfilen (test.txt) er som vist ovenfor og proceduren kaldes således:

procedure TfrmMain.Button3Click(Sender: TObject);
begin
  FillListView('test.txt',ListView1);
end;
Avatar billede Slettet bruger
07. august 2005 - 11:41 #10
jeg får en fejl på "delimiter" skal der tilføjes noget til uses?

har d5 interprise
Avatar billede hrc Mester
07. august 2005 - 21:52 #11
Prøv at udkommentere linien. Jeg mener at standard-adskilleren er et komma. Jeg tog det med for at illustrere at man kunne separere felter med andet end netop komma.

Endelig kunne du også lave denne (hvor det antages at alle linier indeholder netop 4 felter, adskilt af et komma):

  data := TStringList.Create;
  data.LoadFromFile(aFileName);
  for i := 0 to data.Count - 1 do
  begin
    st := data[i];
    p := pos(',',st);
    Caption := copy(st,1,p - 1);
    System.Delete(st,1,p);
    p := pos(',',st);
    SubItems.Add(copy(st,1,p - 1);
    System.Delete(st,1,p);
    p := pos(',',st);
    SubItems.Add(copy(st,1,p - 1);
    System.Delete(st,1,p);
    System.Delete(st,1,p);
  end;

men den er ikke så køn vel?
Avatar billede hrc Mester
07. august 2005 - 21:54 #12
Lige en fejl ved de sidste linier
 
    ...
    System.Delete(st,1,p);
    SubItems.Add(st);
  end;
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