Форум: "Основная";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
ВнизTreeView.Items.Clear не работает??? Найти похожие ветки
← →
mufan (2007-11-11 14:15) [0]Доброго времени суток!!!
Проблема дикая... я наверно схожу с ума...
Имеем:
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!!! Произошло добавление к старым данным...
Вообщем, я ничего не понимаю... Что может быть???
Спасибо!
← →
9899100 (2007-11-11 16:16) [1]единственно что можно предположить , что при обработке метода onShow при вызове формы2 у тебя процедура выполняется дважды.
Т.е. кроме как на событии onShow у тебя стоит вызов BuildTreeFromDBExecute
причем это событие срабатывает раньше чем твое заполнение (например посмотри события обрабатываемые для твоего дерева
← →
9899100 (2007-11-11 16:18) [2]типа onChange(Sender: TObject; Node: TTreeNode); для TreeView
← →
mufan (2007-11-11 20:11) [3]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;
Тупо, но теперь все работает...
Так в чем же беда то???
← →
mufan (2007-11-11 20:18) [4]сорри за ошибку! сначала первый путь, потом естественно второй!
← →
Kolan © (2007-11-11 21:07) [5]> [3] mufan (11.11.07 20:11
Оч. много приводите кода, старайтесь локализовать проблемный код и приводить его. Столько читать многоим(например мне) лень.
ЗЫ
Ниасилил, многа букаф.
← →
mufan (2007-11-11 22:17) [6]Вы сами не разберетесь... то многа букаф, то вопрос не понятен, напишите поподробнее... Молчу про тех, кто заходит и глумится вообще...
Если кратко то =):
1. При открытии проги (форма1) заполняется TreeView на форме2. Причем TreeView расположено не на самой форме2, а на панели, у которой изначально Visible:=false;
2. По ходу работы в форме1 мы великолепно оперируем с информацией из TreeView
3. Если мы открываем форму2, выполняем там некоторые действия (не выполнzя действия, при котором панель станет Visible:=true), закрываем форму2! То, из формы1 мы уже не можеи работать с TreeView! Оно пусто!
4. Если же мы на форме два сделаем то, что визуализирует нам панельку, а потом закроем форму2, то все останется по-прежнему - будет работать!
← →
KilkennyCat © (2007-11-11 22:49) [7]не закрывать форму.
← →
{RASkov} (2007-11-12 00:27) [8]> mufan
Конкретно в твоей ветке ответить трудно....
Много чего лишнего и много чего нехватает...
Вот некоторые советы:
по поводу
> Form2.Query.Close;
> Form2.Query.SQL.Clear;
//и далее в том же духе...
.....
> procedure TForm2.Button1Click(Sender: TObject);
> begin
> Form2.Close;
> end;
читай здесь http://delphimaster.net/view/15-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;
В общем приведи в порядок свой код.... проверь еще раз.... подумай...
Иначе твои "огрызки" не оптимально написанного кода читать и делать выводы тяжело....
Удачи)
← →
Германн © (2007-11-12 01:51) [9]Вот тут, имхо, и LVT старается навести порядок:
Leonid Troyanovsky © (11.11.07 12:07) [148]
Чайникам:
Не используй переменные FormX.
Это из ветки http://delphimaster.net/view/15-1194730016/
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.046 c