![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
18192123 |
![]()
Сообщение
#41
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Ну, если дерево будет именно таким, как было сказано в самом первом посте, то с этим проблем нет, можно в конце концов выделять римские числа в заголовках узлов и проверять, подходит ли потомок к выбранному предку... А вот если я в группу "Неметаллы" захочу внести Селен и Теллур - ты сама, не заглядывая в таблицу вряд ли сможешь определить (по смыслу) ошибся ли я, и какой именно элемент не подходит для данной группы. Так что только по смыслу здесь не пойдет. Нужна какая-то доп. информация. Немного другое имела ввиду: есть кнопки добавить период добавить ряд добавить группу добавить подгруппу добавить элемент и например моё TreeView Код I-й период 1-й ряд I-я группа Ia VIII-я группа И я хочу добавить в I-я группу ещё один узел Iб, т.е для этого я должна выделить этот узел [I-я группа] и нажать кнопку добавить подгруппу. И если выделить узел Ia или 1-й ряд, то при нажатии на кнопку мне приложение должно запретить действия и "сказать", что "подгруппа - это наследник Группа".. Вот чего хочу добиться, только не пойму, как.. Сообщение отредактировано: 18192123 - 16.12.2008 22:31 |
volvo |
![]()
Сообщение
#42
|
Гость ![]() |
А, вот ты о чем... Ну, это просто: у каждого узла дерева есть поле Level (уровень, на котором этот узел находится), тебе надо будет всего навсего проверить его...
Скажем, при нажатии на кнопку в твоем примере проверка должна быть: if TreeView1.Selected.Level = 2 then begin // Level начинается с 0
// Здесь добавление узла, как обычно
end
else ShowMessage('Подгруппа - это наследник Группа');
|
18192123 |
![]()
Сообщение
#43
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Спасибо!!)
Получилось, как и хотела!!) И ещё один вопрос..в таком же духе.. Вот таким образом было сделано перемещение узлов в пределах TreeViewNew:
procedure TFormMain.MoveNode(TargetNode, SourceNode: TTreeNode);
var
nodeTmp: TTreeNode;
i: Integer;
begin
with TreeViewNew do
begin
nodeTmp := Items.AddChildObject(TargetNode, SourceNode.Text, SourceNode.Data);
for i := 0 to SourceNode.Count - 1 do
begin
MoveNode(nodeTmp, SourceNode.Item[i]);
end;
end;
end;
procedure TFormMain.TreeViewNewDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
TargetNode, SourceNode: TTreeNode;
begin
with TreeViewNew do
begin
TargetNode := GetNodeAt(X, Y); // Get target node
SourceNode := Selected;
if (TargetNode = nil) then
begin
EndDrag(False);
Exit;
end;
MoveNode(TargetNode, SourceNode);
SourceNode.Free;
end;
end;
procedure TFormMain.TreeViewNewDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
if (Sender = TreeViewNew) then // If TRUE than accept the draged item
begin
Accept := True;
end;
end;
Можно ли как-нибудь учесть, чтоб перемещение осуществлялось в таком духе: 1-й ряд переместить только во 2-й период (ну и наоборот), исключая возможность чтоб ряд попал в группу?? ну по такой же схеме с остальным..Объясните пожалуйста! Код I период 1 ряд I группа VIII группа II период 2 ряд I группа II группа |
volvo |
![]()
Сообщение
#44
|
Гость ![]() |
procedure TFormMain.TreeViewNewDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
TargetNode, SourceNode: TTreeNode;
begin
with TreeViewNew do
begin
TargetNode := GetNodeAt(X, Y); // Get target node
SourceNode := Selected;
if (TargetNode = nil) or (TargetNode.Level + 1 <> SourceNode.Level) then // <---
begin
EndDrag(False);
Exit;
end;
MoveNode(TargetNode, SourceNode);
SourceNode.Free;
end;
end;
Это имела в виду? |
18192123 |
![]()
Сообщение
#45
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 21:27 |