![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DragDrop в DBTreeList [D5, IB6.x]
RDA © (2003-02-13 12:13:00)Обычная таблица (ID,PARENT,KIND,NAZV) где KIND - smallint и определяет тип записи (подразделение-0, отдел-1, сотрудник-2). Свойство DBTreeList DragMode=dmAutomatic. При переносе все работает отлично но есть одно но - нижний уровень в иерархии сотрудник (KIND=2) - как недопустить переноса сотрудника так чтобы его родителем оказался тоже сотрудник. Думаю нужно обрабатывать событие DragOver - но не знаю как правильно это сделать.
RDA (2003-02-15 13:28:00) [1]Переписал снова,
procedure TfmStr.TreeListDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
TargetNode, SourceNode : TdxTreeListNode;
begin
TargetNode:=TreeList.GetNodeAt(X,Y);
SourceNode:=TreeList.FocusedNode;
if (TargetNode<>nil) and (SourceNode.ImageIndex>0) then
case TargetNode.ImageIndex of
0 : if SourceNode.ImageIndex in [1,2,3] then Accept:=True;
1 : if SourceNode.ImageIndex in [2,3] then Accept:=True;
2 : Accept:=False;
3 : Accept:=False;
end
else Accept:=False;
end;
Теперь глюк при переносе SourceNode.ImageIndex=1 в TargetNode.ImageIndex=0;
Вообщем не знаю в чем проблема. Буду очень признателен за помощь.
RDA (2003-02-15 08:16:00) [2]Последний вариант
procedure TfmStr.TreeListDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
TargetNode, SourceNode : TdxTreeListNode;
begin
TargetNode:=TreeList.GetNodeAt(X,Y);
SourceNode:=TreeList.FocusedNode;
if TargetNode<>nil then
case TargetNode.ImageIndex of
0 : if SourceNode.ImageIndex in [1,2,3] then Accept:=True;
1 : if SourceNode.ImageIndex in [2,3] then Accept:=True;
2 : Accept:=False;
3 : Accept:=False;
end;
end;
Тот же глюк TargetNode.ImageIndex=0 становиться родительским для SourceNode.ImageIndex=0.
RDA (2003-02-14 18:40:00) [3]Переписал и снова глюк
procedure TfmStr.TreeListDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
TargetNode, SourceNode : TdxTreeListNode;
begin
TargetNode:=TreeList.GetNodeAt(X,Y);
SourceNode:=TreeList.FocusedNode;
if TargetNode<>nil then
case TargetNode.ImageIndex of
0 : if SourceNode.ImageIndex in [1,2,3] then Accept:=True;
1 : if SourceNode.ImageIndex in [2,3] then Accept:=True;
2 : if SourceNode.ImageIndex in [2,3] then Accept:=False;
3 : if SourceNode.ImageIndex in [2,3] then Accept:=False;
else
Accept:=True;
end;
end;
Не пойму почему SourceNode.ImageIndex=0 спокойно переноситься в
TargetNode.ImageIndex=0
Sheriff (2003-02-14 16:06:00) [4]он пытается по картинкам определить сотрудник это или отдел.
MBo (2003-02-14 15:07:00) [5]я не знаю, что кроется под разными ImageIndex, но такое впечатление, что логика неверна -
>if SourceNode.ImageIndex=0 then Accept:=False;
этот результат дальше игнорируется
>if (SourceNode.ImageIndex=1) and (TargetNode.ImageIndex=0) then Accept:=True
else Accept:=False;
и этот тоже
if (SourceNode.ImageIndex in [2,3]) and (TargetNode.ImageIndex in [0,1]) then Accept:=True
else Accept:=False
только этот учитывается.
объедини логические выражения в одно либо вставь выход после каждого False
RDA (2003-02-14 13:46:00) [6]К данному вопросу - не пойму почему не работает данный код
procedure TfmStr.TreeListDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
TargetNode, SourceNode : TdxTreeListNode;
begin
try
TargetNode := TreeList.GetNodeAt(X,Y);
SourceNode := TreeList.FocusedNode;
if TargetNode<>nil then
begin
if SourceNode.ImageIndex=0 then Accept:=False;
if (SourceNode.ImageIndex=1) and (TargetNode.ImageIndex=0) then Accept:=True
else Accept:=False;
if (SourceNode.ImageIndex in [2,3]) and (TargetNode.ImageIndex in [0,1]) then Accept:=True
else Accept:=False;
end;
except
end;
end;
Соловьев (2003-02-14 12:22:00) [7]А там разве нет события OnDragOver в Object Inspector???
RDA (2003-02-14 12:16:00) [8]Неужели никто не знает ответа. Может неправильно сформулировал.