![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TreeView.Items.Clear не работает???
mufan © (2007-11-11 14:15:00)Доброго времени суток!!!
Проблема дикая... я наверно схожу с ума...
Имеем:
1. TreeView (максимальная вложенность один - родители и всего один слой детей, внуков нет)
2. В ActionManager процедура по заполнению этого дерева из БД:
procedure TForm2.BuildTreeFromDBExecute(Sender: TObject);
var
MyTreeNode1, MyTreeNode2,
MyTreeNode1n, MyTreeNode2n,
MyTreeNode1i, MyTreeNode2i,
MyTreeNode1u, MyTreeNode2u,
MyTreeNode1s, MyTreeNode2s,
MyTreeNode1p, MyTreeNode2p: TTreeNode;
begin
Form2.Query.Close;
Form2.Query.SQL.Clear;
Form2.Query.SQL.Add('select * from db_tools where Fpid=0 order by Ftext asc');
Form2.Query.Open;
Form2.tv.Items.Clear;
Form2.tv_n.Items.Clear;
Form2.tv_i.Items.Clear;
Form2.tv_p.Items.Clear;
Form2.tv_u.Items.Clear;
Form2.tv_s.Items.Clear;
if Form2.Query.RecordCount>0 then
begin
Form2.Query.First;
while not Form2.Query.Eof do
begin
MyTreeNode1 := Form2.tv.Items.Add(nil, Form2.Query.FieldByName('Ftext').AsString);
MyTreeNode1n := Form2.tv_n.Items.Add(nil, Form2.Query.FieldByName('Fplace').AsString);
MyTreeNode1i := Form2.tv_i.Items.Add(nil, Form2.Query.FieldByName('Fid').AsString);
MyTreeNode1p := Form2.tv_p.Items.Add(nil, Form2.Query.FieldByName('Fpart').AsString);
MyTreeNode1u := Form2.tv_u.Items.Add(nil, Form2.Query.FieldByName('Fuse').AsString);
MyTreeNode1s := Form2.tv_s.Items.Add(nil, Form2.Query.FieldByName('Fshow').AsString);
Form2.Query_sub.Close;
Form2.Query_sub.SQL.Clear;
Form2.Query_sub.SQL.Add('select * from db_tools where Fpid='+Form2.Query.FieldByName('Fid').AsString+' order by Ftext asc');
Form2.Query_sub.Open;
if Form2.Query_sub.RecordCount>0 then
begin
Form2.Query_sub.First;
while not Form2.Query_sub.Eof do
begin
MyTreeNode2 := Form2.tv.Items.AddChild(MyTreeNode1, Form2.Query_sub.FieldByName('Ftext').AsString);
MyTreeNode2n := Form2.tv_n.Items.AddChild(MyTreeNode1n, Form2.Query_sub.FieldByName('Fplace').AsString);
MyTreeNode2i := Form2.tv_i.Items.AddChild(MyTreeNode1i, Form2.Query_sub.FieldByName('Fid').AsString);
MyTreeNode2p := Form2.tv_p.Items.AddChild(MyTreeNode1p, Form2.Query_sub.FieldByName('Fpart').AsString);
MyTreeNode2u := Form2.tv_u.Items.AddChild(MyTreeNode1u, Form2.Query_sub.FieldByName('Fuse').AsString);
MyTreeNode2s := Form2.tv_s.Items.AddChild(MyTreeNode1s, Form2.Query_sub.FieldByName('Fshow').AsString);
Form2.Query_sub.Next;
end;
end;
Form2.Query.Next;
end;
end;
end;
Во внешнем цикле заполняем родителей, во внутреннем детей (если они есть для данного родителя)... Но это не суть важно...
Важно вот что: в начале процедуры я очищаю все деревья!!! Это правда или я заблуждаюсь???
Просто что происходит при работе программы...
1. При запуске программы (Form1) вызывается эта процедура и дерево строится нормально...
2. Затем я нажимаю кнопку (Form2.ShowModal)...
3. У Form2 на OnShow стоит вызов процедуры. Но вместо того чтобы сначала стереть (очистить) все деревья, а потом заново из заполнить из БД, происходит ДОБАВЛЕНИЕ!!!
Начинаю Trace Into...
1. После запуска проги tv.Items.Count равно 62!
2. Нажимаю кнопку! Вызывается процедура!
3. tv.Items.Count равно 0
4. проходим через строчки с очищением - tv.Items.Count равно 0
5. Но после выполнения первой строчки во внешнем цикле:
MyTreeNode1 := Form2.tv.Items.Add(nil, Form2.Query.FieldByName('Ftext').AsString);
tv.Items.Count становится равным 63!!! Произошло добавление к старым данным...
Вообщем, я ничего не понимаю... Что может быть???
Спасибо!
Германн (2007-11-12 01:51:00) [1]Вот тут, имхо, и LVT старается навести порядок:
Leonid Troyanovsky © (11.11.07 12:07) [148]
Чайникам:
Не используй переменные FormX.
Это из ветки http://delphimaster.ru/cgi-bin/forum.pl?id=1194730016&n=3
{RASkov} (2007-11-12 00:27:00) [2]> mufan
Конкретно в твоей ветке ответить трудно....
Много чего лишнего и много чего нехватает...
Вот некоторые советы:
по поводу
> Form2.Query.Close;
> Form2.Query.SQL.Clear;
//и далее в том же духе...
.....
> procedure TForm2.Button1Click(Sender: TObject);
> begin
> Form2.Close;
> end;
читай здесь http://www.delphimaster.ru/cgi-bin/forum.pl?n=3&id=1194730016
Вот это вот "безобразие" и в > (Я поставил на OnShow второй формы)
> if (TabControl1.TabIndex=0) then
> begin
> ppp0.Visible:=true;
> ppp1.Visible:=false;
> ppp2.Visible:=false;
> ppp3.Visible:=false;
> end;
> if (TabControl1.TabIndex=1) then
> begin
> ppp0.Visible:=false;
> ppp1.Visible:=true;
> ppp2.Visible:=false;
> ppp3.Visible:=false;
> end;
> if (TabControl1.TabIndex=2) then
> begin
> ppp0.Visible:=false;
> ppp1.Visible:=false;
> ppp2.Visible:=true;
> ppp3.Visible:=false;
> end;
> if (TabControl1.TabIndex=3) then
> begin
> ppp0.Visible:=false;
> ppp1.Visible:=false;
> ppp2.Visible:=false;
> ppp3.Visible:=true;
> end;
>
> end;
заменить на:
ppp0.Visible:=TabControl1.TabIndex=0;
ppp1.Visible:=TabControl1.TabIndex=1;
ppp2.Visible:=TabControl1.TabIndex=2;
ppp3.Visible:=TabControl1.TabIndex=3;
В общем приведи в порядок свой код.... проверь еще раз.... подумай...
Иначе твои "огрызки" не оптимально написанного кода читать и делать выводы тяжело....
Удачи)
KilkennyCat (2007-11-11 22:49:00) [3]не закрывать форму.
mufan (2007-11-11 22:17:00) [4]Вы сами не разберетесь... то многа букаф, то вопрос не понятен, напишите поподробнее... Молчу про тех, кто заходит и глумится вообще...
Если кратко то =):
1. При открытии проги (форма1) заполняется TreeView на форме2. Причем TreeView расположено не на самой форме2, а на панели, у которой изначально Visible:=false;
2. По ходу работы в форме1 мы великолепно оперируем с информацией из TreeView
3. Если мы открываем форму2, выполняем там некоторые действия (не выполнzя действия, при котором панель станет Visible:=true), закрываем форму2! То, из формы1 мы уже не можеи работать с TreeView! Оно пусто!
4. Если же мы на форме два сделаем то, что визуализирует нам панельку, а потом закроем форму2, то все останется по-прежнему - будет работать!
Kolan (2007-11-11 21:07:00) [5]> [3] mufan (11.11.07 20:11
Оч. много приводите кода, старайтесь локализовать проблемный код и приводить его. Столько читать многоим(например мне) лень.
ЗЫ
Ниасилил, многа букаф.
mufan (2007-11-11 20:18:00) [6]сорри за ошибку! сначала первый путь, потом естественно второй!
mufan (2007-11-11 20:11:00) [7]1. onChange(Sender: TObject; Node: TTreeNode); для TreeView пустое, для дерева только MouseDown есть!!!
Вообщем две последовательности действий (убрал вызов BuildTreeFromDBExecute из OnShow второй формы)... Описываю все действия и что происходит...
(Предварительно опишу что представляет из себя вторая форма:)
/////////////////////////////////////////////////////////////////////////////////////////
1. во всю форму растянут TabControl
2. у него четыре кнопки...
3. в этот tabControl помещено четыре панели, на каждой их которых свои компоненты
и на OnChange TabControl'a стоит следующее:
procedure TForm2.TabControl1Change(Sender: TObject);
begin
if (TabControl1.TabIndex=0) then
begin
ppp0.Visible:=true;
ppp1.Visible:=false;
ppp2.Visible:=false;
ppp3.Visible:=false;
end;
if (TabControl1.TabIndex=1) then
begin
ppp0.Visible:=false;
ppp1.Visible:=true;
ppp2.Visible:=false;
ppp3.Visible:=false;
end;
if (TabControl1.TabIndex=2) then
begin
ppp0.Visible:=false;
ppp1.Visible:=false;
ppp2.Visible:=true;
ppp3.Visible:=false;
end;
if (TabControl1.TabIndex=3) then
begin
ppp0.Visible:=false;
ppp1.Visible:=false;
ppp2.Visible:=false;
ppp3.Visible:=true;
end;
end;
где ppp'i' это панельки как раз...
TreeView находится на панели номер 1!
При открытии формы2 сначла выбрана панель 0!
/////////////////////////////////////////////////////////////////////////////////////////
Итак,
Первый путь:
1. Загрузка программы
2. В OnActivate формы1:
...
form2.BuildTreeFromDB.Execute;
...
если через отладчик посмотреть, то все ок! там 62 tv.items.count!
3. нажимаем кнопку
4. в кнопке:
form2.ShowModal;
5. Открывается вторая форма... Для нее вообще все обработчики событий пустые!
6. нажимаем на второй форме кнопку
7.
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Close;
end;
8. на первой форме (главной) нажимаем кнопку с какой-то левой операцией, чтоб можно было в дебуггере остановится...
9. смотрим tv.items.count равно 0!!!
Описаны абсолютно все, что делалось... в программе! Куда исчезла инфа???
Первый путь:
1. Загрузка программы
2. В OnActivate формы1:
...
form2.BuildTreeFromDB.Execute;
...
если через отладчик посмотреть, то все ок! там 62 tv.items.count!
3. нажимаем кнопку
4. в кнопке:
form2.ShowModal;
5. Открывается вторая форма... Для нее вообще все обработчики событий пустые!
////
до сюда все было как в первом случае
////
5.1. щелкаем по TabControl'у на второю кнопку (индекс = 1)
5.2. выполняется:
if (TabControl1.TabIndex=1) then
begin
ppp0.Visible:=false;
ppp1.Visible:=true;
ppp2.Visible:=false;
ppp3.Visible:=false;
end;
5.3. показывается панелька ppp1, на которой расположено заполненное при запуске программы дерево
////
дальше все как в первом случае, за исключением результата
////
6. нажимаем на второй форме кнопку
7.
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Close;
end;
8. на первой форме (главной) нажимаем кнопку с какой-то левой операцией, чтоб можно было в дебуггере остановится...
9. смотрим tv.items.count равно 62!!!
Т.е. чтоб все работает. Вдруг по ходу работы мне захотелось открыть вторую форму! Я ее открываю! И чтоб после ее закрытия все продолжало нормально работать, я обязательно должен нажать на вторую кнопку табконтрола...
Я поставил на OnShow второй формы следующий обработчик:
ppp0.Visible:=true;
ppp1.Visible:=true;
ppp2.Visible:=true;
ppp3.Visible:=true;
ppp0.Visible:=false;
ppp1.Visible:=false;
ppp2.Visible:=false;
ppp3.Visible:=false;
if (TabControl1.TabIndex=0) then
begin
ppp0.Visible:=true;
end;
if (TabControl1.TabIndex=1) then
begin
ppp1.Visible:=true;
end;
if (TabControl1.TabIndex=2) then
begin
ppp2.Visible:=true;
end;
if (TabControl1.TabIndex=3) then
begin
ppp3.Visible:=true;
end;
Тупо, но теперь все работает...
Так в чем же беда то???
9899100 (2007-11-11 16:18:00) [8]типа onChange(Sender: TObject; Node: TTreeNode); для TreeView
9899100 (2007-11-11 16:16:00) [9]единственно что можно предположить , что при обработке метода onShow при вызове формы2 у тебя процедура выполняется дважды.
Т.е. кроме как на событии onShow у тебя стоит вызов BuildTreeFromDBExecute
причем это событие срабатывает раньше чем твое заполнение (например посмотри события обрабатываемые для твоего дерева