Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2010, 15:43   #1
TzX
Пользователь
 
Аватар для TzX
 
Регистрация: 23.12.2009
Сообщений: 57
По умолчанию Построение дерева

Здравствуйте.
Необходим компонент для построения дерева. Вся сложность в том что в него нужно вставить несколько картинок. Нужна структура вроде "картинка-картинка-текст-картинка" Банальный пример контакт-лист в QIP. Необходимо реализовать так же как и там. Со вставкой одного изображения проблем нет, можно решить и стандартными средствами, а вот с несколькими проблема. Натолкните на мысль по решению данной проблемы. С компонентом VirtualTree что-то разобраться не смог, хотя там такое точно возможно.
Заранее спасибо за ответ.
TzX вне форума Ответить с цитированием
Старый 13.07.2010, 10:24   #2
Korben5E
Форумчанин
 
Аватар для Korben5E
 
Регистрация: 13.07.2010
Сообщений: 346
По умолчанию

ну например так я рисую чекбоксы в TreeView


Код:
void __fastcall TfListMetod::TreeViewCustomDrawItem(
      TCustomTreeView *Sender, TTreeNode *Node, TCustomDrawState State,
      bool &DefaultDraw)
{
return;
/*
  UINT drState;
  TRect NodeRect, cbRect;
// определить область рисования текста
  NodeRect = Node->DisplayRect(true);
// сделать копию для рисования чекбокса
  cbRect = NodeRect;
// чекбокс рисуем справа от надписи - сдвигаем левую сторону по правой стороне текста
  cbRect.left = cbRect.right;
// устанавливаем ширину равную высоте текста
  cbRect.right = (NodeRect.bottom-NodeRect.top) + cbRect.right;

// берем переменную из рисуемого элемента

  ;
// и установка вида чекбокса в зависимости от переменной
  if  ( PParentMetod(Node->Data)->checked )
      drState = DFCS_BUTTONCHECK | DFCS_CHECKED;
  else
      drState = DFCS_BUTTONCHECK;

// если комп используется - сделать серым
//  if  Komp->Disabled then
//      drState = DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_INACTIVE;

// устанваливаем цвета рисования
      TreeView->Canvas->Brush->Color = TColor(0xA0FFA0);
      TreeView->Canvas->Font->Color = clBlack;
	  TreeView->Canvas->FillRect(NodeRect);
// рисуем чекбокс
      DrawFrameControl( TreeView->Canvas->Handle, &cbRect, DFC_BUTTON, drState);
// рисуем текст
	  TreeView->Canvas->TextOut(NodeRect.Left, NodeRect.Top, Node->Text);
*/
}
Non est culpa vin, sed culpa bibentis
Korben5E вне форума Ответить с цитированием
Старый 20.07.2010, 15:20   #3
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

И все же на мой взгляд стоит разобраться с VirtualTree. Ничего не потеряешь. Более этого в тавоем арсенале появится очень мощная штука. Приведу примитивный пример для отображения картинок в VirtualStringTree. Естественно возможности компонента этим не ограничиваются. Пробуй. Не получится - разберемся

ЗЫ. Только имей ввиду, что данный пример я набирал в Д2010. Просто скопировать его в Д7 не получится (не соответствие параметров в методах VT)

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, VirtualTrees;

type
  TNodeData = record
    Text: WideString;
    im: integer;
  end;

  PNodeData = ^TNodeData;

type
  TForm1 = class(TForm)
    Tree1: TVirtualStringTree;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure Tree1GetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean;
      var ImageIndex: Integer);
    procedure Tree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
  private
    Data: PNodeData;
    Node: PVirtualNode;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  Tree1.NodeDataSize := SizeOf(TNodeData);

  for i := 0 to 4 do
  begin
    Node := Tree1.AddChild(nil);
    Data := Tree1.GetNodeData(Node);
    Data^.Text := 'Текст ' + IntToStr(i);
    Data^.im := i;
  end;
end;

procedure TForm1.Tree1GetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  Data: PNodeData;
begin
  Data := Sender.GetNodeData(Node);

  case Column of
    0: ImageIndex := Data^.im;
    1: ImageIndex := Data^.im + 1;
  end;
end;

procedure TForm1.Tree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
  Data: PNodeData;
begin
  Data := Sender.GetNodeData(Node);

  case Column of
    0: CellText := Data^.Text;
  end;
end;

end.

Последний раз редактировалось Баламут; 20.07.2010 в 15:31.
Баламут вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение дерева 29AHexNumber Общие вопросы C/C++ 0 08.06.2010 10:49
Прорисока дерева. nusik Общие вопросы Delphi 5 03.06.2009 12:40
Прорисовка дерева yulia Общие вопросы по Java, Java SE, Kotlin 3 02.11.2008 23:19
обход дерева ribka Помощь студентам 2 11.12.2007 20:38