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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.047 c
15-1200210870
sumkinf
2008-01-13 10:54
2008.02.17
Крякозябры в HLP


15-1199971931
Dmitry S
2008-01-10 16:32
2008.02.17
Расскрыть SWF


15-1200295245
TUser
2008-01-14 10:20
2008.02.17
Ашипка вышла :)


15-1200660668
Bless
2008-01-18 15:51
2008.02.17
Почему "тренЕр", но "тренИровка"


2-1201252736
destructor
2008-01-25 12:18
2008.02.17
видно пользователю image или нет?