07. april 2008 - 14:42Der er
12 kommentarer og 1 løsning
BlockRead fra csv/txt-fil (Delphi2)
Hej derude,
mit problem er, at jeg er ude for, at skulle indlæse txt/cvs-filer på op imod 400.000 kb ind i en Memo-box.
Dette er en meget laaansommelig affære.
Har hørt om BlockRead; men hvordan funker det? Helst ikke gode råd om, at opgradere til Delphi-X. Det har jeg ikke brug for, da jeg er minimalist. KISS*** (Jo mindre, jo bedre). Kan det gøres uden, så gør det.
Ved ikke helt hvad du mener? Teksten bliver sat ind i memo´en som den er, der bliver ikke lavet noget om. Du skal self. have begge scroll bar slået til for at undgå ord deling
hvis du læser direkte ind i lines skal du 1. stoppe skræmopdatering og så ved jeg ikke hvad der ellers foregår i en memo, men jeg ved at en TStringList er lynene hurtig til at læse en "flad" fil ind, langt hurtigere en gammeldaws file rutiner :-)
Det er rigtig at TStringList er meget hurtigere til at læse ind, på min computer 2 sek. i forhold til 10 sek. hvis memoen skal indlæse. Men det gå galt når jeg kører linien: Memo1.Lines := F; så hænger programmet, jeg afbrød efter 3 minutter?
Til jaweni: Det er vigtig at du sætter en horizontal scrollbar på eller sætter WordWrap til false da det ellers kan tage 2-3 gange så lang tid hvis der er mange linier der skal deles.
Jeg hader IBMs bærbare! Hvorfor skal de bytte rundt på <ctrl>- og <fn>-tasterne og hvorfor skal de placere <back>- og <forward>-taster klods op ad piletasterne? Sag og bryggede noget klogt sammen og rammer så den forkerte knap. Exit gik det indlæg. Maskinen larmer også. Hvis ikke det var en foræring havde jeg nok en smartere...
Nok om HAL og dens uheldige design.
Hvis din Ur-delphi har en TListView (findes i Win32-fanebladet (unit ComCtrls)) kan du lave et virtuelt listview. Teknikken er at man har en bagvedliggende liste som TListViewet plukker fra når de skal bruges. Hvis listviewet viser 10 linjer tegner den kun de 10. Det er lynende hurtigt og det bruger ikke meget ram. Jeg indlæste 200000 linjer på 156ms, dvs. 1/6 sekund. Hvis data skal vises på skærmen (og ikke editeres) er det den hurtigste måde:
procedure TfrmMain.FormCreate(Sender: TObject); begin fList := TStringList.Create; end;
procedure TfrmMain.FormDestroy(Sender: TObject); begin lvData.Items.Clear; // Skal også nulstilles igen fList.Free; end;
procedure TfrmMain.lvDataData(Sender: TObject; Item: TListItem); begin Item.Caption := fList[Item.Index]; end;
procedure TfrmMain.lvDataDataHint(Sender: TObject; StartIndex, EndIndex: Integer); begin // Angiver det næste interval der skal vises. Hvis data er cached til disk er det // en god idé at hente det ind i hukommelsen her. // Min TStringList er allerede der så der er ingen grund til at lave noget her. end;
end.
--------------- o ---------------
I DFM-filen er der sikkert mange properties din delphi ikke kan håndtere. Det letteste er nok at lave formen, med dens komponenter og derefter kopiere pas-koden ind.
Performance blev betydeligt bedre; men ved store filer var der lidt ventetid, inden linierne vistes i memoen.
Det skyldes muligvis min maskines ydeevne.
Synes godt om
Ny brugerNybegynder
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.