|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Работа с TreeView в Delphi Добрый день! Пишу программу для работы с базой данных Access. Структуру данных демонстрирую с помощью TreeView, всего две основные ветки. При работе с деревом в первой ветке все узлы открываются щелчком левой кнопки мыши по их названию. А при переходе на вторую ветку узлы раскрываются только щелчком по "+", при щелчке по названию вся программа зависает. Работа с деревом только в двух процедурах: При создании формы отрисовывается дерево: Код:   DataModule1.T_KONCEPT.Open; 
  DataModule1.T_SPECIES.Open; 
  DataModule1.T_REC.Open; 
  if not DataModule1.T_KONCEPT.IsEmpty then 
  begin
     DataModule1.T_KONCEPT.First; 
     Repeat        MainNode:=TreeView1.Items.AddChild(nil,DataModule1.T_KONCEPT.FieldByName('NAME_KONCEPT').asString); 
       DataModule1.T_SPECIES.First; 
       Repeat 
         if DataModule1.T_KONCEPT.FieldByName('ID_KONCEPT').AsInteger =
            DataModule1.T_SPECIES.FieldByName('KONCEPT').AsInteger then
           begin
             GrNode := TreeView1.Items.AddChild(MainNode,DataModule1.T_SPECIES.FieldByName('NAME_SPEC').asString);
             DataModule1.T_REC.First; 
             Repeat 
               if DataModule1.T_REC.FieldByName('SPECIES').asInteger=
                  DataModule1.T_SPECIES.FieldByName('ID_SPEC').asInteger then 
               ConNode:=TreeView1.Items.AddChild(GrNode,DataModule1.T_REC.FieldByName('NAME_RECORDS').asString);  
                DataModule1.T_REC.Next; 
             until DataModule1.T_REC.Eof; 
           end;
         DataModule1.T_SPECIES.Next; 
       until DataModule1.T_SPECIES.Eof; 
       DataModule1.T_KONCEPT.Next; 
     until DataModule1.T_KONCEPT.Eof; 
  end;
  MainNode.Expand(False); и при выборе какой-либо записи происходит отображение данных из Базы: Код: If Node<>nil then 
 if Node.AbsoluteIndex<>0 then 
   if Node.Parent.AbsoluteIndex<>0 then 
    begin
     DataModule1.T_REC.First; 
     if DataModule1.T_REC.FieldByName('NAME_RECORDS').AsString<>Node.Text then
     repeat
      DataModule1.T_REC.Next;
     until DataModule1.T_REC.FieldByName('NAME_RECORDS').AsString=Node.Text;
     DataModule1.T_KONCEPT.First;
     repeat
        if DataModule1.T_REC.FieldByName('KONCEPT_RECORDS').asInteger=DataModule1.T_KONCEPT.FieldByName('ID_KONCEPT').asInteger then Panel2.Caption:=DataModule1.T_KONCEPT.FieldByName('NAME_KONCEPT').AsString;
        DataModule1.T_KONCEPT.Next;
     until DataModule1.T_KONCEPT.Eof;
     DataModule1.T_SPECIES.First;
     repeat
        if DataModule1.T_REC.FieldByName('SPECIES').asInteger=DataModule1.T_SPECIES.FieldByName('ID_SPEC').asInteger then 
        Panel3.Caption:=DataModule1.T_SPECIES.FieldByName('NAME_SPEC').AsString;
        DataModule1.T_SPECIES.Next;
     until DataModule1.T_SPECIES.Eof;
end;В чем может быть проблема? | 
| 
			 
			#2  
			
			
			
			
		 | ||||
| 
 | ||||
|   Видимо при поиске возникает "вечный" цикл, лучше использовать DataModule1.T_REC.Locate('SPECIES',надпись на ветке,[loPartialKey]) и без всяких Repeat | 
| 
			 
			#3  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 А можно для моего случая, хотя бы для части ветки код написать? | 
| 
			 
			#4  
			
			
			
			
		 | ||||
| 
 | ||||
|   Можно, но к сожалению, у меня нет такой чудной базуки как у вас, попробую на своих тараканчиках отработать когда будет времени побольше свободного, извнт, придётся подождать Добавлено немного позже Вот малая толика из того, что нашлось по вашей теме Последний раз редактировалось Alegun, 17.01.2017 в 22:50. |