[PR] wskaźniki i rekordy

0

Mam problem ze wsakźnikami.

Napisałem procedurkę:

  PFiles = ^TFiles;
  TFiles = packed record
    FName: string[200];
    FSize: integer;
    FKind: integer;
  end;
  
procedure Kataloguj(tnRodzic : TTreeNode; strSciezka : string);
var
 sr : TSearchRec;
 iWynik : integer;
 tnDziecko : TTreeNode;
 Licznik : integer;

 PRec: PFiles ;
begin
  iWynik := FindFirst(strSciezka + '*.*', faAnyFile, sr);
  while iWynik = 0 do
  begin
    //
    New(PRec);  // PRZYDZIELENIE PAMIECI
    //
    if (sr.Name <> '.') and (sr.Name <> '..') then
    begin
      with PRec^ do
      begin
        FName := sr.Name;
        FSize := sr.Size;
        FKind := sr.Attr;
      end;

      tnDziecko := frm.trv.Items.AddChildObject(tnRodzic, sr.Name, PRec);
      Licznik := Licznik + 1;
      frm.Caption := 'Znalazlem : ' + IntToStr(Licznik) + 'katalog(ów).';
      if ((sr.Attr and faDirectory) = faDirectory) then
      begin
        tnRodzic.ImageIndex := 0;
        Kataloguj(tnDziecko ,strSciezka + sr.Name + '');
      end
      else
      begin
        tnDziecko.ImageIndex := -1;
        tnDziecko.SelectedIndex := -1;
      end;
      //Dispose(PPec);
    end;
    iWynik := FindNext(sr);

  end;
  FindClose(sr);
end;

// Wywołanie
procedure Tfrm.btnClick(Sender: TObject);
var
  cDysk : Char;
  tdtStart, tdtKoniec : TTime;
begin
  frm.trv.Items.BeginUpdate;
  trv.Items.Clear;
  cDysk := 'F';

  Kataloguj(trv.Items.AddChild(nil, '(Dysk ' + cDysk + ':)'), cDysk + ':');
  frm.trv.Items.EndUpdate;
end;

No i właśnie...

Jak zwalniać pamięć tak, żeby nie gubić wartości pól rekordu?

Zamienić to na tablicę rekordów?
Jak?

Bardzo proszę o pomoc.

0

hmm

Zwalniasz pamięć zmiennej dynamicznej dopiero wtedy, gdy nie chcesz już z niej więcej korzystać (nie da się rozbić butelki nie rozlewając mleka :) ). Możesz zawsze pola rekordowe zapamiętać gdzieś indziej, tylko po co... (przelać mleko do innej butelki).

A tak w ogóle to śmierdzi mi to jakąś niekompletną listą...

0

Nie rozumiem. Chcesz zwolnić pamięć, a później ją odczytać - to po co ją zwalniać skoro chcesz z niej korzystać ? Adresy do rokordów zachowałeś podczas AddChildObject.

0

Jak już napisali, nie możesz zwolnić tej pamięci Od razu. Musisz to zrobić przy zwalnianiu danego Itema, ponieważ użycie np.

TreeView.Items[0].Free;

...nie zwolni pamięci po rekordzie.

<font color="blue">Note: The memory referenced by Ptr is not freed when the tree nodes object is freed.</span>

Zatem jeśli będziesz usuwał Itema z listy zwolnij rekord tak:

D

ispose(PFiles(TreeView.Items[0].Data));
0

OK, dzieki Matrox [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1