Многострочный заголовок в DBGrid
От: AlexEagle Украина http://www.vik.oil
Дата: 27.09.04 15:28
Оценка:
Темя я думаю ясня но на всякий случай:
В ведомости (печатной) имеется колонка Недостача, которая разбивается на две — кол-во и сумма.

Такое есть в 1С. Хотелось бы то же самое сделать на делфе.

Собственно видел TDBGridEh который позволяет это сделать, но он унаследовать от TCustomGrid, а свои наработки по компоненту TDBGrid терять не хотелось бы

Если у кого есть компонент унаследованный от обычного TDBGrid, который позволяет делать сабж поделитесь линком или можно на мыло. Я взамен могу поделиться своими наработками чтобы слить их воедино в дальнейшем
Re: Многострочный заголовок в DBGrid
От: AMogil Россия  
Дата: 27.09.04 15:42
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Темя я думаю ясня но на всякий случай:

AE>В ведомости (печатной) имеется колонка Недостача, которая разбивается на две — кол-во и сумма.

AE>Такое есть в 1С. Хотелось бы то же самое сделать на делфе.


AE>Собственно видел TDBGridEh который позволяет это сделать, но он унаследовать от TCustomGrid, а свои наработки по компоненту TDBGrid терять не хотелось бы


AE>Если у кого есть компонент унаследованный от обычного TDBGrid, который позволяет делать сабж поделитесь линком или можно на мыло. Я взамен могу поделиться своими наработками чтобы слить их воедино в дальнейшем


Простите за вопрос, но какой смысл наследовать от TDBGrid, а не от TCustomGrid?

Алексей.
Re[2]: Многострочный заголовок в DBGrid
От: AlexEagle Украина http://www.vik.oil
Дата: 27.09.04 15:57
Оценка:
Здравствуйте, Алексей, Вы писали:

AM>Простите за вопрос, но какой смысл наследовать от TDBGrid, а не от TCustomGrid?


1. Чтобы была совместимость с моими наработками
2. Чтобы сохранить стандартные методы работы с БД (ну и исключить вероятность чужих ошибок на этом уровне)
Re[3]: Многострочный заголовок в DBGrid
От: AMogil Россия  
Дата: 27.09.04 18:36
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Здравствуйте, Алексей, Вы писали:


AM>>Простите за вопрос, но какой смысл наследовать от TDBGrid, а не от TCustomGrid?


AE>1. Чтобы была совместимость с моими наработками

AE>2. Чтобы сохранить стандартные методы работы с БД (ну и исключить вероятность чужих ошибок на этом уровне)

Я это к тому спросил, что TDBGrid всю свою функциональность наследует от TCustomDBGrid. Он лишь публикует свойства. Зачем вообще наследовать что-то от него?

Алексей.
Re[2]: Многострочный заголовок в DBGrid
От: AMogil Россия  
Дата: 27.09.04 18:39
Оценка:
Здравствуйте, AMogil, Вы писали:

AM>Простите за вопрос, но какой смысл наследовать от TDBGrid, а не от TCustomGrid?


Прошу прощения: опечатка, читать — "но какой смысл наследовать от TDBGrid, а не от TCustomDBGrid?"

Алексей.
Re: Многострочный заголовок в DBGrid
От: svd71 http://visualdesigner.fatal.ru/
Дата: 28.09.04 06:29
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Темя я думаю ясня но на всякий случай:

AE>В ведомости (печатной) имеется колонка Недостача, которая разбивается на две — кол-во и сумма.

AE>Такое есть в 1С. Хотелось бы то же самое сделать на делфе.


AE>Собственно видел TDBGridEh который позволяет это сделать, но он унаследовать от TCustomGrid, а свои наработки по компоненту TDBGrid терять не хотелось бы


AE>Если у кого есть компонент унаследованный от обычного TDBGrid, который позволяет делать сабж поделитесь линком или можно на мыло. Я взамен могу поделиться своими наработками чтобы слить их воедино в дальнейшем


Меня тоже интересовал такой же вопрос и даже немного шире. Я везде, где есть компоненты гридов лазил и скачивал, даже те, которые не свободные. Свстретил только один компонент с некоторым подобием такого интерфейса. Мужик, не мудрствуя лукаво, вел список колонок и располеожение в каждой колонке едитов или любых других контролов.

Сейчас у самого рученки чешутся сделать подобие DBGridEh, но только что бы его сможно было использовать на обеих платформах, но чую рутина загубит и один не справлюсь.
Re[2]: Многострочный заголовок в DBGrid
От: kavlad Россия http://www.wavesoft.ru
Дата: 28.09.04 07:20
Оценка:
Здравствуйте, svd71, Вы писали:

S>Сейчас у самого рученки чешутся сделать подобие DBGridEh, но только что бы его сможно было использовать на обеих платформах, но чую рутина загубит и один не справлюсь.


Это вполне возможно.
... По ушам лупит "начальство" ...
Re: Многострочный заголовок в DBGrid
От: kavlad Россия http://www.wavesoft.ru
Дата: 28.09.04 07:22
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Темя я думаю ясня но на всякий случай:

AE>В ведомости (печатной) имеется колонка Недостача, которая разбивается на две — кол-во и сумма.

Это не совсем многострочный грид, а скорее грид с группировкой колонок.
Многострочным гридом могу поделиться.
... По ушам лупит "начальство" ...
Re[2]: Многострочный заголовок в DBGrid
От: AlexEagle Украина http://www.vik.oil
Дата: 28.09.04 09:00
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Это не совсем многострочный грид, а скорее грид с группировкой колонок.

K>Многострочным гридом могу поделиться.

Ну так мыло в профайле
Re[3]: Многострочный заголовок в DBGrid
От: kavlad Россия http://www.wavesoft.ru
Дата: 28.09.04 09:11
Оценка:
Здравствуйте, 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.
... По ушам лупит "начальство" ...
Re[4]: Многострочный заголовок в DBGrid
От: AlexEagle Украина http://www.vik.oil
Дата: 28.09.04 09:27
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Проще сюда Но это не тот грид, что вы хотите — группировки колонок нет. Хотя можно ее добавить


Спасибо, будем юзать...
Re[4]: Многострочный заголовок в DBGrid
От: AlexEagle Украина http://www.vik.oil
Дата: 28.09.04 09:34
Оценка:
Здравствуйте, kavlad, Вы писали:

А можна к нему ресурс?
Re[5]: Многострочный заголовок в DBGrid
От: kavlad Россия http://www.wavesoft.ru
Дата: 28.09.04 09:37
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Здравствуйте, kavlad, Вы писали:


AE>А можна к нему ресурс?


здесь
... По ушам лупит "начальство" ...
Re[5]: Многострочный заголовок в DBGrid
От: kavlad Россия http://www.wavesoft.ru
Дата: 28.09.04 09:38
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Спасибо, будем юзать...


Кстати, группировку действительно несложно добавить, как-нбудь займусь на досуге
... По ушам лупит "начальство" ...
Re[6]: Многострочный заголовок в DBGrid
От: AlexEagle Украина http://www.vik.oil
Дата: 28.09.04 11:10
Оценка:
Здравствуйте, kavlad, Вы писали:

AE>>А можна к нему ресурс?


K>здесь


The page cannot be found
Re[6]: Многострочный заголовок в DBGrid
От: AlexEagle Украина http://www.vik.oil
Дата: 28.09.04 11:12
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Кстати, группировку действительно несложно добавить, как-нбудь займусь на досуге


Может объяснишь принцип, я если действительно не сложно, попытаюсь реализовать, а то мне горит
Re[6]: Многострочный заголовок в DBGrid
От: AlexEagle Украина http://www.vik.oil
Дата: 28.09.04 11:23
Оценка:
Здравствуйте, kavlad, Вы писали:

Если есть возможность может поговорим в асе? Моя в профайле
Re[7]: Многострочный заголовок в DBGrid
От: kavlad Россия http://www.wavesoft.ru
Дата: 28.09.04 11:24
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>The page cannot be found


в мыле
... По ушам лупит "Мастер — Корябль дураков" ...
Re[7]: Многострочный заголовок в DBGrid
От: kavlad Россия http://www.wavesoft.ru
Дата: 28.09.04 11:25
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Здравствуйте, kavlad, Вы писали:


AE>Если есть возможность может поговорим в асе? Моя в профайле


ок
... По ушам лупит "Мастер — Воля и разум" ...
Re[8]: Многострочный заголовок в DBGrid
От: OMartynenko  
Дата: 29.09.04 03:11
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, AlexEagle, Вы писали:


AE>>Здравствуйте, kavlad, Вы писали:


AE>>Если есть возможность может поговорим в асе? Моя в профайле


K>ок


Может всё-таки идею выскажите "вслух"? Меня это тоже интерисует ... было бы интересно послушать...
Re[9]: Многострочный заголовок в DBGrid
От: kavlad Россия http://www.wavesoft.ru
Дата: 29.09.04 12:46
Оценка:
Здравствуйте, OMartynenko, Вы писали:

OM>Может всё-таки идею выскажите "вслух"? Меня это тоже интерисует ... было бы интересно послушать...


Идея такая:

— добавить к груди коллекцию и в ней хранить колонки-группы
— к каждой колонке группе привязывать колонки-поля (те, что уже есть в стандартном гриде)
— при отрисовке грида в методе DrawCell проверять какой колонке-группе принадлежит колонка-поле (ее индекс передается как параметр в DrawCell)
|
— если колонка-поле первая в колонке-группые, то отрисовывать в заголовке дополнительную кнопку (т.е. колонку группу)
а ниже нее отрисовывать кнопку — заголовок колонки-поля
|
— иначе отрисовывать только кнопку заголовка колонки-поля


Если смотреть мой исходник Re[3]: Многострочный заголовок в DBGrid
Автор: kavlad
Дата: 28.09.04
,
то все необходимое уже есть — надо только добавить коллекцию для колонок-групп, все остальные изменения незничительны.
... По ушам лупит "начальство" ...
Re[9]: Многострочный заголовок в DBGrid
От: AlexEagle Украина http://www.vik.oil
Дата: 29.09.04 13:51
Оценка:
Здравствуйте, OMartynenko, Вы писали:

OM>Может всё-таки идею выскажите "вслух"? Меня это тоже интерисует ... было бы интересно послушать...


У кавлада уже даже реализация есть! моя...
Re[10]: Многострочный заголовок в DBGrid
От: OMartynenko  
Дата: 30.09.04 01:13
Оценка:
Если честно, то не совсем понял 8)
У меня есть желание написать грид, который бы позволял делать объединение ячеек вообще (а не только в заголовке). У меня только пока нет особых идей о том, как хранить информацию об объединённых ячейках.

>От: AlexEagle http://vm.yess.ru/

>Дата: 29.09.04 21:51
>Здравствуйте, OMartynenko, Вы писали:

>У кавлада уже даже реализация есть! моя...

Может покажешь, если уж есть ...
Re[10]: Многострочный заголовок в DBGrid
От: OMartynenko  
Дата: 30.09.04 02:03
Оценка:
Только сейчас заметил .... ты же от TDBGrid наследуешь. Я-то хочу написать аналог TStringGrid (только с объединением ячеек, стилем для всех ячеек, редакторами другими и т.п.). Сейчас решаю от какого класса "скакать". Начал делать от TCustomGrid. Приходится промежуточный классы создавать по типу TCustomDrawGrid и TDrawGrid.
Я вообще не так давно начал на Builder-е писать. Вот решил компонент написать и разобраться заодно во всём.
Re[11]: Многострочный заголовок в DBGrid
От: svd71 http://visualdesigner.fatal.ru/
Дата: 30.09.04 05:43
Оценка:
Здравствуйте, OMartynenko, Вы писали:

OM>Только сейчас заметил .... ты же от TDBGrid наследуешь. Я-то хочу написать аналог TStringGrid (только с объединением ячеек, стилем для всех ячеек, редакторами другими и т.п.). Сейчас решаю от какого класса "скакать". Начал делать от TCustomGrid. Приходится промежуточный классы создавать по типу TCustomDrawGrid и TDrawGrid.

OM>Я вообще не так давно начал на Builder-е писать. Вот решил компонент написать и разобраться заодно во всём.

Лезь на www.delphikingdom.com и найди пример, как делается то, что ты хочешь.

Еще есть компонент, который делает тоже но белее грамотно и красиво. Лужит вроде на www.delphi3000.com но я забыл как он называется и он шароварный. Этот сделан на основе заранее определенной коллекции спецячеек.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.