Форум: "Начинающим";
Текущий архив: 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.093 c