Criaçao de componente (ComponentEditor)

Delphi

28/03/2005

Ola,
Estou tentando criar um componente que é derivado do TStringGrid.
Quase todas as funcoes do componente utiliza o record TStringGridColItens de variaveis que padroniza cada coluna do meu grid. O problema é que toda vez q vou utilizar o componete na aplicacao necessito passar todas as configuracoes por codigo no create do formulario. Como faco para o componente funcionar como os fields de uma tabela, onde dando o duplo click ele me abra uma janela para configurar cada coluna do grid??? Abri alguns componentes que tenho aqui pra ver se conseguia achar alguma coisa e reparei neste ComponentEditor.. Seria isso???
Abraços,
Gustavo

segue codigo do componte:

unit StringGridAcesso;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids,Mask;
const MaxCol = 9999;
MaxRow = 9999;
type
TCellsType = (ctNone, ctInteger, ctNumeric, ctDate, ctString, ctBoolean);
TStringGridColItens = record
ColTitle : String;
ColType : TCellsType;
nrDecimal : integer;
MaxLen : Integer;
MaskEdit : String;
CanSelect : Boolean;
isRequered : Boolean;
end;
TStringGridColDetail = array [0..MaxCol] of TStringGridColItens;
TValidaCellEvent = function (Sender : TObject; aCol, aRow: Longint; var CanValidate : Boolean): Boolean of object;
TCellExitEvent = function (Sender : TObject; aCol, aRow: Longint; var CanExit : Boolean): Boolean of object;

TStateRow = (srUpdated, srInserted, srNone, srReaded);
TChangeStateEvent = procedure (Sender : TObject; aRow: Longint; State: TStateRow) of object;

TStringGridAcesso = class(TStringGrid)
private
{ Private declarations }
FBtBloqRow : Boolean;
FOnValidaCell : TValidaCellEvent;
FOnExitCell : TCellExitEvent;
FOnStateChange : TChangeStateEvent;
function ValidaCell(ACol, ARow:Integer) : boolean; virtual;
function RowIsNull(nrRow:Integer):Boolean;
Function UMaskEdit (EditMask:String):String;
procedure DelRow(var delRow:Integer);
function ValidaRow(aRow:Integer; var aColErr: integer) : boolean;

protected
{ Protected declarations }
procedure KeyPress(var Key: Char); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure DoEnter; override;
procedure DoExit; override;
procedure DblClick; override;
function GetEditMask(ACol, aRow: Longint): string; override;
function SelectCell(ACol, aRow: Longint): Boolean; override;
procedure DoChangeState(State : TStateRow; aRow: LongInt); virtual;

public
{ Public declarations }
ColDetails: TStringGridColDetail;
LastCol,LastRow : Integer;
constructor Create (AOwner : TComponent); Override;
destructor Destroy; override;
procedure ClearRows;

published
{ Published declarations }
property OnValidaCell : TValidaCellEvent read FOnValidaCell write FOnValidaCell;
property OnExitCell : TCellExitEvent read FOnExitCell write FOnExitCell;
property OnStateChange : TChangeStateEvent read FOnStateChange write FOnStateChange;
end;

procedure Register;

implementation

{# REGISTRO DO COMPONENTE }
procedure Register;
begin
RegisterComponents(´Novos´, [TStringGridAcesso]);
end;

{ FUNCOES PRIVADAS }
function TStringGridAcesso.ValidaCell(aCol,ARow:Integer) : boolean;
{Funcoes Locais}
function VData(Dado : string) : boolean;
Var Data: TDate;
Begin
Try
Data:= StrToDate(Dado);
Result := True;
Except
Result:= False;
End;
En...


Gustavo M

Gustavo M

Curtidas 0

Respostas

Marcelo Saviski

Marcelo Saviski

28/03/2005

Dê uma olhada [url=http://www.clubedelphi.net/artigos/Criacao_Componentes2.asp]nesse Artigo[/url]


GOSTEI 0
Michael

Michael

28/03/2005

Olá Marcelo!

Eu já estava me preparando para indicar o link, quando ví que vc já o tinha feito. ;-)

[]´s


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

28/03/2005

Eu já estava me preparando para indicar o link, quando ví que vc já o tinha feito. ;-)


O pior é que não tem um link direto pra lá, tive que ficar virando o site até achar ele


GOSTEI 0
Michael

Michael

28/03/2005

[quote:5dc26fdc06=´Marcelo Saviski´]O pior é que não tem um link direto pra lá, tive que ficar virando o site até achar ele[/quote:5dc26fdc06]

Pois é. O pessoal do ClubeDelphi podia ter deixado fixo os artigos do Uploader Master. :-(

[]´s


GOSTEI 0
Gustavo M

Gustavo M

28/03/2005

Valeu Michael e Marcelo pela dica do artigo.. Já li e consegui um grande avanço, mas estou encalhado em outro problema... que vou tentar descrever...
Depois que li o artigo, consegui criar um Editor de Propriedade para meu tipo de dado TDetailCol do tipo TCollection para armazenar minhas várias configuracoes de colunas do grid. O problema e o seguinte: estou conseguindo acessar minha classe TDetailCold (segue codigo abaixo) normalmente por código. Coloco o nome da variavel.index[ncol].parametro e acessa normalmente. Mas eu queria fazer isso da mesma for que se adiciona um item em um listView. Em modo de desenvolvimento, quando eu der duplo clique na propriedade das colunas, seja aberto um novo formulario e que neste formulario, na medida que eu altere a coluna (item) seja mostrado no object inspector as propriedades somente daquela coluna (item)!.
Bom, so complementando, mexendo nos fontes do delphi, descobri de existe um diretorio ($(DELPHI)\Source\Property Editors) que contem os editores de propriedades padrao do delphi. Analizando as units, descobri que existe uma unit (colnedit.pas) que tem o formulario que é chamando na edicao do listView. Bom, como tinha xeretado ateh ae... resolvi ´tentar utilizar´ a unit do delphi, chamando-a a partir da unit do componente que estou desenvolvimento. Bumm, outro problema..... a unit colnedit.pas utiliza uma unit chamada ToolWnds, que naum encontrei em nenhum lugar da minha maquina. Q unit é essa???? A unit tambem utiliza a classe TToolbarDesignWindow que provavelmente esta nesta unit ToolWnds. Alguem jah viu isso??? Tem alguma
Valew galera.. desculpe o ´livro´ que tive q escrever pra explicar.. e espero ter alguma salvação!!
Abraços

Gustavo


GOSTEI 0
Gustavo M

Gustavo M

28/03/2005

solucao?!?!
GOSTEI 0
Gustavo M

Gustavo M

28/03/2005

Saudacoes...
Esqueci do codigo... ae vai:
Abracos

unit StringGridAcesso;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids,Mask, DsgnIntf, ColnEdit;

const MaxCol = 9999;
MaxRow = 9999;
var Index : integer;
type
{ TColumnsDetailProperty }
TColumnsDetailProperty = class(TClassProperty)
private
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
end;

{Estado de atualizacao}
TStateRow = (srUpdated, srInserted, srNone, srReaded);

{Tipo de Eventos}
TValidaCellEvent = function (Sender : TObject; aCol, aRow: Longint; var CanValidate : Boolean): Boolean of object;
TCellExitEvent = function (Sender : TObject; aCol, aRow: Longint; var CanExit : Boolean): Boolean of object;
TChangeStateEvent = procedure (Sender : TObject; aRow: Longint; State: TStateRow) of object;

{Tipo de variavel das coluna}
TCellsType = (ctNone, ctInteger, ctNumeric, ctDate, ctString, ctBoolean);

{Classe de cada coluna}
TDetailCol = class(TCollectionItem)
private
FColTitle : String;
FColType : TCellsType;
FDecimal : integer;
FMaxLen : Integer;
FMaskEdit : String;
FCanSelect : Boolean;
FisRequered : Boolean;
procedure SetCanSelect(const Value: Boolean);
procedure SetColTitle(const Value: String);
procedure SetColType(const Value: TCellsType);
procedure SetDecimal(const Value: integer);
procedure SetisRequered(const Value: Boolean);
procedure SetMaskEdit(const Value: String);
procedure SetMaxLen(const Value: integer);
public
constructor Create(Collection: TCollection); override;
procedure Assign(Source: TPersistent); override;
published
property ColTitle: String read FColTitle write SetColTitle;
property ColType: TCellsType read FColType write SetColType default ctNone;
property Decimal: integer read FDecimal write SetDecimal default 0;
property MaxLen: integer read FMaxLen write SetMaxLen default 0;
property MaskEdit: String read FMaskEdit write SetMaskEdit;
property CanSelect: Boolean read FCanSelect write SetCanSelect default True;
property isRequered: Boolean read FisRequered write SetisRequered default False;
end;

TStringGridAcesso = class;

TDetailCols = class(TCollection)
private
FStringAcesso: TStringGridAcesso;
function GetItem(Index: Integer): TDetailCol;
procedure SetItem(Index: Integer; Value: TDetailCol);
protected
function GetOwner: TPersistent; override;
procedure Update(Item: TCollectionItem); override;
public
constructor Create(StringAcesso: TStringGridAcesso);
function Add: TDetailCol;
property Items[Index: Integer]: TDetailCol read GetItem write SetItem; default;
end;

{Classe Geral}
TStringGridAcesso = class(TStringGrid)
private
{ Private declarations }
FDetailCols : TDetailCols;
FBtBloqRow : Boolean;
FOnValidaCell : TValidaCellEvent;
FOnExitCell : TCellExitEvent;
FOnStateChange : TChangeStateEvent;
function ValidaCell(ACol, ARow:Integer) : boolean; virtual;
function RowIsNull(nrRow:Integer):Boolean;
Function UMaskEdit (EditMask:String):String;
procedure DelRow(var delRow:Integer);
function ValidaRow(aRow:Integer; var aColErr: integer) : boolean;
procedure SetDetailCols(Value: TDetailCols);
procedure UpdateGrid();
protected
{ Protected declarations }
procedure KeyPress(var Key: Char); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure DoEnter; override;
procedure DoExit; override;
procedure DblClick; override;
function GetEditMask(ACol, aRow: Longint): string; override;
function SelectCell(ACol, aRow: Longint): Boolean; override;
procedure DoChangeState(State : TStateRow; aRow: LongInt); virtual;

public
{ Public declarations }
LastCol,LastRow : Integer;
constructor Create (AOwner : TComponent); Override;
destructor Destroy; override;
procedure ClearRows;

published
{ Published declarations }
property OnValidaCell : TValidaCellEvent read FOnValidaCell write FOnValidaCell;
property OnExitCell : TCellExitEvent read FOnExitCell write FOnExitCell;
property OnStateChange : TChangeStateEvent read FOnStateChange write FOnStateChange;
property ColumnsDetail : TDetailCols read FDetailCols write SetDetailCols stored false;
end;


procedure Register;

implementation

{# REGISTRO DO COMPONENTE }
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TDetailCols), TStringGridAcesso, ´ColumnsDetail´, TColumnsDetailProperty);
RegisterComponents(´Novos´, [TStringGridAcesso]);
end;

{ FUNCOES PRIVADAS }
function TStringGridAcesso.ValidaCell(aCol,ARow:Integer) : boolean;
{Funcoes Locais}
....


GOSTEI 0
Michael

Michael

28/03/2005

Olá amigo!

Vc não precisa buscar nenhuma unit do Delphi. Ao que parece, vc se esqueceu de registrar o editor de propriedade da coleção criada. No artigo citado tem um exemplo prático de como fazer isso.

[]´s


GOSTEI 0
Michael

Michael

28/03/2005

Olá amigo! Vc não precisa buscar nenhuma unit do Delphi. Ao que parece, vc se esqueceu de registrar o editor de propriedade da coleção criada. No artigo citado tem um exemplo prático de como fazer isso. []´s


Minto, vc registrou sim, mas não precisava. Desta forma vc sobrescreveu o editor padrão para a propriedade do tipo TCollection. A não ser que queira criar seu próprio editor.

[]´s


GOSTEI 0
POSTAR