Темя я думаю ясня но на всякий случай:
В ведомости (печатной) имеется колонка Недостача, которая разбивается на две — кол-во и сумма.
Такое есть в 1С. Хотелось бы то же самое сделать на делфе.
Собственно видел TDBGridEh который позволяет это сделать, но он унаследовать от TCustomGrid, а свои наработки по компоненту TDBGrid терять не хотелось бы
Если у кого есть компонент унаследованный от обычного TDBGrid, который позволяет делать сабж поделитесь линком или можно на мыло. Я взамен могу поделиться своими наработками чтобы слить их воедино в дальнейшем
Здравствуйте, AlexEagle, Вы писали:
AE>Темя я думаю ясня но на всякий случай: AE>В ведомости (печатной) имеется колонка Недостача, которая разбивается на две — кол-во и сумма.
AE>Такое есть в 1С. Хотелось бы то же самое сделать на делфе.
AE>Собственно видел TDBGridEh который позволяет это сделать, но он унаследовать от TCustomGrid, а свои наработки по компоненту TDBGrid терять не хотелось бы
AE>Если у кого есть компонент унаследованный от обычного TDBGrid, который позволяет делать сабж поделитесь линком или можно на мыло. Я взамен могу поделиться своими наработками чтобы слить их воедино в дальнейшем
Простите за вопрос, но какой смысл наследовать от TDBGrid, а не от TCustomGrid?
Здравствуйте, Алексей, Вы писали:
AM>Простите за вопрос, но какой смысл наследовать от TDBGrid, а не от TCustomGrid?
1. Чтобы была совместимость с моими наработками
2. Чтобы сохранить стандартные методы работы с БД (ну и исключить вероятность чужих ошибок на этом уровне)
Здравствуйте, AlexEagle, Вы писали:
AE>Здравствуйте, Алексей, Вы писали:
AM>>Простите за вопрос, но какой смысл наследовать от TDBGrid, а не от TCustomGrid?
AE>1. Чтобы была совместимость с моими наработками AE>2. Чтобы сохранить стандартные методы работы с БД (ну и исключить вероятность чужих ошибок на этом уровне)
Я это к тому спросил, что TDBGrid всю свою функциональность наследует от TCustomDBGrid. Он лишь публикует свойства. Зачем вообще наследовать что-то от него?
Здравствуйте, AlexEagle, Вы писали:
AE>Темя я думаю ясня но на всякий случай: AE>В ведомости (печатной) имеется колонка Недостача, которая разбивается на две — кол-во и сумма.
AE>Такое есть в 1С. Хотелось бы то же самое сделать на делфе.
AE>Собственно видел TDBGridEh который позволяет это сделать, но он унаследовать от TCustomGrid, а свои наработки по компоненту TDBGrid терять не хотелось бы
AE>Если у кого есть компонент унаследованный от обычного TDBGrid, который позволяет делать сабж поделитесь линком или можно на мыло. Я взамен могу поделиться своими наработками чтобы слить их воедино в дальнейшем
Меня тоже интересовал такой же вопрос и даже немного шире. Я везде, где есть компоненты гридов лазил и скачивал, даже те, которые не свободные. Свстретил только один компонент с некоторым подобием такого интерфейса. Мужик, не мудрствуя лукаво, вел список колонок и располеожение в каждой колонке едитов или любых других контролов.
Сейчас у самого рученки чешутся сделать подобие DBGridEh, но только что бы его сможно было использовать на обеих платформах, но чую рутина загубит и один не справлюсь.
Здравствуйте, svd71, Вы писали:
S>Сейчас у самого рученки чешутся сделать подобие DBGridEh, но только что бы его сможно было использовать на обеих платформах, но чую рутина загубит и один не справлюсь.
Здравствуйте, AlexEagle, Вы писали:
AE>Темя я думаю ясня но на всякий случай: AE>В ведомости (печатной) имеется колонка Недостача, которая разбивается на две — кол-во и сумма.
Это не совсем многострочный грид, а скорее грид с группировкой колонок.
Многострочным гридом могу поделиться.
Здравствуйте, AlexEagle, Вы писали:
AE>Ну так мыло в профайле
Проще сюда Но это не тот грид, что вы хотите — группировки колонок нет. Хотя можно ее добавить
P.S. Не хочется кромсать модуль. В этом гриде еще реализована раскраска всякими-разными способами,
в Memo полях рисуется картинка и поддерживается прокрутка колесом мыши.
{*******************************************************}
{ }
{ "PerverCL" }
{ }
{ DataBase Grid }
{ (c) Kalabukhov Alex, 2004 }
{ }
{*******************************************************}unit uDBGrid;
interface
uses
Windows, SysUtils, Classes, Controls, Grids, DBGrids, Graphics, Types, DB,
Math;
type
TGetCellColorsEvent = procedure (Sender: TObject; Field: TField;
var Background, FontColor: TColor; State: TGridDrawState) of object;
TkaDBGrid = class(TDBGrid)
private
FMemoGlyph: TBitmap;
FOnCellColors: TGetCellColorsEvent;
FMultyline: Boolean;
FLineCount: Integer;
procedure SetLineCount(const Value: Integer);
procedure DrawTitleCell(const ARect: TRect; ACol, ARow: Integer;
Column: TColumn; var AState: TGridDrawState);
protected
function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;
procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState); override;
procedure MultylineDrawText(const Rect: TRect; const AText: String);
procedure LayoutChanged; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Multyline: Boolean read FMultyline write FMultyline default False;
property CaptionLineCount: Integer read FLineCount write SetLineCount default 1;
property OnCellColors: TGetCellColorsEvent read FOnCellColors
write FOnCellColors;
property OnMouseWheel;
end;
implementation{$R MyVCLAdd.res}
{ TkaDBGrid }constructor TkaDBGrid.Create(AOwner: TComponent);
begin
inherited;
FMemoGlyph := TBitmap.Create;
FMemoGlyph.LoadFromResourceName(HInstance, 'MEMO_GLYPH');
FMemoGlyph.Transparent := True;
FMemoGlyph.TransparentColor := FMemoGlyph.Canvas.Pixels[0, 0];
FMultyline := False;
FLineCount := 1;
end;
destructor TkaDBGrid.Destroy;
begin
FMemoGlyph.Free;
inherited;
end;
function TkaDBGrid.DoMouseWheelDown(Shift: TShiftState;
MousePos: TPoint): Boolean;
begin
Result := True;
if Assigned(Self.DataSource) and Assigned(Self.DataSource.DataSet) then
Self.DataSource.DataSet.Next;
end;
function TkaDBGrid.DoMouseWheelUp(Shift: TShiftState;
MousePos: TPoint): Boolean;
begin
Result := True;
if Assigned(Self.DataSource) and Assigned(Self.DataSource.DataSet) then
Self.DataSource.DataSet.Prior;
end;
procedure TkaDBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
AState: TGridDrawState);
var
DrawColumn: TColumn;
begin
if (ACol > 0) and (gdFixed in AState) and (dgTitles in Options) and (ARow = 0) then
begin
DrawColumn := Columns[Pred(ACol)];
if DrawColumn = nil then
begin
inherited;
Exit;
end;
if not DrawColumn.Showing then Exit;
Self.DrawTitleCell(ARect, ACol, ARow, DrawColumn, AState);
end
else
inherited;
end;
procedure TkaDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState);
var
OldColor, OldFntColor, BkCol, FontCol: TColor;
CM: TCopyMode;
begin
OldColor := Self.Canvas.Brush.Color;
OldFntColor := Self.Canvas.Font.Color;
CM := Self.Canvas.CopyMode;
BkCol := OldColor;
FontCol := OldFntColor;
if Assigned(FOnCellColors) then
begin
FOnCellColors(Self, Column.Field, BkCol, FontCol, State);
end;
Self.Canvas.Brush.Color := BkCol;
Self.Canvas.Font.Color := FontCol;
Self.Canvas.CopyMode := cmMergeCopy;
if Assigned(Column.Field) then
if (Column.Field.DataType = ftMemo) or (Column.Field.DataType = ftFmtMemo) then
begin
Self.Canvas.FillRect(Rect);
Self.Canvas.Draw(Rect.Left + (Rect.Right - Rect.Left - FMemoGlyph.Width) div 2,
Rect.Top + (Rect.Bottom - Rect.Top - FMemoGlyph.Height) div 2, FMemoGlyph);
end
else
Self.DefaultDrawDataCell(Rect, Column.Field, State);
Self.Canvas.Brush.Color := OldColor;
Self.Canvas.Font.Color := OldFntColor;
Self.Canvas.CopyMode := CM;
if gdSelected in State then
Self.Canvas.DrawFocusRect(Rect);
inherited;
end;
procedure TkaDBGrid.LayoutChanged;
begin
inherited;
if FMultyline then
RowHeights[0] := DefaultRowHeight * FLineCount;
end;
procedure TkaDBGrid.MultylineDrawText(const Rect: TRect; const AText: String);
var
Format: Word;
R: TRect;
begin
if FLineCount = 1 then
Format := DT_SINGLELINE or DT_LEFT
else
Format := DT_LEFT or DT_WORDBREAK;
Canvas.FillRect(Rect);
R := Rect;
Windows.DrawText(Canvas.Handle, PChar(AText), Length(AText), R, Format);
end;
procedure TkaDBGrid.SetLineCount(const Value: Integer);
begin
if FLineCount <> Value then
begin
FLineCount := Value;
LayoutChanged;
end;
end;
procedure TkaDBGrid.DrawTitleCell(const ARect: TRect; ACol, ARow: Integer;
Column: TColumn; var AState: TGridDrawState);
const
ScrollArrows: array [Boolean, Boolean] of Integer =
((DFCS_SCROLLRIGHT, DFCS_SCROLLLEFT), (DFCS_SCROLLLEFT, DFCS_SCROLLRIGHT));
var
MasterCol: TColumn;
TitleRect, TextRect, ButtonRect: TRect;
I: Integer;
InBiDiMode: Boolean;
begin
TitleRect := CalcTitleRect(Column, ARow, MasterCol);
if MasterCol = nil then
begin
Canvas.FillRect(ARect);
Exit;
end;
Canvas.Font := MasterCol.Title.Font;
Canvas.Brush.Color := MasterCol.Title.Color;
if [dgRowLines, dgColLines] * Options = [dgRowLines, dgColLines] then
InflateRect(TitleRect, -1, -1);
TextRect := TitleRect;
I := GetSystemMetrics(SM_CXHSCROLL);
if ((TextRect.Right - TextRect.Left) > I) and MasterCol.Expandable then
begin
Dec(TextRect.Right, I);
ButtonRect := TitleRect;
ButtonRect.Left := TextRect.Right;
I := SaveDC(Canvas.Handle);
try
Canvas.FillRect(ButtonRect);
InflateRect(ButtonRect, -1, -1);
IntersectClipRect(Canvas.Handle, ButtonRect.Left,
ButtonRect.Top, ButtonRect.Right, ButtonRect.Bottom);
InflateRect(ButtonRect, 1, 1);
InBiDiMode := Canvas.CanvasOrientation = coRightToLeft;
if InBiDiMode then
Inc(ButtonRect.Right, GetSystemMetrics(SM_CXHSCROLL) + 4);
DrawFrameControl(Canvas.Handle, ButtonRect, DFC_SCROLL,
ScrollArrows[InBiDiMode, MasterCol.Expanded] or DFCS_FLAT);
finally
RestoreDC(Canvas.Handle, I);
end;
end;
with MasterCol.Title do
MultylineDrawText(TextRect, Caption);
if [dgRowLines, dgColLines] * Options = [dgRowLines, dgColLines] then
begin
InflateRect(TitleRect, 1, 1);
DrawEdge(Canvas.Handle, TitleRect, BDR_RAISEDINNER, BF_BOTTOMRIGHT);
DrawEdge(Canvas.Handle, TitleRect, BDR_RAISEDINNER, BF_TOPLEFT);
end;
AState := AState - [gdFixed];
end;
end.
Здравствуйте, kavlad, Вы писали:
K>Здравствуйте, AlexEagle, Вы писали:
AE>>Здравствуйте, kavlad, Вы писали:
AE>>Если есть возможность может поговорим в асе? Моя в профайле
K>ок
Может всё-таки идею выскажите "вслух"? Меня это тоже интерисует ... было бы интересно послушать...
Здравствуйте, OMartynenko, Вы писали:
OM>Может всё-таки идею выскажите "вслух"? Меня это тоже интерисует ... было бы интересно послушать...
Идея такая:
— добавить к груди коллекцию и в ней хранить колонки-группы
— к каждой колонке группе привязывать колонки-поля (те, что уже есть в стандартном гриде)
— при отрисовке грида в методе DrawCell проверять какой колонке-группе принадлежит колонка-поле (ее индекс передается как параметр в DrawCell)
|
— если колонка-поле первая в колонке-группые, то отрисовывать в заголовке дополнительную кнопку (т.е. колонку группу)
а ниже нее отрисовывать кнопку — заголовок колонки-поля
|
— иначе отрисовывать только кнопку заголовка колонки-поля
Если честно, то не совсем понял 8)
У меня есть желание написать грид, который бы позволял делать объединение ячеек вообще (а не только в заголовке). У меня только пока нет особых идей о том, как хранить информацию об объединённых ячейках.
>От: AlexEagle http://vm.yess.ru/ >Дата: 29.09.04 21:51 >Здравствуйте, OMartynenko, Вы писали:
>У кавлада уже даже реализация есть! моя...
Может покажешь, если уж есть ...
Только сейчас заметил .... ты же от TDBGrid наследуешь. Я-то хочу написать аналог TStringGrid (только с объединением ячеек, стилем для всех ячеек, редакторами другими и т.п.). Сейчас решаю от какого класса "скакать". Начал делать от TCustomGrid. Приходится промежуточный классы создавать по типу TCustomDrawGrid и TDrawGrid.
Я вообще не так давно начал на Builder-е писать. Вот решил компонент написать и разобраться заодно во всём.
Здравствуйте, OMartynenko, Вы писали:
OM>Только сейчас заметил .... ты же от TDBGrid наследуешь. Я-то хочу написать аналог TStringGrid (только с объединением ячеек, стилем для всех ячеек, редакторами другими и т.п.). Сейчас решаю от какого класса "скакать". Начал делать от TCustomGrid. Приходится промежуточный классы создавать по типу TCustomDrawGrid и TDrawGrid. OM>Я вообще не так давно начал на Builder-е писать. Вот решил компонент написать и разобраться заодно во всём.
Еще есть компонент, который делает тоже но белее грамотно и красиво. Лужит вроде на www.delphi3000.com но я забыл как он называется и он шароварный. Этот сделан на основе заранее определенной коллекции спецячеек.