Topic: Вопросы по TreeView

В продолжении темы http://myvisualdatabase.com/forum/viewtopic.php?id=4096

При переносе уровней (SQL запросом) дерева как проверить что ветку собираются перенести в себя уровнем ниже?

Re: Вопросы по TreeView

И еще вопрос, по формированию дерева, описание проблемки с картинками во вложении

Post's attachments

Attachment icon Вопрос по переносу.docx 153.16 kb, 406 downloads since 2018-03-22 

Re: Вопросы по TreeView

Evgeniy D wrote:

В продолжении темы 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 идентификаторами в БД, а с индексом (порядковый номер)

Dmitry.

Re: Вопросы по TreeView

Evgeniy D wrote:

И еще вопрос, по формированию дерева, описание проблемки с картинками во вложении

ParentID менят родителя, т.е. его необходимо менять, когда хотите перенести запись в другую ветку.


Чтобы иметь возможность менять позицию записей без изменения родительской ветки, необходимо создать еще одно поле, например position.


Сделал для вас проект с примером:

Post's attachments

Attachment icon TreeView change position.zip 7.57 kb, 444 downloads since 2018-03-22 

Dmitry.

Re: Вопросы по TreeView

Добрый день.
Еще вопрос, подскажите не совсем понимаю какой из вышеуказанных методов можно применить при перемещении записи саму в себя и выдать запрет на такое перемещение т.к. ветка размыкается. Пример действия которое нужно запретить на картинке во вложении.

Post's attachments

Attachment icon tree.JPG 14.45 kb, 216 downloads since 2018-03-27 

Re: Вопросы по TreeView

Видимо тут необходимо проверить, не является ли узел родительским по отношению того места, куда данный узел хотят переместить.


Для этого можно пройтись по дереву с помощью метода GetParent (пока GetLevel > 0), чтобы проверить, не встретится ли данный узел.


Если не получиться самостоятельно, приложите ваш проект, в котором релизован механизм перемещения веток, постараюсь помочь.

Dmitry.

Re: Вопросы по TreeView

DriveSoft wrote:

Видимо тут необходимо проверить, не является ли узел родительским по отношению того места, куда данный узел хотят переместить.


Для этого можно пройтись по дереву с помощью метода GetParent (пока GetLevel > 0), чтобы проверить, не встретится ли данный узел.


Если не получиться самостоятельно, приложите ваш проект, в котором релизован механизм перемещения веток, постараюсь помочь.

Проект прикладываю, помогите  с проверкой, еще там в архиве в Ворде небольшой вопрос по определенному переносу записи перестают отображаться в дереве

Post's attachments

Attachment icon Tree.rar 397.77 kb, 376 downloads since 2018-03-29 

Re: Вопросы по TreeView

Проверкую можно сделать так

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;

А вот то, что ветки не отображается, это ошибка в программе, поправлю.

Dmitry.

Re: Вопросы по TreeView

DriveSoft wrote:

Проверкую можно сделать так

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
   

Re: Вопросы по TreeView

Данным переменным присваивается индекс выбранной строки, откуда и куда необходимо перенести ветку.

Dmitry.

Re: Вопросы по TreeView

Скачайте пожалуйста последнюю бета версию
https://www.dropbox.com/s/5x7vjreoju45z … a.zip?dl=0


Теперь не должно быть проблем с отображением веток при переносе.

Dmitry.

Re: Вопросы по TreeView

DriveSoft wrote:

Скачайте пожалуйста последнюю бета версию
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;

Последняя запись не проходит на условие равенства нулю и не раскрашивается.
Скрин во вложении

Post's attachments

Attachment icon 1.JPG 46.12 kb, 208 downloads since 2018-04-03 

Re: Вопросы по TreeView

Также в записи которая так сказать первого уровня (TOP) и последняя в списке не выводятся другие данные, даты, чек боксы и т.д.

Post's attachments

Attachment icon 1.JPG 75.5 kb, 205 downloads since 2018-04-04 

Re: Вопросы по TreeView

Спасибо за найденную ошибку, поправил, проверьте пожалуйста
https://www.dropbox.com/s/5x7vjreoju45z … a.zip?dl=0

Dmitry.

Re: Вопросы по TreeView

Ок, спасибо, теперь все в порядке