Главная страница
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.025 c
6-1105465185
Meneee
2005-01-11 20:39
2005.03.13
Копирование файлов по сети


8-1101423024
ункновн
2004-11-26 01:50
2005.03.13
Обработка изображения в Direct3D


6-1105144768
Kyrt
2005-01-08 03:39
2005.03.13
рассылка


1-1109330540
webpauk
2005-02-25 14:22
2005.03.13
Рекурсия и переменные


3-1107753931
lats
2005-02-07 08:25
2005.03.13
Блокировка таблицы транзакцией в MSSQL