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

Вниз

Как в TreeView очистить все ветки?   Найти похожие ветки 

 
neXt2   (2003-02-06 10:01) [0]

Мастера, помогите, наверное вопрос уже всех задолбал, но не сердитесь...
Т.е. не Items.Clear, а Node.Delete? Я очень часто перестраиваю дерево Items.Clear не очищяет память, а Node.Delete - делает, но как удалить все корни, я про них не знаю...


 
Song ©   (2003-02-06 12:23) [1]

Ну так тогда в цикле


 
Digitman ©   (2003-02-06 12:56) [2]


> Я очень часто перестраиваю дерево Items.Clear не очищяет
> память


Именно потому, что ты часто перестраиваешь дерево, следует пользоваться Items.Clear. В этом случае не будет непроизводительных расходов на бесконечную реаллокацию памяти из-за удаления/вставки узлов.


 
neXt2   (2003-02-06 13:03) [3]

Access violation ... выскакивает после нескольких запусков проги... Использую Items.Clear;


 
Digitman ©   (2003-02-06 13:09) [4]


> Access violation ... выскакивает


И что ? Тебе при этом явно говорится, что это из-за Items.Clear ?

ты хоть вникал в полный текст сообщения об AV ?


 
neXt2   (2003-02-06 13:13) [5]

AV at address 004869DE in module "Projeckt1.exe". Read address 00000004.


 
Digitman ©   (2003-02-06 13:14) [6]

вот и проси дебагер, чтобы он показал тебе строчку, на который ты получаешь AV !

см. Search | Find Error ...

там и вводи это самый 004869DE


 
gsu ©   (2003-02-06 13:15) [7]

критический код на базу ...


 
neXt2   (2003-02-06 13:19) [8]

TFields.FindField ...mov eax,[ebp+$04]
И что? Что с этим делать? Получается ошибка с БД. Ну и какого ...? БД я юзаю, дерево на основе БД.


 
Skier ©   (2003-02-06 13:20) [9]

>neXt2
Код в студию !


 
gsu ©   (2003-02-06 13:22) [10]

>> neXt2 (06.02.03 13:19)
>> Skier © (06.02.03 13:20)
Только не все 250 модулей (-:|~


 
neXt2   (2003-02-06 13:23) [11]

А что именно?


 
Digitman ©   (2003-02-06 13:23) [12]

вот видишь !
Items.Clear здесь совершенно ни при чем)

какая-то лажа у тебя при работе с объектами БД


 
neXt2   (2003-02-06 13:27) [13]

БД IBDatabase->IBTrasaction->IBDataset.
Вот я проверяю все время в этой штуке:
TFields.FindField ...mov eax,[ebp+$04]


 
Digitman ©   (2003-02-06 13:30) [14]

чего проверяешь-то ? Это что, твой СОБСТВЕННЫЙ код ??
TFields.FindField ???



 
neXt2   (2003-02-06 13:30) [15]

Когда я создаю детеныша с датой, то вот в дату я пишу -
Pointer(FieldByName("id").AsInteger)


 
jack128 ©   (2003-02-06 13:31) [16]

2 neXt2
как предположение: ты результат FindField на nil проверяешь?


 
Digitman ©   (2003-02-06 13:32) [17]

FieldByName("id").AsInteger какого объекта ???


 
neXt2   (2003-02-06 13:32) [18]


> Digitman © (06.02.03 13:30)
> чего проверяешь-то ? Это что, твой СОБСТВЕННЫЙ код ??
> TFields.FindField ???

галочка View CPU Window.
TFields.FindField - это чуть выше...


 
neXt2   (2003-02-06 13:34) [19]


> Digitman © (06.02.03 13:32)
> FieldByName("id").AsInteger какого объекта ???

IBDataset


 
Digitman ©   (2003-02-06 13:35) [20]

значит, не существует либо полt "id" либо объект IBDataSet


 
neXt2   (2003-02-06 13:38) [21]

и то существует, и то.
Ошибка при не существовании была бы сразу при построении дерева, а то дерево строится, перестраивается,а при закрытии формы - глюк.


 
gsu ©   (2003-02-06 13:39) [22]

>> Digitman © (06.02.03 13:09)
какой же вы терпеливый (-:|~


 
Digitman ©   (2003-02-06 13:43) [23]


> и то существует, и то.


глядя на приведенный тобой код, показанный дебагером, уверяю тебя - проблема с несуществованием одного из объектов БД !


> а то дерево строится, перестраивается


Давай еще в "угадайку с 3-х раз" поиграем, с недельку так примерно, чего у тебя там "строится, перестраивается"..

я буду угадывать твой код - мне это ооооочень нужно ! - а ты будешь радостно так говорить всякий раз "не-а, снова не угадал !"

))


 
FLIZ ©   (2003-02-06 14:02) [24]

в натуре, давай сюда нам код а так клоунада какая-то.
насколько я работал с деревьями ТриВью - ничего там плохого
не происходит при работе с узлами, ну т.е. при ИтемсКлеар
и прочем никаких баг Дерева нету. это у тебя в коде
что-то не так и ошибка тобою создана. и компонент ТриВью
тут точно не причем. код в студию!


 
neXt2   (2003-02-06 14:27) [25]

Вот построение ветки:
procedure TfMain.ExpendLevel(Node:TTreeNode);
var ID:integer;
ChildNode:TTreeNode;
begin

if Node = nil then ID := 0
else
ID := Integer(Node.Data);

with dm.qName do
begin
Close;
ParamByName("PARENT_ID").AsInteger := ID;
Open;
First;
with tree.Items do
begin
BeginUpdate;
while not Eof do
begin
ChildNode:=AddChildObject(Node , FieldByName("name").AsString,
Pointer(FieldByName("id").AsInteger));

if FieldByName("child_cnt").AsInteger>0 then
begin
ChildNode.ImageIndex := 1;
ChildNode.SelectedIndex := 0;
AddChild(ChildNode,"");
end
else
begin
ChildNode.ImageIndex := 2;
ChildNode.SelectedIndex := 2;
end;
Next;
end; //while
EndUpdate;
end;
end;
end;


 
neXt2   (2003-02-06 14:30) [26]

Вот перестройка дерева:
procedure TfMain.ReBildTree;
begin
tree.Items.Clear;
ExpendLevel(nil);
tree.Items[0].Selected := true;
end;


 
neXt2   (2003-02-06 14:31) [27]

Раскрытие ветки:
procedure TfMain.treeExpanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
begin
if Node.getFirstChild.Data = nil
then
begin
Node.DeleteChildren;
ExpendLevel(Node);
end;
end;


 
Skier ©   (2003-02-06 14:33) [28]

ChildNode:=AddChildObject(Node , FieldByName("name").AsString,
Pointer(FieldByName("id").AsInteger)); - очень подозрительно !


 
jack128 ©   (2003-02-06 14:33) [29]

AddChild(ChildNode,""); ?
У тя лишний узел появляется. И что будет если по нему кликнут?
Лудше сделать так ChildNode.HasChildren := True;


 
Digitman ©   (2003-02-06 14:34) [30]

>>при закрытии формы - глюк.

и что делается при закрытии формы ?

p.s. ты вообще в курсе, что в Паскале есть конструкции try..finally, try..except ?

BeginUpdate;
// здесь - твой "глюк", к примеру, произошел
EndUpdate; // эта строчка при "глюке" выполнена не будет !


 
neXt2   (2003-02-06 14:38) [31]


> jack128 © (06.02.03 14:33)
> AddChild(ChildNode,""); ?
> У тя лишний узел появляется. И что будет если по нему кликнут?

Если этого не показать, то не видно что дети, про
ChildNode.HasChildren := True я не знал :(

> Digitman © (06.02.03 14:34)
> >>при закрытии формы - глюк.
>
> и что делается при закрытии формы ?
>
> p.s. ты вообще в курсе, что в Паскале есть конструкции try..finally,
> try..except ?

конечно знаю, но тут я пока разбираюсь, и пока там глюка не было.


 
neXt2   (2003-02-06 14:39) [32]


> Digitman © (06.02.03 14:34)
> >>при закрытии формы - глюк.
>
> и что делается при закрытии формы ?

ничего.


 
neXt2   (2003-02-06 14:43) [33]


> Skier © (06.02.03 14:33)
> ChildNode:=AddChildObject(Node , FieldByName("name").AsString,
> Pointer(FieldByName("id").AsInteger)); - очень подозрительно
> !

Что именно подозрительно?


 
jack128 ©   (2003-02-06 14:43) [34]

я не знаю сколько у тя кода в модуле, но
я в таких слючаях комментировал участки кода и смотрел
глюк проявился или нет. Таким образом локализововал ошибку...


 
jack128 ©   (2003-02-06 14:45) [35]

2 neXt2, Digitman а вообще для таких разговоров есть чат


 
Digitman ©   (2003-02-06 14:48) [36]

как это "ничего" ? компоненты доступа к БД лежат на форме ? перед разрушением формы они разрушаются, и если в этот момент ты там чего-то творишь со своим деревом (вероятно, вызываешь ExpendLevel() в каком-то внешнем цикле, где присутствует Application.ProcessMessages), вот эти "грабли" тебя и лупят в одну и ту же шишку))


 
Digitman ©   (2003-02-06 14:51) [37]

как это "ничего" ? компоненты доступа к БД лежат у тебя на форме ? перед разрушением формы они разрушаются, и если в этот момент ты там чего-то творишь со своим деревом (вероятно, вызываешь ExpendLevel() в каком-то внешнем цикле, где присутствует Application.ProcessMessages), вот эти "грабли" тебя и лупят в одну и ту же шишку)) с завидной причем регулярностью)))


 
Digitman ©   (2003-02-06 14:54) [38]


> jack128


"А ты кто такой ?"
(с) М.С.Паниковский, "человек без паспорта"


 
Skier ©   (2003-02-06 14:57) [39]

>neXt2 (06.02.03 14:43)
А ты подумай как ты освобождать данные для узла будешь.
Все же рухнет !


 
neXt2   (2003-02-06 14:58) [40]

2 Digitman ©
Спасибо что помогаешь.
я использую DataModule. А Application.ProcessMessages я не использую...


 
neXt2   (2003-02-06 15:00) [41]


> Skier © (06.02.03 14:57)
> >neXt2 (06.02.03 14:43)
> А ты подумай как ты освобождать данные для узла будешь.
> Все же рухнет !

Я же и сначала и задавал такой вопрос -смотри САБЖ. Говорят Items.Clear должен работать.


 
Digitman ©   (2003-02-06 15:00) [42]


> jack128 © (06.02.03 14:43)
> я в таких слючаях комментировал участки кода и смотрел
> глюк проявился или нет. Таким образом локализововал ошибку...
>


ну и плохо ! схему/последовательность событий в приложении, даже не использующем компоненты, и встр.дебагер как наипервейший инструмент для отладки Делфи-приложений нужно знать как "Отче наш"... А поиск "глюков" вслепую никогда не избавит от "глюков"


 
Skier ©   (2003-02-06 15:03) [43]

>neXt2
Зависит от того используешь ли ты потом данные для узла, если да то обрушения не избежать.


 
jack128 ©   (2003-02-06 15:04) [44]

В данном случае дебагер видимо непомог...


 
Digitman ©   (2003-02-06 15:05) [45]


> neXt2


долго еще будем играться в бирюльки ? приводи код, вызывающий ExpendLevel()... и более ранний, т.е. верхнеуровневую процедуру, с которой начинается вся эта "химия" по построению дерева


 
neXt2   (2003-02-06 15:06) [46]


> Skier © (06.02.03 15:03)
> >neXt2
> Зависит от того используешь ли ты потом данные для узла,
> если да то обрушения не избежать.

Да использую:
procedure TfMain.treeСhange(Sender: TObject; Node: TTreeNode);
var ID : integer;
begin
with (Sender as TTreeView) do
if Selected <> nil Then
begin
with dm.qRate do
begin
Close;
ParamByName("ID").AsInteger := Integer(Selected.Data);
Open;
end;
end;//if and with
end;


 
Skier ©   (2003-02-06 15:09) [47]

>neXt2
Горе тебе ! :)


 
Digitman ©   (2003-02-06 15:12) [48]

кр.того, непонятно, почему

AddChild(ChildNode,""); ?

соданный таким образом узел будет иметь Data = nil


 
neXt2   (2003-02-06 15:14) [49]


> Digitman © (06.02.03 15:05


Отсалось только:
procedure TfMain.DBGridCellClick(Column: TColumn);
begin
ReBildTree;
end;


 
neXt2   (2003-02-06 15:16) [50]


> Digitman © (06.02.03 15:12)
> кр.того, непонятно, почему
>
> AddChild(ChildNode,""); ?


я уже сделал ChildNode.HasChildren := True


 
Digitman ©   (2003-02-06 15:17) [51]


> neXt2


Охх)... ну давай сюда и ReBildTree() , до кучи)




 
Skier ©   (2003-02-06 15:18) [52]

>neXt2
Ну...короче заносить строку нужно примерно так :

type
PString = ^String;
var
AStr : PString;
begin
//...............
New(AStr);
AStr^ := Pointer(FieldByName("id").AsInteger);
ChildNode:=AddChildObject(Node , FieldByName("name").AsString, AStr);
//...............





 
neXt2   (2003-02-06 15:19) [53]

Я уже все привел, этот код выше.


 
Digitman ©   (2003-02-06 15:20) [54]


> я уже сделал ChildNode.HasChildren := True


А это здесь причем ? Насколько я понял, каждый добавляемый узел у тебя в Data обязан содержать уник.идентификатор.
В случае с AddChild() ты всегда получишь Data = 0 (nil)


 
neXt2   (2003-02-06 15:21) [55]

2 Skier © (06.02.03 15:18)
а как потом оттуда считывать?


 
Oleon ©   (2003-02-06 15:21) [56]

я не понял, что-то очень много всего понаписали...

у него в Data записано что-то постоянно, он удаляет Node а ссылки остаются...

вот, наверное, из-за этого и весь гемморой...

почему вы не воспользовались советом от Song?

>>Song © (06.02.03 12:23)
>>Ну так тогда в цикле




 
Skier ©   (2003-02-06 15:22) [57]

>neXt2
Поправка :
AStr^ := FieldByName("id").AsString;
Если используешь AsInteger, то объяви PInteger = ^Integer и дальше по анологии...


 
neXt2   (2003-02-06 15:22) [58]


> Digitman © (06.02.03 15:20)
>
> > я уже сделал ChildNode.HasChildren := True
>
>
> А это здесь причем ? Насколько я понял, каждый добавляемый
> узел у тебя в Data обязан содержать уник.идентификатор

только те кто не имеет детей.


 
Skier ©   (2003-02-06 15:24) [59]

>neXt2 (06.02.03 15:21)
Если строка то :
if Node.Data <> nil then
ASomeStrVar := PString(Node.Data)^;
Если целое то :
ASomeIntVar := PInteger(Node.Data)^;




 
Oleon ©   (2003-02-06 15:27) [60]

пройтись циклом и везеде для каждого NODe сделать Free, а потом Nil...

for i := Node.count downto - 1 downto 0 do
Begin
Node.Item[i].Free;
Node.Item[i].Data := nil;
End;

разве так нельзя написать? или что-то типа того,

P.S. вопрос явно не тянет на столько ответов)))))


 
Digitman ©   (2003-02-06 15:28) [61]


> Skier


да целое у него оно)
использует как перв.ключ записи в НД

вполне достаточно Integer(Node.Data)


 
Skier ©   (2003-02-06 15:32) [62]

>Digitman
Если целое, то достаточно. Согласен.


 
Digitman ©   (2003-02-06 15:35) [63]


> только те кто не имеет детей.


непонятно.
узел, не имеющий "детей", не имеет первич.ключа ?
а если юзер сделает его Selected ? ты ж тут же начинаешь читать его data (там - 0) и тут же запрос выполняешь для parentkey = 0. В результате - хрень несусветная


 
Skier ©   (2003-02-06 15:35) [64]

>neXt2
Если данные для узла - просто целое число (как у тебя), то
всё правильно- выделение памяти не нужно, хватит и кастинга.
Не туда зарулил...Sorry !


 
Oleon ©   (2003-02-06 15:37) [65]

тут проблемма, не в том как заносить, а как потом память отчистить....!!!!!!!

Skier, Digitmen вы не тем занялись...


 
neXt2   (2003-02-06 15:40) [66]

У меня при ввыборе узла, должен открыватся НД тогда, когда это конец ветки(т.е. тот кто не имеет детей).

Так что мне делать?

Что мне при onDestroy DataModule закрывать IBDataset и чистить дерево(Node.Data := nil)?


 
Digitman ©   (2003-02-06 15:46) [67]


> Oleon


Нет здесь никакой утечки памяти. Не выдумывай.

> neXt2 (06.02.03 15:40)
> У меня при ввыборе узла, должен открыватся НД тогда, когда
> это конец ветки(т.е. тот кто не имеет детей).


опять же - неверно !
откуда ты знаешь, конец это ветки или не конец ?
ты для чего НД в запросе формируешь ? как раз чтобы отразить изменения, произошедшие в базе с записями, ассоциируемыми тобой с данным узлом и возможно имеющимися у него на дан.момент дочерними узлами, после последнего обновления дерева


 
neXt2   (2003-02-06 15:50) [68]

2 Digitman ©
У меня есть поле child_cnt, если =0 конец, >0 - нет
В neXt2 (06.02.03 14:27) есть присутсвие это елемента.


 
Digitman ©   (2003-02-06 16:17) [69]

а если эта запись удалена уже ?


 
neXt2   (2003-02-06 16:25) [70]

Ее можно удалить только из этого дерева, т.е. конечно может програмер залезть и в *.gdb поправить, но не юзер. И еще у меня тригеры стоят, сами считают сколько детей.


 
Digitman ©   (2003-02-06 16:33) [71]

это чего такое получается ? ты пользуешь IB SS для одного-единственнгого клиента ? не жирно будет ?


 
neXt2   (2003-02-06 16:40) [72]

Нет, не для одного, просто в этой *.gdb не только эти данные(они как вспомагательные идут), а вообще это БД для Отдела труда и з/п
Там и штатное, и кадры, и норма по операциям(эта задача).


 
neXt2   (2003-02-06 16:46) [73]

Убрал DataModule вроде работает...


 
neXt2   (2003-02-06 16:54) [74]

Да! работает!!!


 
gsu ©   (2003-02-06 16:55) [75]

наконец то, ...
Digitman © - самый терпеливый мастер, гип-гип, ура (-:|~


 
Digitman ©   (2003-02-06 16:55) [76]


> Убрал DataModule вроде работает...


я ж тебе сразу сказал - смотри за порядком событий, связанных с разрушением форм/модулей данных при завершении приложения !


> Нет, не для одного


вот и представь себе - два юзера юзают одновременно твое дерево ..
один добавил узел, другой, обновив свое, увидел этот узел и удалил его, а заодно и родит.узел

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


 
Соловьев ©   (2003-02-06 17:03) [77]


> теперь первый юзер сподобился щелкнуть на уже удаленном
> в этот момент узле..

Ты про try..except..end? Сделаю.

>
> Digitman © (06.02.03 16:55)
>
> > Убрал DataModule вроде работает...
>
>
> я ж тебе сразу сказал - смотри за порядком событий, связанных
> с разрушением форм/модулей данных при завершении

Я так понимаю, node.Data ссылается на данные в DataModule. Она разрушается первой. А как сделать чтобы DataModule разрушалось последней? Наверное я написал бред...


 
Digitman ©   (2003-02-06 17:15) [78]

Упс ! Уже реинкарнация приключилась) <neXt2> to <Соловьев>)


> Ты про try..except..end? Сделаю.


Я ему про фому, он - про ерему)

try .. finally/except - это безусловно, но упомянул я это по другому поводу ... ты хоть прочитай, о чем я там)

щелчек на узле у тебя зачем отрабатывается ? чтобы детей узла обновить визуально ? а если самого узла (в таблице !) уже нет - о каких его детях речь может идти ?


> node.Data ссылается на данные в DataModule


Это каким же образом ? ты ж в Data что пишешь ? просто - число некое, не более того ... число это - просто некое значение некоего перв.ключа некоей записи


 
Соловьев ©   (2003-02-06 17:22) [79]

:)
>
> Digitman © (06.02.03 17:15)
> Упс ! Уже реинкарнация приключилась) <neXt2> to <Соловьев>)



 
Digitman ©   (2003-02-06 17:38) [80]


> как сделать чтобы DataModule разрушалось последней


смотря как ты создаешь этот DataModule
от этого зависит и контроль за порядком (либо принудительное осуществление) его разрушения


 
Соловьев ©   (2003-02-06 17:43) [81]

В *.dpr:
MainForm.Create;
DM.Create;



 
Digitman ©   (2003-02-06 17:50) [82]

ну а почему же не поменять местами ?

и - кто владелец компонента DM ?


 
Соловьев ©   (2003-02-06 17:54) [83]


> и - кто владелец компонента DM ?

Не понял что ты имеешь в виду?


 
Digitman ©   (2003-02-06 17:56) [84]

О-хо-хооо) ..

Начали за здравие, кончили за упокой)


Давай точный код из DPR


 
Соловьев ©   (2003-02-06 17:59) [85]

Я переставил местами - работает! Блин, сколько, времени у тебя отнял, извини... Спасибо, что помогал. Буду дальше колбасить :)
Может я тоже выросту до таких как ты...



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

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

Наверх




Память: 0.68 MB
Время: 0.026 c
6-53146
Woolen
2002-12-26 12:17
2003.02.17
Технология Indy и многопоточность


1-52887
s00n
2003-02-08 08:32
2003.02.17
вывод формул


1-53108
Бук
2003-02-07 08:02
2003.02.17
Версия проекта


1-52855
Vovaka
2003-02-07 14:09
2003.02.17
Проблема с тредами.


3-52779
SoloD
2003-01-31 07:07
2003.02.17
Пакование dBase 5.0 через ADO