Topic: Вопросы по TreeView
В продолжении темы http://myvisualdatabase.com/forum/viewtopic.php?id=4096
При переносе уровней (SQL запросом) дерева как проверить что ветку собираются перенести в себя уровнем ниже?
My Visual Database → Russian → Вопросы по TreeView
В продолжении темы http://myvisualdatabase.com/forum/viewtopic.php?id=4096
При переносе уровней (SQL запросом) дерева как проверить что ветку собираются перенести в себя уровнем ниже?
И еще вопрос, по формированию дерева, описание проблемки с картинками во вложении
В продолжении темы http://myvisualdatabase.com/forum/viewtopic.php?id=4096
При переносе уровней (SQL запросом) дерева как проверить что ветку собираются перенести в себя уровнем ниже?
Скачайте последнюю версию
https://www.dropbox.com/s/5x7vjreoju45z … a.zip?dl=0
Добавил методы для компонента, которые позволяют работать с уровнями
ShowMessage( Form1.TreeView1.GetChildCount(Form1.TreeView1.SelectedRow) );
ShowMessage( Form1.TreeView1.GetLevel(Form1.TreeView1.SelectedRow) );
ShowMessage( Form1.TreeView1.HasChildren(Form1.TreeView1.SelectedRow) );
Form1.TreeView1.SelectedRow := Form1.TreeView1.GetFirstChild(Form1.TreeView1.SelectedRow);
Form1.TreeView1.SelectedRow := Form1.TreeView1.GetLastChild(Form1.TreeView1.SelectedRow);
Form1.TreeView1.SelectedRow := Form1.TreeView1.GetNextSibling(Form1.TreeView1.SelectedRow);
Form1.TreeView1.SelectedRow := Form1.TreeView1.GetParent(Form1.TreeView1.SelectedRow);
Form1.TreeView1.SelectedRow := Form1.TreeView1.GetPrevSibling(Form1.TreeView1.SelectedRow);
Обратите внимание, методы работают не с ID идентификаторами в БД, а с индексом (порядковый номер)
И еще вопрос, по формированию дерева, описание проблемки с картинками во вложении
ParentID менят родителя, т.е. его необходимо менять, когда хотите перенести запись в другую ветку.
Чтобы иметь возможность менять позицию записей без изменения родительской ветки, необходимо создать еще одно поле, например position.
Сделал для вас проект с примером:
Добрый день.
Еще вопрос, подскажите не совсем понимаю какой из вышеуказанных методов можно применить при перемещении записи саму в себя и выдать запрет на такое перемещение т.к. ветка размыкается. Пример действия которое нужно запретить на картинке во вложении.
Видимо тут необходимо проверить, не является ли узел родительским по отношению того места, куда данный узел хотят переместить.
Для этого можно пройтись по дереву с помощью метода GetParent (пока GetLevel > 0), чтобы проверить, не встретится ли данный узел.
Если не получиться самостоятельно, приложите ваш проект, в котором релизован механизм перемещения веток, постараюсь помочь.
Видимо тут необходимо проверить, не является ли узел родительским по отношению того места, куда данный узел хотят переместить.
Для этого можно пройтись по дереву с помощью метода GetParent (пока GetLevel > 0), чтобы проверить, не встретится ли данный узел.
Если не получиться самостоятельно, приложите ваш проект, в котором релизован механизм перемещения веток, постараюсь помочь.
Проект прикладываю, помогите с проверкой, еще там в архиве в Ворде небольшой вопрос по определенному переносу записи перестают отображаться в дереве
Проверкую можно сделать так
function CheckTreeOk(TreeView: TdbTreeView; FromIndex, ToIndex: integer): boolean;
var
i: integer;
begin
result := True;
i := ToIndex;
while TreeView.GetLevel(i) > 0 do
begin
i := TreeView.GetParent(i);
if i = FromIndex then
begin
Result := False;
Break;
end;
end;
end;
procedure perenos_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
if CheckTreeOk(Form1.TreeView1, Form1.TreeView1.SelectedRow, perenos.TreeView1.SelectedRow) then
begin
//Перед перемещением помогите сделать проверку чтобы нельзя было переносить ниже по этой ветке
SQLExecute('UPDATE skup SET ParrentID='+IntToStr(perenos.TreeView1.dbItemID)+' WHERE id='+IntToStr (Form1.TreeView1.dbItemID)+' ');// Переносим записи меняем Parrent ID у выбранной записи
Form1.TreeView1.dbUpdate;
perenos.Close;
end else ShowMessage('You can''t');
end;
А вот то, что ветки не отображается, это ошибка в программе, поправлю.
Проверкую можно сделать так
function CheckTreeOk(TreeView: TdbTreeView; FromIndex, ToIndex: integer): boolean; var i: integer; begin result := True; i := ToIndex; while TreeView.GetLevel(i) > 0 do begin i := TreeView.GetParent(i); if i = FromIndex then begin Result := False; Break; end; end; end; procedure perenos_Button1_OnClick (Sender: TObject; var Cancel: boolean); begin if CheckTreeOk(Form1.TreeView1, Form1.TreeView1.SelectedRow, perenos.TreeView1.SelectedRow) then begin //Перед перемещением помогите сделать проверку чтобы нельзя было переносить ниже по этой ветке SQLExecute('UPDATE skup SET ParrentID='+IntToStr(perenos.TreeView1.dbItemID)+' WHERE id='+IntToStr (Form1.TreeView1.dbItemID)+' ');// Переносим записи меняем Parrent ID у выбранной записи Form1.TreeView1.dbUpdate; perenos.Close; end else ShowMessage('You can''t'); end;
А вот то, что ветки не отображается, это ошибка в программе, поправлю.
Круто, работает. Можно пояснить некоторые команды:
i := ToIndex;
i = FromIndex
Данным переменным присваивается индекс выбранной строки, откуда и куда необходимо перенести ветку.
Скачайте пожалуйста последнюю бета версию
https://www.dropbox.com/s/5x7vjreoju45z … a.zip?dl=0
Теперь не должно быть проблем с отображением веток при переносе.
Скачайте пожалуйста последнюю бета версию
https://www.dropbox.com/s/5x7vjreoju45z … a.zip?dl=0Теперь не должно быть проблем с отображением веток при переносе.
Добрый день, проблем с переносом теперь не наблюдается, но появилось следующее, в записи которая так сказать первого уровня (TOP), и последняя в списке в поле Parrent ID сидит какое то число, т.е при раскраске по условию:
procedure new_poruch_TreeView1_OnChange (Sender: TObject); // Раскрашиваем Дерево
var
c, i:integer;
begin
//new_poruch.TreeView1.Columns[1].Visible:= False; //Скрываем колонку ID Parrent
new_poruch.TreeView1.BeginUpdate;
c := new_poruch.TreeView1.RowCount - 1;
for i := 0 to c do
begin
if new_poruch.TreeView1.Cells[1,i] = '0' then //если запись первого уровня то делаем раскраску
begin
new_poruch.TreeView1.SelectedRow :=0; //перемещаем курсор на первую строку
new_poruch.TreeView1.Cell[0,i].TextColor := $008A4500; //если стартовое поручение то окрашиваем текст в синий цвет
new_poruch.TreeView1.Cell[0,i].FontStyle := fsBold; //Если поручение Раздел то делаем его жирным
new_poruch.TreeView1.Cell[0,i].Color := $00E0E0E0; // Заливаем фон
new_poruch.TreeView1.Cell[1,i].Color := $00E0E0E0; // Заливаем фон
new_poruch.TreeView1.Cell[2,i].Color := $00E0E0E0; // Заливаем фон
new_poruch.TreeView1.Cell[3,i].Color := $00E0E0E0; // Заливаем фон
end;
end;
new_poruch.TreeView1.EndUpdate;
end;
Последняя запись не проходит на условие равенства нулю и не раскрашивается.
Скрин во вложении
Также в записи которая так сказать первого уровня (TOP) и последняя в списке не выводятся другие данные, даты, чек боксы и т.д.
Спасибо за найденную ошибку, поправил, проверьте пожалуйста
https://www.dropbox.com/s/5x7vjreoju45z … a.zip?dl=0
Ок, спасибо, теперь все в порядке
My Visual Database → Russian → Вопросы по TreeView
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi