Avatar billede fun22 Nybegynder
08. januar 2004 - 16:04 Der er 8 kommentarer og
1 løsning

Problem med at hente til listview

Hej

Jeg bruger denne kode til at hente fra to filer til en listview:

  FileStream := TFileStream.Create(extractFilePath(ParamStr(0))+'outbox.dat', fmOpenRead);
  outlist := TListView(FileStream.ReadComponent(outlist));
  FileStream.Free;
  FileStream := TFileStream.Create(extractFilePath(ParamStr(0))+'indbox.dat', fmOpenRead); <<---
  maillist := TListView(FileStream.ReadComponent(maillist));
  FileStream.Free;

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...
Avatar billede fun22 Nybegynder
08. januar 2004 - 18:47 #1
ingen der lige kan se problemet?
Avatar billede hrc Mester
11. januar 2004 - 15:35 #2
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;
Avatar billede fun22 Nybegynder
11. januar 2004 - 20:57 #3
hrc >> Det hjalp ikke... Nu kommer der bare en masse access violations i stedet...
Avatar billede hrc Mester
12. januar 2004 - 14:32 #4
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:

  filliste.OnSelected := nil;
  try
..
..
  finally
    filliste.OnSelected := ...
  end;
Avatar billede fun22 Nybegynder
12. januar 2004 - 17:16 #5
kan ikke helt forstå hvad du mener.... Det er jo ikke når jeg markere noget, at fejlen kommer... Det er under opstart af programmet.
Avatar billede hrc Mester
13. januar 2004 - 14:55 #6
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??
Avatar billede hrc Mester
13. januar 2004 - 15:26 #7
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.
Avatar billede hrc Mester
25. januar 2004 - 00:53 #8
Har det hjulpet?
Avatar billede fun22 Nybegynder
27. januar 2004 - 11:31 #9
Ja det virkede...
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