Форум: "Прочее";
Текущий архив: 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