Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.066 c
2-1346933403
Артём
2012-09-06 16:10
2013.03.22
Как щелкнуть по кнопку на сайте?


15-1345118559
Es
2012-08-16 16:02
2013.03.22
ADO + Ora = пропихнуть в хранимку blob более 32 кбайт


15-1353477561
alexdn
2012-11-21 09:59
2013.03.22
Учебник по asp.net


15-1344643133
wl
2012-08-11 03:58
2013.03.22
творение? потом...


2-1332258565
Сергей
2012-03-20 19:49
2013.03.22
Как добавить новое поле в таблицу Oracle с помощью dbExpress?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский