Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Node.Data - указатель на структуру...   Найти похожие ветки 

 
01   (2005-03-02 07:09) [0]

Создал структуру:

type
 Trec = record
  i: Integer;
 end;

Глобалки:
 dData: array of Trec;
 dCount:integer = 0;

Есть TreeView. И при добавлении в него:

Node:=TreeView1.Items.AddChild(Node,Q.FieldByName("Answers").AsString);
SetLength(dData,dCount+1);
Node.Data:=@dData[dCount];
Inc(dCount);

И есть:

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
 Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin  
if Trec(Node.Data^).i=5 then
Sender.Canvas.Font.Color:= clBlack else Sender.Canvas.Font.Color:= clGray;
end;

При рисовании вылетает с Access violation..
Кто подскажет, в чем дело?


 
КаПиБаРа ©   (2005-03-02 07:21) [1]

При увеличении динамического массива под него выделяется новый блок памяти и данные копируются в него. Естественно все указатели на адреса элементов массива становятся недействительными.
Создавай/удаляй записи с помощью New/Dispose. При необходимости храни элементы в связном списке.


 
01   (2005-03-02 07:37) [2]


> Естественно все указатели на адреса элементов массива становятся
> недействительными.

Я ошибся в другом месте. Сейчас все работает.
Но если б было так как ты сказал, то у меня ничто бы не работало бы.. Но ссылки сохраняются.

Но тем не менее, это что, очень не корректно????
И как в моем случае "освобождать ранее занятое"?


 
КаПиБаРа ©   (2005-03-02 07:47) [3]

01   (02.03.05 7:37) [2]
Естественно память ранее занимаемая массивом специально не затирается. Она помечается как свободная и со временем может быть выделена под другие нужды и соответственно в нее будут внесены другие данные. А пока по этим адресам хранится "призрак" массива. И все обращения за исключением последнего элемента идут к этому "призраку". Причем таких "призраков" ты создаешь множество.

В будущем это может вызвать трудноуловимую ошибку. Когда она возникнет вспомни мои слова.


 
ЮЮ ©   (2005-03-02 08:05) [4]

>то у меня ничто бы не работало бы.. Но ссылки сохраняются

А ты сравни Node.Data и @dData[dCount] через некрторое время!
А работает, вероятно, потому, что освобожденная память ничем ещё не была занята и , естественно, по адресу Node.Data всё ещё лежат корректные данные. Но это не вечно :)

type
TRec = record
 i: Integer;
end;
PRec = ^TRec;

выделение памяти:
var
 data: PRec;
...
 New(data);
 Data^.i :=Q.FieldByName("Id").AsInteger;
 node := TreeView1.Items.AddChildObject(node, Q.FieldByName("Answers").AsString, data);

Использование:
 Q.Locate("Id", PRec(node.Data)^.i, [])

Освобождение:
 в обра,отчике TreeView.OnDeletion

var
 data: PRec;
...
 data := PRec(node.Data);
 Dispose(data);

Ecли кроме целого в record-е ничего нет, то ещё проще, ничего выделять и освобождать не надо, просто используеи node.Data для хранения целого:  

node := TreeView1.Items.AddChildObject(node, Q.FieldByName("Answers").AsString, TObject(Q.FieldByName("Id").AsInteger));
...
Q.Locate("Id", Integer(node.Data)^.i, [])


 
ЮЮ ©   (2005-03-02 08:07) [5]

Последняя строчка, естественно, должна быть просто
Q.Locate("Id", Integer(node.Data), [])


 
01   (2005-03-02 08:28) [6]


> Когда она возникнет вспомни мои слова.

Ну что же так трагично! )


> Использование:
>  Q.Locate("Id", PRec(node.Data)^.i, [])

Хм, об ентом не упоминалось.. Но мысль верно поймана.

> Ecли кроме целого в record-е ничего нет, то ещё проще, ничего
> выделять и освобождать не надо, просто используеи node.Data
> для хранения целого

Там еще много чего.. помимо целого.. Просто не стал проблему усложнять..


> КаПиБаРа ©   (02.03.05 07:47) [3]


> ЮЮ ©   (02.03.05 08:05) [4]

Благодарю за ответы. Прозрел! )



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
14-1109107780
olookin
2005-02-23 00:29
2005.03.13
Иван Панфилов - кто-нибудь слушал?


1-1109334999
ТехникПТО
2005-02-25 15:36
2005.03.13
Как в MessageDlg определить нажатие кнопки?


1-1109230829
3APA3A
2005-02-24 10:40
2005.03.13
Combobox


3-1108034345
Mamed
2005-02-10 14:19
2005.03.13
RTF Fayli


14-1109053646
Vlad Oshin
2005-02-22 09:27
2005.03.13
http://rapira.ru/articles/article0423.htm