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

Вниз

DBGrid > TreeView > DBGrid   Найти похожие ветки 

 
SiDimka ©   (2012-04-17 21:01) [0]

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


 
Ega23 ©   (2012-04-17 21:53) [1]

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


 
Ega23 ©   (2012-04-17 21:53) [2]

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


 
SiDimka ©   (2012-04-17 22:18) [3]

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 22:22) [4]

Я так понял, руководствовался ты статьёй отсюда:
http://delphimaster.net/view/2-1334647596/  пост [7].
Статья плохая. Нет, если начать ковырять и разбираться, то здравое зерно там есть. Некоторое. Маленькое.
Но в качестве пособия для начинающих - выкинуть на помойку.


 
SiDimka ©   (2012-04-17 22:28) [5]

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


 
Ega23 ©   (2012-04-17 22:36) [6]


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


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


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


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


 
SiDimka ©   (2012-04-17 22:48) [7]

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


 
Ega23 ©   (2012-04-17 23:23) [8]


>  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 23:55) [9]

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

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


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


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

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


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


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


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


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

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 верхних веток


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

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


 
Ega23 ©   (2012-04-18 08:41) [14]

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

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


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


 
Ega23 ©   (2012-04-18 08:42) [15]

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


 
SiDimka ©   (2012-04-18 18:15) [16]

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

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


 
Ega23 ©   (2012-04-18 18:56) [17]

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


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

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

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


 
Ega23 ©   (2012-04-18 19:59) [19]


> Я так понимаю, что одной процедурой мне не обойтись.


Совершенно необязательно.
Начнём с того, что у тебя серьёзное недопонимание идеологии работы DBAware-компонентов.
Ты не двигаешься по DBGrid. Двигается курсор по набору данных, с которым связан твой DBGrid через DataSource.
Тебе, как я понимаю, нужна мастер-детальная связка.


 
SiDimka ©   (2012-04-18 20:15) [20]

>серьёзное недопонимание идеологии работы DBAware-компонентов

Учусь по книжкам самостоятельно, пэтому с некоторой терминологией проблемы.

>Тебе, как я понимаю, нужна мастер-детальная связка

Совешенно верно, только как правильно ее реализовать под данную задачу незнаю.


 
Jeer ©   (2012-04-18 20:59) [21]


> только как правильно ее реализовать


Построение под-дерева только на клиенте и его средствами всегда затратно.
Да и надо ли ?


 
Ega23 ©   (2012-04-18 21:22) [22]


> Построение под-дерева только на клиенте и его средствами
> всегда затратно.


Зависит от ситуации.
Как вы думаете, почему в стандартной поставке Delphi нет такого замечательного компонента, как TDBTreeView? Хотя казалось бы, чё там... Да и использование его не такая уж и редкость.


 
Jeer ©   (2012-04-18 21:45) [23]


> Как вы думаете,


Я не думаю, а также, как и ты - делаю.


 
SiDimka ©   (2012-04-18 21:49) [24]

> Как вы думаете, почему нет такого замечательного компонента, как TDBTreeView?

И мне очень интересно ПОЧЕМУ??!!
Вот выкачал ExpressDBTree 30-day trial посмотрел, и головняк решился бы одним махом. Все чего душа желала за 10 минут реализовывается:)), да вот незадача из-за одного компонента 1,5т капусты отгрузить:(


 
Ega23 ©   (2012-04-18 21:53) [25]


> Я не думаю, а также, как и ты - делаю.


Когда-то очень давно, возникла надобность такого компонента, ибо задолбались каждый раз писать "аналог" под каждую выборку, а в той задаче иерархических выборок было немало. Поскольку сам клиент на DBAware был построен, начальство сказало: "Надо!". Я пошурстил по тырнету, нашёл DevExpress. Начальство сказало: "Дорого, пиши сам", за что я ему до сих пор премного благодарен, ибо где-то с месяц разбирался в тонкостях работы связки TDataSet -> TDataSource -> TDataLink -> DBControl.
И в этой идеологии создать универсальный TDBTreeView действительно очень сложно. Даже я бы сказал невозможно. Пока не введут событие DataSet-а , которое сигнализирует о том, что он был изменён, и пока его не будут выплёвывать на TDataSet.EnableControls - нормальная работа с таким деревом будет нереальна.


 
Ega23 ©   (2012-04-18 21:55) [26]


> И мне очень интересно ПОЧЕМУ??!!


Потому что очень много ограничений. Универсальный компонент так не делают.


 
Jeer ©   (2012-04-18 21:58) [27]


> нормальная работа с таким деревом будет нереальна.


Она реальна для ограниченного круга задач, в частности для front-end приложений, когда справочники статичны.


 
SiDimka ©   (2012-04-18 22:15) [28]

Народ, может кто подскажет где найти DBTreeView фриварный, или где екзампл взять под TreeView чтобы сделать его нормальным DB под мою задчу. Т.е как связать его с TDataSet, TDataSource.


 
Jeer ©   (2012-04-18 23:53) [29]

На torry не пробовал поискать ?
Там много чего бывает.


 
Ega23 ©   (2012-04-19 00:38) [30]


> где екзампл взять под TreeView чтобы сделать его нормальным
> DB под мою задчу. Т.е как связать его с TDataSet, TDataSource.


Опиши задачу.

Но в целом, как мне кажется, если редактирования со стороны не будет, то тебе надо на события TDataSource приязаться.


 
SiDimka ©   (2012-04-19 01:05) [31]

Отображение 2-х веток, т.е верхней и одного чида, без добавлений, изменений, удалений.


 
Ega23 ©   (2012-04-19 01:19) [32]


> Отображение 2-х веток, т.е верхней и одного чида, без добавлений,
>  изменений, удалений.


Если ты думаешь, что это понятно, то ты ошибаешься.
Успокойся, забудь про Delphi, возьми бумажку и карандаш. И опиши задачу. Без своих соображений о том, как её надо решать. И представь, что ты эту задачу не программисту объясняешь, а, например, продавцу в магазине. Который вообще не понимает, что такое DBGrid, TreeView и DataSet.


 
SiDimka ©   (2012-04-19 01:39) [33]

В окне отображается 1я таблица с наименованием, дальше в дереве отображаются группы с подгруппами, затем во 2й таблице отображается содержимое подгрупп.


 
Ega23 ©   (2012-04-19 02:00) [34]

Ты уверен, что тебе нужна первая таблица?


 
SiDimka ©   (2012-04-19 02:08) [35]

Да, в данном случае удобней в таблице, чем первой веткой в дереве.


 
Ega23 ©   (2012-04-19 15:31) [36]


> Да, в данном случае удобней в таблице, чем первой веткой
> в дереве.


Я не уверен, что это будет удобнее. Впрочем - тебе виднее.
Тебе это "одноразово" надо, или ты данную связку как компонент собираешься использовать?


 
sniknik ©   (2012-04-19 15:51) [37]

> Одно это чего стоит:
первый цикл это похоже фетчолл чтобы во втором можно рекордкаунт использовать...
база/компоненты не указаны, как всегда, но вообще -
> Либо врёшь.
может и не врет, просто серверный курсор, с частичной скачанностью записей + рекордкаунт... ну и вместо того чтобы учится правильно писать начал "затычки" лепить/шаманством заниматься.


 
SiDimka ©   (2012-04-19 19:06) [38]

>Тебе это "одноразово" надо

Да одноразово, в одном окне определенного проекта. Надеюсь в будущем таким извращением не прийдется  заниматься.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.091 c
15-1352217376
Evgely
2012-11-06 19:56
2013.03.22
В окне кода вместо текста стали прямоугольники...


15-1330196934
wl
2012-02-25 23:08
2013.03.22
выскажите нодостатки ноута


15-1330181581
Pcrepair
2012-02-25 18:53
2013.03.22
TWebBrowser портит ссылки в коде страницы


2-1338196726
leklerk
2012-05-28 13:18
2013.03.22
Не работает WinExec


2-1332928600
ermine13
2012-03-28 13:56
2013.03.22
архиватор