Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.16;
Скачать: CL | DM;

Вниз

Гибрид DBGrid и TreeView   Найти похожие ветки 

 
Девушка ©   (2007-11-12 16:07) [0]

Добрый день!
Не видал ли кто на свете такой странный компонент...

Попробую привести пример использования  - есть некие товары, которые делятся на категроии.
Категории - можно представить папками-узлами TreeView.
Листовой узел должен содержать таблицу товаров - 2-3 поля.


 
DimaBr ©   (2007-11-12 16:28) [1]

cxGrid


 
kaif ©   (2007-11-12 16:35) [2]

Существуют такие компоненты. Я лично использовал такие от Dream Controls, они, вдобавок еще и быстрые.
Кстати, для начала можно усовершенствовать обычный TreeView - у него есть событие рисования, я вначале так и поступил, выводя цифры просто в канву в нужном месте.


 
PEAKTOP ©   (2007-11-12 16:39) [3]

DBGridEh Димы Большакова. http://ehlib.com/


 
atruhin ©   (2007-11-12 17:55) [4]

Virtual TreeView позволяет отобразить что угодно, и как угодно. Правда для начала использования
придется, пару деньков поразбираться - плата за универсальность.


 
Вовчик   (2007-11-12 18:19) [5]

cxTreeList / cxDBTreeList


 
Девушка ©   (2007-11-13 10:43) [6]


> DimaBr ©   (12.11.07 16:28) [1]
> cxGrid


убилась - но не нашла как там можно это сделать.... сразу оговорюсь - группировка по столбцам не подходит


 
Игорь Шевченко ©   (2007-11-13 11:18) [7]


> Добрый день!
> Не видал ли кто на свете такой странный компонент...
>
> Попробую привести пример использования  - есть некие товары,
>  которые делятся на категроии.
> Категории - можно представить папками-узлами TreeView.
> Листовой узел должен содержать таблицу товаров - 2-3 поля.
>


А собстна, кто мешает сделать по образу и подобию проводника ? Все компоненты стандартные...Пример оформления есть в Demos\ResXplor, к базе данных подкрутить - пара пустяков


 
Девушка ©   (2007-11-13 12:59) [8]


> А собстна, кто мешает сделать по образу и подобию проводника


какраз таки это сделано..
но в проводнике мы не сможем посмотреть содержимое одновременно двух и более папок - а вот если в дереве листами будут таблицы - то сможем.


 
Andrey ©   (2007-11-13 17:57) [9]

VirtualStringTree
Но там руцями ноды добавлять нада поштучно.
Без спец. средств надоедает иногда.


 
Игорь Шевченко ©   (2007-11-14 10:05) [10]


> какраз таки это сделано..
> но в проводнике мы не сможем посмотреть содержимое одновременно
> двух и более папок - а вот если в дереве листами будут таблицы
> - то сможем.


Все понял. Надо, чтобы при раскрытии узла отображалось некое отличное от самих узлов содержимое.

Я такое делал руками со стандартным TreeView, примерно так:

procedure TfFoo.BuildTree;
var
 I, J: Integer;
 Node, ChildNode: TTreeNode;
 ItemEx: TTVITEMEX;
begin
 TreeView.Items.Clear;
 for I := 0 to dmMemberEx.MemberTree.Count - 1 do
 begin
   Node := TreeView.Items.AddObject(nil, dmMemberEx.MemberTree[I].DisplayText, dmMemberEx.MemberTree[I]);
   for J := 0 to dmMemberEx.MemberTree[I].Details.Count - 1 do
   begin
     ChildNode := TreeView.Items.AddChildObject(Node,
       dmMemberEx.MemberTree[I].Details[J].DisplayText,
       dmMemberEx.MemberTree[I].Details[J]);
     ItemEx.mask := TVIF_INTEGRAL;
     ItemEx.hItem := ChildNode.ItemId;
//Здесь количество строк в отображаемом листе:
     ItemEx.iIntegral :=
       dmMemberEx.MemberTree[I].Details[J].Info.DisplayLinesCount + 2;
     SendMessage (TreeView.Handle, TVM_SETITEMA, 0, LPARAM(@ItemEx));
   end;
 end;
end;

И, соответственно, рисование:

procedure TfFoo.TreeViewCustomDrawItem(Sender: TCustomTreeView;
 Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
const
 LineHeight = 16;
 NodeStateWidth = 9;
var
 Rect: TRect;
 Detail: TMyDetails;
 SelColor: TColor;
 HotColor: TColor;
 NormalColor: TColor;
 SelHotColor: TColor;
 DrawRect: TRect;
 AText: string;
 OldBrushColor: TColor;
 I: Integer;
 FirstChild: Boolean;
 Icon: TIcon;
 Header: TMyHeader;
 X, Y: Integer;
begin
 SelColor := Options.HighlightColor;
 HotColor := TColor($FCE4CB);
 NormalColor := clWhite;
 SelHotColor := TColor($FEF2E3);
 Rect := Node.DisplayRect(false);
 Rect.Left := 0;
 Rect.Right := Sender.BoundsRect.Right;
 with Sender.Canvas do
 begin
   Font.Color := clBlack;
   if cdsHot in State then
     if cdsSelected in State then
       Brush.Color := SelHotColor
     else
       Brush.Color := HotColor
   else
     if cdsSelected in State then
       Brush.Color := SelColor
     else
       Brush.Color := NormalColor;
   FillRect(Rect);
 end;
 if TObject(Node.Data) is TMyDetails then
 begin
   //Рисование листового узла
   Detail := TMyDetails(Node.Data);
   DrawRect := Rect;
   Dec(DrawRect.Left,1);
   FirstChild := Detail.Parent.Details.IndexOf(Detail) = 0;
   if FirstChild then
   begin
     OldBrushColor := Canvas.Brush.Color;
     Sender.Canvas.Brush.Color := TColor($E4B088);
     Sender.Canvas.FrameRect(DrawRect);
     Canvas.Brush.Color := OldBrushColor;
   end
   else
   begin
     Sender.Canvas.Pen.Color := TColor($E4B088);
     Sender.Canvas.Polyline([Point(Rect.Left-1, Rect.Top),
       Point(Rect.Left-1, Rect.Bottom-1), Point(Rect.Right-1, Rect.Bottom-1),
       Point(Rect.Right-1, Rect.Top-1)]);
   end;
   DrawRect.Left := 50;
   DrawRect.Top := DrawRect.Top + LineHeight div 2;
   DrawRect.Bottom := DrawRect.Top + LineHeight;
   //Далее собственно рисование объекта, что неинтересно
   [...Посгрызено мышами...]
   DefaultDraw := false;
 end
 else if TObject(Node.Data) is TMyHeader then
 begin
   //Рисование корневого узла (который с крестиком...)
   //Draw node state
   X := Rect.Left + 5;
   Y := Rect.Top + 3;
   Sender.Canvas.Pen.Color := clBtnShadow;
   OldBrushColor := Sender.Canvas.Brush.Color;
   Sender.Canvas.Brush.Color := clWindow;
   Sender.Canvas.FillRect(Classes.Rect(X, Y, X + NodeStateWidth, Y + NodeStateWidth));
   Sender.Canvas.Rectangle(X, Y, X + NodeStateWidth, Y + NodeStateWidth);
   Sender.Canvas.Brush.Color := OldBrushColor;
   Sender.Canvas.Pen.Color := clWindowText;
   Sender.Canvas.MoveTo(X + 2, Y + NodeStateWidth div 2);
   Sender.Canvas.LineTo(X + NodeStateWidth - 2, Y + NodeStateWidth div 2);
   if not Node.Expanded then
   begin
     Sender.Canvas.MoveTo(X + NodeStateWidth div 2, Y + 2);
     Sender.Canvas.LineTo(X + NodeStateWidth div 2, Y + NodeStateWidth - 2);
   end;
   Inc(Rect.Left, 20);
   Header := TMyHeader(Node.Data);
   Icon := TIcon.Create;
   try
     if SomeCondition then
       BulletImages.GetIcon(3,Icon)
     else
       BulletImages.GetIcon(Ord(Header.StatusMix),Icon);
     Sender.Canvas.Draw(Rect.Left, Rect.Top, Icon);
   finally
     Icon.Free;
   end;
   AText := Node.Text;
   Inc(Rect.Left, 16);
   DrawText(Sender.Canvas.Handle, PChar(AText), -1, Rect, DT_LEFT or
     DT_SINGLELINE or DT_VCENTER);
   DefaultDraw := false;
 end
 else
   DefaultDraw := true;
end;

Выложил бы Скриншот, да некуда



Страницы: 1 вся ветка

Текущий архив: 2007.12.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
3-1186648790
alsov
2007-08-09 12:39
2007.12.16
Оптимизация запроса


2-1195635334
FaTRuS
2007-11-21 11:55
2007.12.16
Поиск по всей базе данных


2-1195744747
Новенький
2007-11-22 18:19
2007.12.16
Библиотека со звуком....


6-1170840072
tytus
2007-02-07 12:21
2007.12.16
IHTMLWindow2 как выполнить скрипт!!???


2-1195744591
Fraider
2007-11-22 18:16
2007.12.16
Минимальный размер окна