Форум: "Компоненты";
Текущий архив: 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