Jun 03

Конкурс

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

Суть конкурса очень проста: написать статью, возможно не большую, по использованию данного компонента. В статье может быть описаны как основы, так и профессиональное использование. Как описание свойств, так и какие-то баги.

Учитывая, что я пока один организовываю данный конкурс (хотя, возможно кто-то еще захочет поучавствовать в спонсорстве), призовой фонд не большой - 50$. Возможно, он будет увеличен в дальнейшем.

Есть еще одно условие, чтобы принять участие в конкурсе. Вы можете разместить статью где угодно (хотя, я буду рад, если она будет размещена в этом блоге), но в статье обязательно должно быть указано, что она создана для участия в данном конкурсе и должна стоять ссылка на данный блог. Может это и не красиво выглядит, но мне так хочется ;).

Желаю всем удачи.

P.S.: чуть не забыл. Конкурс продлиться до конца июня.


  1. marDuk
     Add karma Subtract karma  +0
    Цитировать.

    ссылка с поста только у меня не открывается?

    1
  2. AnTe
     Add karma Subtract karma  +0
    Цитировать.

    Подкажите, пожалуйста, как в VirtualTreeView привязать к узлам дерева объекты?

    в узлах TreeView от делфей, есть прекрасное свойство Data, которое имеет тип pointer. Через это свойство я и привязывал к узлу свой объект.

    В VirtualTreeView механизм какой-то муторный. Внутри хранятся данные типа “запись”, доступ – через мудрёный метод GetNodeData(Node). Сегодня уже попробовал сделать так:

    PRec = ^TRec;
    TRec = record
    name: string;
    num: integer;
    obj: TObject;
    end;

    Код:

    procedure TfmTest.btnGoClick(Sender: TObject);
    var
    NewNode: PVirtualNode;
    Rec: PRec;
    begin
    VT.NodeDataSize := SizeOf(TRec);
    NewNode := VT.AddChild(VT.FocusedNode);
    Rec := VT.GetNodeData(NewNode);
    if Assigned(Rec) then
    with Rec^ do
    begin
    Name := ‘Test’;
    num := 0;
    Obj := TObject.Create;
    showmess(obj.ClassName); // Выводит “TObject”
    end;
    end;

    Код:

    procedure TfmTest.VTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
    Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
    var
    Data: PRec;
    begin
    Data := Sender.GetNodeData(Node);
    if Assigned(Data) then
    begin
    CellText := Data^.Name; // работает
    CellText := Data^.Obj.ClassName; // не работает! в Obj лежит nil!
    end;
    end;

    2
  3. AnTe
     Add karma Subtract karma  +0
    Цитировать.

    Вроде разобрался…. Но всё равно, не покидает ощущение “странности”, в реализации компонента.

    Итак, бился полчаса над задачей.
    Имеем

    TreeView – свойство Data: Pointer
    VirtualTreeView – метод GetNodeData: Pointer;

    пишу две процедуры

    procedure TfmTest.btnTreeViewClick(Sender: TObject);
    var TN: TTreeNode;
    begin
    TN := TreeView1.Items.AddFirst(nil, ‘First’);
    TN.Data := TObject.Create; // положил
    ShowMessage(Tobject(TN.Data).ClassName); // вывел, успешно
    end;

    procedure TfmTest.btnVirtualTreeViewClick(Sender: TObject);
    var
    NewNode: PVirtualNode;
    begin
    VT.NodeDataSize := SizeOf(TObject);
    NewNode := VT.AddChild(nil, TObject.Create); // положил
    ShowMessage(Tobject(VT.GetNodeData(NewNode)).ClassName); // вывел, неуспешно, т.к. по какой-то причине нужно использовать p^
    end;

    ShowMessage(Tobject(VT.GetNodeData(NewNode)^).ClassName);
    Работает превосходно

    После разбирательств выяснена причина, в методе GetNodeData:
    Result := PByte(@Node.Data) + ….
    т.е. реально результат возращает указатель, на указатель!
    потому то крышечку и надо ставить

    я всё никак не пойму, с какой целью эти танцы с бубном производятся?
    неужто, чтобы данные типа record хранить в дереве?
    ЗАЧЕМ??

    3

Поделитесь вашими мыслями



Ссылки в комментариях будут свободны от nofollow.

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Ссылки в комментариях будут свободны от nofollow.