C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
VirtualTreeView и ноды
nut
Отправлено: 26.02.2007, 08:02


Ученик-кочегар

Группа: Участник
Сообщений: 22



Ребят помогите как изменить в virtualtreeview надпись у ноды, пытался и по описанию самого компонента и находил статью на русском но она на делфи и переводил ее на с++, не получалось.
olegenty
Отправлено: 26.02.2007, 08:28


Ветеран

Группа: Модератор
Сообщений: 2412



см. OnGetText, и всё станет понятно.
nut
Отправлено: 07.03.2007, 11:19


Ученик-кочегар

Группа: Участник
Сообщений: 22



Всетаки не получилось у меня, я так понял что надо подцепить данные с нодой. Можно примерчик.
Doga
Отправлено: 09.03.2007, 14:36


Мастер участка

Группа: Участник
Сообщений: 575



Вот здесь

http://cbuilder.ru/forums/index.php?s=5e8c...l=vtvdemo&st=30

есть и пример по работе с TVirtualStringTree и ссылка на ресурс с русскоязычным описанием компонента
** desivers
Отправлено: 10.03.2007, 14:19


Не зарегистрирован







Скачал пример, очень все запутано мне не разобрать, может кинете примерчик. rolleyes.gif
desivers
Отправлено: 10.03.2007, 17:34


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Все ребят заканчиваю диплом но осталось разаобратся с этим компонентом, напишите примерчики простые для заненсение текста и картинок буду очень благодпрен, без него валится диплом. wizard.gif
desivers
Отправлено: 13.03.2007, 15:20


Дежурный стрелочник

Группа: Участник
Сообщений: 32



по ковырял VTW заношу данные таким способом

CODE

WideString Names[4]={
"Петя",
"Маша",
"Костя",
"Дима"
};


CODE

//---------------------------------------------------------------------------
void __fastcall TForm1::VirtualStringTree1GetText(TBaseVirtualTree *Sender,
     PVirtualNode Node, TColumnIndex Column, TVSTTextType TextType,
     WideString &CellText)
{
CellText = Names[Node->Index];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
VirtualStringTree1->NodeDataSize = sizeof(TPhoneNode);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
for( int i = 0; i <= 3; i++)
{
VirtualStringTree1->AddChild(NULL);
}
}
//---------------------------------------------------------------------------


но это очень не удобно есть способ по лучше?
olegenty
Отправлено: 13.03.2007, 16:22


Ветеран

Группа: Модератор
Сообщений: 2412



"не очень удобно" и "получше" — это очень относительная оценка. что конкретно не устраивает? а как устроило бы? а в чём проблема сделать так, как устроило бы?
desivers
Отправлено: 13.03.2007, 16:45


Дежурный стрелочник

Группа: Участник
Сообщений: 32



можно сделать както через структуру, так в примерах но они на дельфях вот и не как перести не могу, а смог только эти строки
olegenty
Отправлено: 14.03.2007, 08:37


Ветеран

Группа: Модератор
Сообщений: 2412



можно через что угодно. конкретизируй вопрос.
desivers
Отправлено: 14.03.2007, 10:57


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Вот смотрим хелп по нему, глава шаг за шагом там есть


Example class declaration

CODE

unit TreeData;
interface
//===========================================
type
// declare common node class
TBasicNodeData = class
protected
cName: ShortString;
cImageIndex: Integer;
public
constructor Create; overload;
constructor Create(vName: ShortString; vIIndex: Integer = 0); overload;
property Name: ShortString read cName write cName;
property ImageIndex: Integer read cImageIndex write cImageIndex;
end;
// declare new structure for node data
rTreeData = record
BasicND: TBasicNodeData;
end;
implementation
constructor TBasicNodeData.Create;
begin
{ not necessary
cName := '';
cImageIndex := 0;
}
end;
constructor TBasicNodeData.Create(vName: ShortString; vIIndex: Integer = 0);
begin
cName := vName;
cImageIndex := vIIndex;
end;
end.


Здесь вроде принцип понятен кроме

CODE

property Name: ShortString read cName write cName;
property ImageIndex: Integer read cImageIndex write cImageIndex;
constructor TBasicNodeData.Create;
begin
{ not necessary
cName := '';
cImageIndex := 0;
}
end;


Example creation of the tree

CODE

// Tree will be created when the form is created.
procedure TMyForm.FormCreate(Sender: TObject);
var
Node: PVirtualNode;
NodeD: ^rTreeData;
begin
// create tree
MyTree.NodeDataSize := SizeOf(rTreeData);
if MainControlForm.filename = '' then
begin
// create tree with top level node
Node := MyTree.AddChild(nil); // adds a node to the root of the tree
// assign data for this node
NodeD := MyTree.GetNodeData(Node);
NodeD.BasicND := TBasicNodeData.Create('new project');
end
else
begin
// load tree
end;
...
end;
// returns the text (the identification) of the node
procedure TMyForm.MyTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: Integer;
TextType: TVSTTextType; var Text: WideString);
var
NodeD: ^rTreeData;
begin
NodeD := Sender.GetNodeData(Node);
// return the identifier of the node
if NodeD.BasicND = nil then
Text := ''
else
Text := NodeD.BasicND.Name;
end;
// returns the index for image display
procedure TMyForm.MyTreeGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: Integer; var Index: Integer);
var
NodeD: ^rTreeData;
begin
NodeD := Sender.GetNodeData(Node);
case Kind of
ikState: // for the case the state index has been requested
Index := -1;
ikNormal, ikSelected: // normal icon case
Index := NodeD.BasicND.ImageIndex;
end;
end;


Здесь не понятно вот

CODE

NodeD: ^rTreeData;
NodeD := MyTree.GetNodeData(Node);
NodeD.BasicND := TBasicNodeData.Create('new project');


Вот надо разобраться с этим я так понимаю что при перерисовки текста и картинок каждая нода берет данные из соответствующей структуры.
desivers
Отправлено: 20.03.2007, 22:56


Дежурный стрелочник

Группа: Участник
Сообщений: 32



помогитте перевести
CODE

procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
 Data: PVSTRecord;
begin
 Data := Sender.GetNodeData(Node);
 if Assigned(Data) then
   Finalize(Data^);
end;


или напишите как у вас освобождается память
desivers
Отправлено: 22.03.2007, 23:36


Дежурный стрелочник

Группа: Участник
Сообщений: 32



а эту строку ка можно перевести

Include(InitialStates, ivsMultiline);

с этой сам разобрался

Отредактировано desivers — 24.03.2007, 02:44
desivers
Отправлено: 23.03.2007, 22:41


Дежурный стрелочник

Группа: Участник
Сообщений: 32



как открыть определенную ноду, есть FullExpand но он не годится. в обычном было такое, а как здесь быть?

Вернуться в Вопросы программирования в C++Builder