04. august 2005 - 13:40Der 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
"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;
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;
Synes godt om
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,
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.
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??
Synes godt om
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
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.
Synes godt om
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..
Ø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;
Synes godt om
Slettet bruger
07. august 2005 - 11:41#10
jeg får en fejl på "delimiter" skal der tilføjes noget til uses?
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;
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.