Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > TreeView и очистка памяти


Автор: RadmiR 5.4.2007, 12:04
Скажите пожалуйста, как очистить память, выделенную для указателя.

В дате хранится указатель на запись, содержащую ид, родительский ид и имя. При создании заношу данные в запись, но как её освободить?
При этом smile 
Заранее СПАСИБО!

Автор: Yanis 5.4.2007, 12:13
Цитата(RadmiR @  5.4.2007,  13:04 Найти цитируемый пост)
В дате хранится указатель на запись, содержащую ид, родительский ид и имя.

В кокой ещё дате? Я кажется понял, но пиши по русски!
Куда и как ты заносишь? Слова надо подтверждать кодом. 
Некоторым деже проще его прочитать чем прелюдию smile

Автор: MetalFan 5.4.2007, 12:16
смотри что-то про OnDeleteNode )

Автор: RadmiR 5.4.2007, 13:15
Вот запись:
Код

type
  PTVNode = ^TTVNode;

  TTVNode = record
    id: integer;
    pid: integer;
    name: string;
  end;


В процедуре заношу давнные в запись:
Код

    New(RecPtr);
    RecPtr^.id := ID;
    RecPtr^.pid := PID;
    RecPtr^.name := NAME;

Автор: Rennigth 5.4.2007, 13:21
Ну при удалении делай Dispose(RecPtr)

Автор: Yanis 5.4.2007, 13:45
Цитата(Rennigth @  5.4.2007,  14:21 Найти цитируемый пост)
Ну при удалении делай Dispose(RecPtr) 

Да! smile

Автор: aktuba 5.4.2007, 13:52
Напиши примерно следующее:
Код

procedure TForm1.FreeNode(Node: PTVNode);
begin
  Node^.Name := '';
  Dispose(Node);
end;


P.S.: пока писал на работе (отвлекали =((() - уже ответили =))))  smile 

Автор: Snowy 5.4.2007, 13:52
Код

  Dispose(PTVNode(Node.Data));

Автор: MetalFan 5.4.2007, 14:56
aktuba, в случае с New/Dispose в ручную "убивать" дин массивы и строки нет необходимости

Автор: Beltar 5.4.2007, 15:53
А можно использовать не структуру, а класс без методов, тогда будет меньше геморроя с выделением и освобождением памяти. Типа так:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    TV: TTreeView;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TClass=class(TObject)
  public
    F1:Integer;
    F2:Integer;
    constructor Create;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
TV.Items[0].Data:=TClass.Create;//всего одна строка
end;

procedure TForm1.Button2Click(Sender: TObject);
var cl:TClass;
begin
cl:=TClass(TV.Items[0].Data); //и ^ не нужен.
Label1.Caption:=IntToStr(cl.F1);
Label2.Caption:=IntToStr(cl.F2);
end;

{ TClass }

constructor TClass.Create;
begin
F1:=1;
F2:=2;
end;

end.
 

Автор: aktuba 5.4.2007, 16:06
Цитата

aktuba, в случае с New/Dispose в ручную "убивать" дин массивы и строки нет необходимости 


А если вместо string используется WideString?  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)