Men ved den linie jeg har markeret, kommer den og siger: Der er allerede et komponent med navn outlist. Det fatter jeg ikke at den skriver og så peger på den linie.. Hvis jeg fjerne linine virker det fint.
Men det virkede også i morges det hele. Så jeg håber der er nogen af jer der kan finde fejlen...
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
Jeg kan ikke se problemet når jeg prøver at hente og gemme listviews. Nedenstående kode læser data fra to listview's og der er ingen problemer. Prøv at sætte koden ind - det kan være at det løser problemet hos dig.
Kan anbefale at tillære dig min navngivning af komponenterne, lv for ListView => lvOutbox, e for Edit => eNavn. Det er den gængse måde at gøre det på. Din "maillist" giver ingen hjælp mht. hvilken komponent der er tale om - den er nærmest misvisende.
procedure TfrmMain.btnReadClick(Sender: TObject); var fn : string; begin fn := extractFilePath(ParamStr(0))+'inbox.dat'; if FileExists(fn) then with TFileStream.Create(fn, fmOpenRead) do try ReadComponent(lvInbox); finally Free; end; // try
fn := extractFilePath(ParamStr(0))+'outbox.dat'; if FileExists(fn) then with TFileStream.Create(fn, fmOpenRead) do try ReadComponent(lvOutbox); finally Free; end; // try end;
Så er det ikke der at fejlen sker. Jeg tror ListViewet må fyre nogle events af som følge at data læses. Prøv at hægte dem af (en efter en) og se om der sker nogen forandring:
Okay - det lyder spooky. I hvilken event henter du oplysningerne? En overgang havde jeg samme fejl som du nævner, men det skyldtes at jeg gemte listview'erne i forkert rækkefølge. Det jeg har her, fungerer (hos mig):
procedure TfrmMain.FormCreate(Sender: TObject); var fn : string; begin fn := extractFilePath(ParamStr(0))+'listviews.dat'; if FileExists(fn) then with TFileStream.Create(fn, fmOpenRead) do try ReadComponent(lvMain); ReadComponent(lvLog); finally Free; end; // try end;
procedure TfrmMain.FormDestroy(Sender: TObject); begin with TFileStream.Create(extractFilePath(ParamStr(0))+'listviews.dat', fmCreate) do try WriteComponent(lvMain); WriteComponent(lvLog); finally Free; end; // try end;
Kan det tænkes at du gemmer samme listview i to filer??
Har forsket lidt mere i det. WriteComponent gemmer for det første rekursivt. Det vil sige, at skriver du WriteComponent(self), hvor self er formen, så gemmes alle komponenter som er på formen.
Den anden ting som kan give problemet er, at den gemmer også data. Hvis du har 500 linier i listview'et, så gemmes de med og når du starter programmet vil de blive indlæst igen. Det kan blive noget farligt noget, især hvis du har objekter siddende på TListItems.data propertien. De vil ikke blive oprettet da de sandsynligvis ikke nedarver fra TPersistant (som jeg mener indeholder alt det her med streaming af komponenter)
Vil anbefale at du sletter indholdet af dine listviews eller streamer dem væk via deres egen klasse, inden du kalder WriteComponent.
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.