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

Вниз

Компонент 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.129 c
14-1126712249
Igor_thief
2005-09-14 19:37
2005.10.09
MSDN


4-1123759691
BFG9k
2005-08-11 15:28
2005.10.09
Окно с прозрачной областью


4-1123418703
psa247
2005-08-07 16:45
2005.10.09
ProcessID -> Путь Filename.exe


14-1126728661
syte_ser78
2005-09-15 00:11
2005.10.09
Стоит ли апгрейдится?


1-1127207851
Курдль
2005-09-20 13:17
2005.10.09
Как наиболее изящно отловить WM_MOUSEWHEEL?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский