![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DBGrid > TreeView > DBGrid [D7, D2005]
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]Только не весь, изложи краткую версию