Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];

Вниз

Гибрид 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.05 c
15-1194809006
vasIZmax
2007-11-11 22:23
2007.12.16
О мэйле


15-1194973607
Cerberus
2007-11-13 20:06
2007.12.16
Статья или Исходник про архивацию в формате zip.


2-1195341386
.dn+
2007-11-18 02:16
2007.12.16
Открытие файла


1-1190269966
rtm
2007-09-20 10:32
2007.12.16
Ошибка при сохранении вордовского документа


1-1190610573
ggg
2007-09-24 09:09
2007.12.16
Выделение в ComboBoxEx





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский