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

Вниз

Компонент TStringGrid   Найти похожие ветки 

 
main   (2004-12-07 16:46) [0]

Пишу компонент - потомок TStringGrid. Цель - в заголовках строк и столбцов поместить компоненты TCheckBox и связать с их состоянием переменные статус строки и статус столбца
Вот текст

// -------------------------------- Это основной модуль компонента ------------------------------
// Изменения:
// - прорисовываем в заголовках строк и столбцов компоненты TNewCheckBox
//Проблема:
// - при клике мышкой по NewCheckBox галочка не появляется
// - что делать, если пользователь изменил число строк или столбцов???

unit CheckStringGrid;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Grids,newcheckbox;

type
 TCheckStringGrid = class(TStringGrid)
 private
 ArrcheckRow,ArrCheckCol:array[1..100] of tNewCheckBox;
   { Private declarations }
 protected
   { Protected declarations }
   procedure drawcell(acol,arow:longint;rect:trect;state:tgriddrawstate);override;
 public
   { Public declarations }
   constructor create(aowner:tcomponent);override;
   destructor destroy;override;
 published
   { Published declarations }
 end;

procedure Register;

implementation

constructor tcheckstringgrid.create(aowner:tcomponent);
// Перекрываем, чтобы создать массив компонентов NewCheckBox по количеству
// строк и столбцов

var
i:integer;
mycheckbox:tnewcheckbox;
begin
inherited create(aowner);

// выводим заголовки строк и столбцов для проверки
for i:=1 to colcount-1 do
cells[i,0]:=inttostr(I);

for i:=1 to rowcount-1 do
cells[0,i]:=inttostr(I*2);

// создаем массив для столбцов
for i:=1 to colcount-1 do
 begin
 mycheckbox:=tnewcheckbox.Create(self);
 mycheckbox.parent:=self;
 mycheckbox.typecheck:=false;
 arrcheckcol[i]:=mycheckbox;
 mycheckbox.visible:=false;
 end;

// создаем массив для строк
for i:=1 to rowcount-1 do
 begin
 mycheckbox:=tnewcheckbox.Create(self);
 mycheckbox.parent:=self;
 mycheckbox.typecheck:=true;
 arrcheckrow[i]:=mycheckbox;
 mycheckbox.visible:=false;
 end;
end;

destructor tcheckstringgrid.destroy;
// перекрываем, чтобы уничтожить созданные компоненты
var
i:integer;
begin

for i:=1 to colcount-1 do
 arrcheckcol[i].free;

for i:=1 to rowcount-1 do
 arrcheckrow[i].free;
inherited;

end;

procedure tcheckstringgrid.drawcell(acol,arow:longint;rect:trect;state:tgriddrawstate);
// перекрываем, чтобы прорисовать наши компоненты
// при прорисовке не появляется галочка в CheckBox - е
var
 r:trect;
begin
 inherited drawcell(acol,arow,rect,state);
 if (acol = 0) and (arow > 0)then
 begin
 r:=cellrect(acol,arow);
 r.left:=r.left+left+2;
 r.right:=r.right+left-2;
 r.top:=r.top+top+2;
 r.bottom:=r.bottom+top-2;
 arrcheckrow[arow].boundsrect:=r;
 arrcheckrow[arow].Caption:=cells[acol,arow];
 arrcheckrow[arow].visible:=true;
 end;

 if (arow = 0) and (acol>0) then
 begin
 r:=cellrect(acol,arow);
 r.left:=r.left+left+2;
 r.right:=r.right+left-2;
 r.top:=r.top+top+2;
 r.bottom:=r.bottom+top-2;
 arrcheckcol[acol].BoundsRect:=r;
 arrcheckcol[acol].Caption:=cells[acol,arow];
 arrcheckcol[acol].visible:=true;
 end;

End;

procedure Register;
begin
 RegisterComponents("Marina", [TCheckStringGrid]);
end;

end.

//---------------------------------- Это вспомогательный компонент -----------------------------------
// Изменения:
// - добавляем свойство TypeCheck типа Boolean

unit newCheckBox;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TnewCheckBox = class(TCheckBox)
 private
   { Private declarations }
 ftypecheck:boolean;
 protected
   { Protected declarations }
 public
   { Public declarations }
   constructor create(aowner:tcomponent);override;
   procedure Click;override;
 published
   { Published declarations }
   property typecheck:boolean read ftypecheck write ftypecheck;
 end;

implementation

constructor tnewcheckbox.create(aowner:tcomponent);
begin
inherited create(aowner);
 Width := 17;
 Height := 17;
 caption:="";;
 ControlStyle := [csSetCaption, csDoubleClicks];
 Alignment := taleftJustify;
end;

procedure TnewCheckBox.Click;
begin
 inherited Changed;
 inherited Click;
end;

end.

Проблема возникла следующая:
пытаюсь нажать на любой CheckBox, но галочка в нем не появляется. Как лечить? И еще:
как добавить или удалить CheckBox, если пользователь изменяет число строк или столбцов?
Пишите...


 
MBo ©   (2004-12-07 19:40) [1]

грид не передает команды своим "деткам", кроме InplaceEditor,
поэтому в наследнике нужно перекрыть

Procedure WMCommand( var msg: TWMCommand ); message WM_COMMAND;

и в реализации этого метода написать:

 if EditorMode and (msg.Ctl = InplaceEditor.Handle) then
   inherited
 else
   If msg.Ctl <> 0 then
     msg.result := SendMessage( msg.ctl, CN_COMMAND, TMessage(msg).wparam, TMessage(msg).lparam );

насчет изменения количества чебоксов - не статический массив использовать, а динамический или список, изменяя его при модификации количества столбцов (перекрыть SetColCount или какой там метод используется)


 
main   (2004-12-08 10:24) [2]

Вот какие проблемы возникли:-при скроллинге таблицы в неумещающемся полностью заголовке столбца появляется 2 CheckBox-а вместо одного
-при прорисовке заголовков столбцов появляется какая-то штука вслед за текстом, похожая на вертикальную черту. Пробовала прорисовать заголовок сама (TextRect) но вместо этого получала абсолютно белую таблицу без ячеек вообще. Как лечить?

И еще вопрос: Как сделать многострочной надпись CheckBox-а или заголовок столбца с учетом размещения в нем CheckBox - а?


 
main   (2004-12-08 11:45) [3]

Еще проблема:
Пытаюсь перекрыть метод SetColCount, но программа выдает ошибку: такой метод не существует в базовом классе. Как поступить? Пробовала использовать предка - TcustomGrid, но там нет свойства Cells...


 
main   (2004-12-08 11:48) [4]

И еще вопрос: как работать с компонентами TcheckBox, используя список(создание, прорисовка, удаление)?
Помогите, пожалуйста!!!


 
MBo ©   (2004-12-08 12:35) [5]

У, как много вопросов.
Раз такие большие проблемы, может попробовать такой путь - не настоящие чекбоксы использовать, а просто рисовать (в DrawCell) соответствующие картиночки (см. справку WinSDK по DrawFrameControl), отслеживать нажатие на них и менять состояние (DFCS_CHECKED)


 
wisekaa ©   (2004-12-08 16:55) [6]


> MBo ©   (08.12.04 12:35)

Так мы и резовали, посчитали что пихать полностью объект чекбокс расточительно.

Есть списки, со свойствами ячейки, в которой храниться информация, есть ли в ней чекбокс или нет, какое его состояние и т.д..
На отрисовке ячейки рисуеться соотвествующая картинка,
обработка повешана на мышь и клаву, чтобы чеки пробелом ставить можно было.
Добавлено свойство CheckCount, которое отражает колличество выбранных строк.

Ну и т.д.
Пример реализации многострочных строк можно найти на этом сайте в Фак или на Королевстве Дельфи


 
main   (2004-12-09 10:37) [7]

Люди!!!
Объясните, как мне реализовать в компоненте следующую вещь:
Есть некий компонент(назовем его класс Theader),есть еще один компонент, который должен хранить список компонентов Theadrer (назовем Theaders)и есть мой компонент tstringgrid, который имеет свойство типа THeaders. Задача в том, что нужно каждый компонент из списка THeaders привязать к столбцу таблицы
Вопрос: покажите на примере, как это все реализовать, как с этим работать?


 
Юрий Зотов ©   (2004-12-09 13:47) [8]

> main   (09.12.04 10:37) [7]

> Есть некий компонент(назовем его класс Theader),

Не компонент, а элемент коллекции (потомок TCollectionItem)

> есть еще один компонент, который должен хранить список
> компонентов Theadrer (назовем Theaders)

И это тоже не компонент, а коллекция (потомок TOwnedCollection)

> и есть мой компонент tstringgrid, который имеет свойство типа
> THeaders.

А вот это уже и правда компонент. Владелец коллекции.

> Вопрос: покажите на примере, как это все реализовать, как с
> этим работать?

См. исходники TDBGrid, TDBGridColumns и TColumn. Нужно сделать аналогично, только без привязки к БД.


 
wisekaa ©   (2004-12-09 18:33) [9]

Вот была проба пера в свре время (до ума пока не довел):

 TMyGridColumn =  class(TCollectionItem)
 private
   FColNumber: Integer;
   FColType: TColType;
   procedure SetColNumber(const Value: Integer);
   procedure SetReadOnly(const Value: Boolean);
   procedure SetColor(const Value: TColor);
   procedure SetColType(const Value: TColType);
   procedure SetWidth(const Value: Integer);
   procedure SetVisible(const Value: Boolean);
   function GetColor: TColor;
   function GetVisible: Boolean;
   function GetWidth: Integer;
   function GetReadOnly: Boolean;
 protected
   procedure ResetValue;
 public
  constructor Create(Collection: TCollection); override;
  destructor Destroy; override;
  procedure Assign(Source: TPersistent); override;
 published
  property ColNumber: Integer read FColNumber write SetColNumber;
  property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  property Color: TColor read GetColor write SetColor;
  property ColType: TColType read FColType write SetColType;
  property Width: Integer read GetWidth write SetWidth;
  property Visible: Boolean read GetVisible write SetVisible default True;
 end;

 TSFmtGridColumns = class(TCollection)
 private
   FGrid: TMyGrid;
   function GetColumn(Index: Integer): TMyGridColumn;
   procedure SetColumn(Index: Integer; Value: TMyGridColumn);
 protected
   function GetOwner: TPersistent; override;
   procedure Update(Item: TCollectionItem); override;
 public
   constructor Create(Grid: TMyGrid; ColumnClass: TColumnClass);
   function  Add: TMyGridColumn;
   procedure LoadFromFile(const Filename: string);
   procedure LoadFromStream(S: TStream);
   procedure RestoreDefaults;
   procedure RebuildColumns;
   procedure SaveToFile(const Filename: string);
   procedure SaveToStream(S: TStream);
   property Grid: TMyGrid read FGrid;
   property Items[Index: Integer]: TMyGridColumn read GetColumn write SetColumn; default;
 end;

 TMyGrid = class(TStringGrid)
 private
   FColumns: TMyGridColumns;
   procedure SetColumns(const Value: TMyGridColumns);
 published
   property MyColumns: TMyGridColumns read FColumns write SetColumns;
 end;



Данная конструкция планировалась для использования настроет определенных колонок в гриде во время дизайна.


 
main   (2004-12-10 07:58) [10]

Скажите, как в Stringgrid узнать о любых изменениях в ней(изменение количества строк, столбцов, содержимого ячеек, изменение размеров грида и т.п.). Пробовала перекрыть метод UPDATE - ничего не вышло. Пробовала перекрыть метод SetColCount - ругается, что этого метода нет в базовом классе. Помогите, пожалуйста...
Дело в том, что я только начала создавать собственные компоненты и многого не знаю...



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

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

Наверх




Память: 0.51 MB
Время: 0.03 c
2-1125430875
Дмитрий_05
2005-08-30 23:41
2005.10.09
Проблемы с функцией AnimateWindow


9-1110992003
[wl]
2005-03-16 19:53
2005.10.09
Кто нить пишет игрушки для мобильников?


3-1124719894
M@rlin
2005-08-22 18:11
2005.10.09
Не выполняется процедура SQL из Delphi


14-1126763262
nk
2005-09-15 09:47
2005.10.09
Домен и Win XP


2-1125735542
Ксардас
2005-09-03 12:19
2005.10.09
Как выделить строку в РичЭдите при опр условиях?