Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.047 c
1-1194779709
mufan
2007-11-11 14:15
2008.02.17
TreeView.Items.Clear не работает???


2-1200933382
Chysti
2008-01-21 19:36
2008.02.17
Как поменять свойство Caption у всех компонентов формы


15-1200597998
ProgRAMmer Dimonych
2008-01-17 22:26
2008.02.17
К вопросу об учителях и системе образования


3-1191244296
Draught
2007-10-01 17:11
2008.02.17
Объеденить несколько строк из таблицы в отдну строку.


15-1200305773
AntiUser
2008-01-14 13:16
2008.02.17
Oracle.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский