Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DBGrid > TreeView > DBGrid [D7, D2005]


Страницы:   1 2

SiDimka ©   (2012-04-17 21:01:00) 

Пдскажите плиз как переоткыть правильно TreeView.
TreeView > DBGrid работает без проблем, а вот DBGrid > TreeView при меремещении по записям дорисовывает уже созданые ветки, делаю клер TreeView item, перестает отрисовывать ветки.


SiDimka   (2012-04-18 19:26:00) [21]

>Изложи задачу

Перемещаясь по DBGrid1 должно меняться(перерисовываться) дерево.
Я так понимаю, что одной процедурой мне не обойтись.
Правильней будет разбить на две 1) Должна отрисовывать Node 2)NodeChild ?


Ega23   (2012-04-18 18:56:00) [22]

Я ничего не понял. Изложи задачу внятно.


SiDimka   (2012-04-18 18:15:00) [23]

>что мешает выбрать всю таблицу целиком

Да, уже подшел к этому. Суть какова, есть DataSet1 связаный с DBGrid1, дальше через DataSet1.AfterScroll вяжу запрос для dstTree, чтобы при пермещении по DBGrid1 перерисовывалось дерево. Но как перестоить под это дерево никак въехать не могу. Помогите плиз!


Ega23   (2012-04-18 08:42:00) [24]

Ну и самое главное: что мешает выбрать всю таблицу целиком? Один раз. Потом - построить дерево.


Ega23   (2012-04-18 08:41:00) [25]

Во-первых, RecordCount, да.
Во-вторых, тут ещё одна ошибка:

dstTrItem.First;
    if (dstTrItem.FieldByName('ID').AsInteger <> 0) then
      begin


Представь, что выборка ни одной записи не вернула.


Германн   (2012-04-18 03:02:00) [26]

Имхо "шаманство". Пляски с бубном вокруг RecordCount.
Иногда это шаманство помогает достичь результата. Но ... :(


SiDimka   (2012-04-18 00:41:00) [27]

procedure TFRole.ExpandLevel(Node: TTreeNode);
var
 ID, i: Integer; TreeNode: TTreeNode;
begin
 if Node = nil then ID:=0 else ID:=Integer(Node.Data);

 dstTree.Close;
 s := 'SELECT * FROM LIST_OBJ WHERE (PARENT_ID = :PARENTID) AND ROLE_ID = :ID) ';
 s := s+'AND (IS_GROUP <= 1) ORDER BY ID';
 AddSelectSQL(s, dstTree);
 dstTree.ParamByName('ParentID').AsInteger := ID;
 dstTree.ParamByName('ID').AsInteger := dstRole.FieldByName('ID').AsInteger;
 dstTree.Open;
 TvRole.Items.BeginUpdate;
 dstTree.First;
 while not dstTree.Eof do dstTree.Next;
    dstTree.First;
 for i:=1 to dstTree.RecordCount do
   begin
     ID := dstTree.FieldByName('ID').AsInteger;
     TreeNode := TvRole.Items.AddChildObject(Node,
                 dstTree.FieldByName('DISP_NAME').AsString, Pointer(ID));
     TreeNode.ImageIndex:=1;
     TreeNode.SelectedIndex:=2;
     s := 'SELECT ID FROM LIST_OBJ WHERE (PARENT_ID = :PARENTID) AND (IS_GROUP <= 1)';
     AddSelectSQL(s, dstTrItem);
     dstTrItem.ParamByName('PARENTID').AsInteger := dstTree.FieldByName('ID').AsInteger;
     dstTrItem.Open;
     dstTrItem.First;
     if (dstTrItem.FieldByName('ID').AsInteger <> 0) then
       begin
         TvRole.Items.AddChildObject(TreeNode , '' , nil);
         dstTrItem.Close;
       end;
     dstTree.Next;
   end;
 TvRole.Items.EndUpdate;
end;

// Вот она целяком, говорю как есть, так оно и работает,  если убрать  "dstTree.First; while not dstTree.Eof do  dstTree.Next;" повторяю отрисовывеет только одну из 8 верхних веток


Ega23   (2012-04-18 00:02:00) [28]


> без этого оно брало у меня тольку первую верхнюю, а остятьные
> не отрисовывало


Код говорит совершенно другое.
Либо ты привёл не тот код. Либо врёшь.


Amoeba_   (2012-04-17 23:55:00) [29]


> DBTreeView под 2005 я не нашел.

Есть в библиотеке JVCL, куда вошло вместе с RaLib.


SiDimka   (2012-04-17 23:55:00) [30]

dstTree.First;
while not dstTree.Eof do
  dstTree.Next;

без этого оно брало у меня тольку первую верхнюю, а остятьные не отрисовывало


Ega23   (2012-04-17 23:23:00) [31]


>  dstTree.Eof получается True, как его сбросить в False я
> никак не въеду.


Да у тебя тут говнокода - мама не горюй.
Одно это чего стоит:
dstTree.First;
while not dstTree.Eof do
  dstTree.Next;

dstTree.First;
for i:=1 to dstTree.RecordCount do
  begin


SiDimka   (2012-04-17 22:48:00) [32]

Та в этой части TreeView > DBGrid2 пролем нет, под фибами работает изумительно. Но я не могу никак добиться нормальной перестройки дерева "на лету" при изменении запроса. Я так мыслю, что в любом случае TreeView нужно очистить, с этим тоже нет проблем. Но когда откываеш нижнюю ветку и перемещаешся по гриду1, отказывается отрисовывать. dstTree.Eof получается True, как его сбросить в False я никак не въеду.


Ega23   (2012-04-17 22:36:00) [33]


> А какую посоветуеш?


Я в той ветке всё написал. Равно как и некоторые комментарии к статье.


> DBTreeView под 2005 я не нашел.


Стандартного - не найдёшь. TDBTreeView в стандартной поставке Delphi отсутствует по целому ряду причин. Хотябы потому, что для правильного построения дерева оно должно работать на любом потомке TDataSet. А там никто не даёт гарантию о фетче данных до конца.
Ну и DisableControls\EnableControls тоже "жгут"


SiDimka   (2012-04-17 22:28:00) [34]

А какую посоветуеш? DBTreeView под 2005 я не нашел. Пришлось выкручиваться.


Ega23   (2012-04-17 22:22:00) [35]

Я так понял, руководствовался ты статьёй отсюда:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1334647596&n=18 пост [7].
Статья плохая. Нет, если начать ковырять и разбираться, то здравое зерно там есть. Некоторое. Маленькое.
Но в качестве пособия для начинающих - выкинуть на помойку.


SiDimka   (2012-04-17 22:18:00) [36]

procedure TFRole.ExpandLevel(Node: TTreeNode);
var
 ID, i: Integer;
 TreeNode: TTreeNode;
begin
 if Node = nil then
   ID:=0
 else
   ID:=Integer(Node.Data);

 селект, адд

 TvRole.Items.BeginUpdate;

 dstTree.First;
 while not dstTree.Eof do
   dstTree.Next;

 dstTree.First;
 for i:=1 to dstTree.RecordCount do
   begin
     добавили ветку

    селект, адд

     
     добавили нижнюю ветку
       end;
     dstTree.Next;
   end;

 TvRole.Items.EndUpdate;
end;

procedure TFRole.DBGridKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 
 если делаю  (  TvRole.Items.Clear; ) не отрисовывается, убираю естественно добавляет итемы в нижнюю или верхнюю ветку смотря на какой стоиш
     

 case Key of
   VK_UP, VK_DOWN,
   VK_LEFT, VK_RIGHT,
   VK_HOME, VK_END: ExpandLevel(NodeTemp);
 end;
 
end;


Ega23   (2012-04-17 21:53:00) [37]

Смотря как сделал. Код показывай.


Ega23   (2012-04-17 21:53:00) [38]

Только не весь, изложи краткую версию


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо