EDITOR DE COMPONENTES E COMPONENTES VISUAIS.
BOA TARDE GALERA ESTOU COM UM PROBLEMA, JA PROCUREI EM TODA PARTE MAS NAO ENCONTREI, SE ALGUEM TIVER UM EXEMPLO DE COMO FAÇO UM EDITOR DE COMPONETES, SABE AQUELES DIALOGS? QUE VOCE DA UM DUPLO CLIQUE NO COMPONENTE EM TEMPO DE DESIGN E ABRE O EDITOR... E TAMBEM TO TENTNDO FAZER UM COMPONENTE MISTO, UM EDIT COM UM BUTTON NA FRENTE, PRA FAZER TIPO UM VALIDADOR ex: UM CAPO EDIT ONDE A PESSOA DIGITA O CPF, E O BUTTON NA FRENTE QUE VERIFICA SE JA EXISTE, FAÇO ESSE TIPO DE COISA EM 10 LUGARES DIFERENTES E TODA HORA TENHO QUE COLOCAR O EDIT, DEPOIS O BUTTON E DEPOIS COLOCAR UMA FUNCAO DE VALUDACAO DO BUTTON PARA VALIDAQR O VALOR DO EDIT...
ESPERO QUE ENTENDAM O QUE PRECISO, VLW GALERA
ESPERO QUE ENTENDAM O QUE PRECISO, VLW GALERA
Rpdesign
Curtidas 0
Respostas
Rpdesign
10/12/2008
UP
GOSTEI 0
Rpdesign
10/12/2008
achei um topico interessante mas nao consegui fazer se alguem conseguir e puder explicar melhor....
http://universodelphi.blogspot.com/2008/01/editor-de-componente.html
http://universodelphi.blogspot.com/2008/01/editor-de-componente.html
GOSTEI 0
Facc
10/12/2008
Amigo... nunca escreva o titulo do tópico nem a mensagem em caixa alta, dá impressão de vc estar gritando.
GOSTEI 0
Rpdesign
10/12/2008
desculpe os gritos nao era a intenção :)
alguem ai tem alguma ideia de porque isso nao funciona???
to pesquisando mas noa acho nada sobre o assunto
alguem ai tem alguma ideia de porque isso nao funciona???
to pesquisando mas noa acho nada sobre o assunto
GOSTEI 0
Rpdesign
10/12/2008
up
GOSTEI 0
Cruyahoo
10/12/2008
Procure Luiz Roche, editor de propriedades, que la tem exatamente o que
precisa.
Aproveitando o assunto , eu tambem estou com um probleminha que nao consigo fazer uma edicao de propriedade para aparecer os campos
de uma table, na construcao de um componente.
Se souber me avise aqui no site please.
boa sorte.
precisa.
Aproveitando o assunto , eu tambem estou com um probleminha que nao consigo fazer uma edicao de propriedade para aparecer os campos
de uma table, na construcao de um componente.
Se souber me avise aqui no site please.
boa sorte.
GOSTEI 0
Fabriciocolombo
10/12/2008
montei um exemplo criando um editor de propriedade e de componente. Qualquer dúvida estou a disposição.
Segue link...
Segue link...
http://www.4shared.com/account/file/76082770/e898bd5e/Editor_de_Component.html
GOSTEI 0
Rpdesign
10/12/2008
Procure Luiz Roche, editor de propriedades, que la tem exatamente o que
precisa.
Aproveitando o assunto , eu tambem estou com um probleminha que nao consigo fazer uma edicao de propriedade para aparecer os campos
de uma table, na construcao de um componente.
Se souber me avise aqui no site please.
boa sorte.
editor de propriedades e de componente sao diferentes, mas valeu a dica, quem sabe ele nao fala sobre os dois assuntos, vou pesquisar e aviso o pessoal se funcionaou, vou testar tambem o exemplo do nosso amigo abaixo,
tente esplica o que voce quis dizer com ´ Aproveitando o assunto , eu tambem estou com um probleminha que nao consigo fazer uma edicao de propriedade para aparecer os campos
de uma table, na construcao de um componente.
Se souber me avise aqui no site please.
´
quem sabe podemos te ajudar
GOSTEI 0
Rpdesign
10/12/2008
montei um exemplo criando um editor de propriedade e de componente. Qualquer dúvida estou a disposição.
Segue link...
http://www.4shared.com/account/file/76082770/e898bd5e/Editor_de_Component.html
obrigado FabricioColombo consegui fazer o que eu precisava apartir do seu exemplo, vou dar uma aprofundada melhor depois, mas desde ja muito obrigado, apesar de ter conseguido noa entendi direito o que aconteceu, porque existe uma referencia circular ignorada pelo compilador que geralmente exibe algum erro, e mesmo assim funcionou, as chamadas tambem estao estranhas, vou procurar sobre Luiz Roche quem sabe consigo entender melhor o que aconteceu...
não querendo abusar, eu na verdade usei somente os itens relacionados ao editor de componentes, a parte de edicao de propriedades nao usei, mesmo porque nao sei como funciona direito, deixei por conta do object inspector se virar com os campos, mas tenho muito interesse em aprender sobre isso, se alguem tiver alguma coisa...
o processo para criar editores individuais para cada propriedade é semelhante a esse que o FabricioColombo passou?
ex: noa quero que a pessoa de duplo clique para editar o componente, quero por exemplo que cada propriedade tenah seu proprio editor, ex: um componente de impressao, com as propriedades Porta, Pagina, Campos
onde a propriedade porta abriria um dialog com a lista das portas instaladas no windows para selecionar inpedindo assim que a pessoa digite um valor invalido, Pagina abrindo um dialog onde a pessoa arraste os campos e monte o relatorios, e campos com um dialog onde vc seleciona os campos da tabela que seram listados....
entendeu? nao quero fazer isso exatamente mas queria criar esses editores em todas as propriedades...
vle galera
GOSTEI 0
Rpdesign
10/12/2008
Desculpe parecer chato, sei que ja estou abusando, mas pulamos um topico, sobre os compoentes visuais, quando vou criar um novo componente preciso herdar de alguma coisa, e nao sei como fazer no caso de um componente ser a juncao de dois, como por exemplo um botao e um edit juntos
GOSTEI 0
Fabriciocolombo
10/12/2008
cruyahoo
se vc estiver usando ´DataField´ como nome da propriedade, o delphi já deveria mostrar os campos no object inspector... se vc estiver usando outro nome de propriedade, como ´FieldName´, por exemplo, vc deve fazer o registro do Editor.
P.S. precisa adicionar a uses DBReg;
se vc estiver usando ´DataField´ como nome da propriedade, o delphi já deveria mostrar os campos no object inspector... se vc estiver usando outro nome de propriedade, como ´FieldName´, por exemplo, vc deve fazer o registro do Editor.
RegisterPropertyEditor(TypeInfo(string), TClasseDoComponent, ´FieldName´, TDataFieldProperty);
P.S. precisa adicionar a uses DBReg;
GOSTEI 0
Fabriciocolombo
10/12/2008
TComponent - O ponto de partida para componentes não visuais.
TWinControl - O ponto de partida se é necessário que o componente tenha ´handles´ (foco).
TGraphicControl - Um ponto de partida bom para componentes visuais que não tenham ´handles´, ou seja, não recebem foco. Esta classe tem os metodos Paint e Canvas.
TCustomControl - O ponto de partida mais comum. Esta classe tem ´handle´ de janela, eventos e propriedades comuns e, principalmente, os metodos Canvas e Paint.
Para unir mais de um componente, podem utilizar um panel para criar um container, e criar os componentes em RunTime dentro do panel, ou apenas ´ligá-los´ através de properties como o TLabeledEdit que vem com o delphi. Olhe a implementação do compoente TCustomLabeledEdit na vcl do delphi.
TWinControl - O ponto de partida se é necessário que o componente tenha ´handles´ (foco).
TGraphicControl - Um ponto de partida bom para componentes visuais que não tenham ´handles´, ou seja, não recebem foco. Esta classe tem os metodos Paint e Canvas.
TCustomControl - O ponto de partida mais comum. Esta classe tem ´handle´ de janela, eventos e propriedades comuns e, principalmente, os metodos Canvas e Paint.
Para unir mais de um componente, podem utilizar um panel para criar um container, e criar os componentes em RunTime dentro do panel, ou apenas ´ligá-los´ através de properties como o TLabeledEdit que vem com o delphi. Olhe a implementação do compoente TCustomLabeledEdit na vcl do delphi.
GOSTEI 0
Rpdesign
10/12/2008
primeiramente obrigado FabricioColombo, vou estudar isso com mais cuidado depois, estou com um grande problema pessoal, ta quase tudo certo mas ta dando erro o codigo ta ai em baixo, alguem sabe onde estou errando??
unit SuperComboBox;
interface
uses
SysUtils, Classes, DesignEditors, DesignIntf,
Windows, Messages, Controls, StdCtrls, Grids, ValEdit, Consts, Dialogs;
type
TSuperComboBox = class(TComboBox)
private
FDBField:String;
FNulo : Boolean;
FMsgNulo : String;
FTESTE : TItemProps;
FRegiao:integer;
{ Private declarations }
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
{ Public declarations }
published
{ Published declarations }
property DBField : String read FDBField write FDBField;
property DBRegiao : Integer read FRegiao write FRegiao;
property Nulo : Boolean read FNulo write Fnulo;
property MsgNulo : String read FMsgNulo write FMsgNulo;
end;
TEditorSuperComboForm = class(TComponentEditor)
private
public
function GetVerb(Index: Integer): String; override;
function GetVerbCount: Integer; override;
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
end;
procedure Register;
implementation
{ TEditorSuperComboForm }
uses uEditorSuperComboDialog;
constructor TSuperComboBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FNulo:=true;
end;
procedure TEditorSuperComboForm.Edit;
begin
inherited;
end;
procedure TEditorSuperComboForm.ExecuteVerb(Index: Integer);
var
SuperComboBox : TSuperComboBox;
begin
case Index of
0: Execute(Component as TSuperComboBox);
end;
end;
function TEditorSuperComboForm.GetVerb(Index: Integer): String;
begin
case Index of
0: Result := ´Editar´;
end;
end;
function TEditorSuperComboForm.GetVerbCount: Integer;
begin
Result := 1;
end;
procedure Register;
begin
RegisterComponents(´SuperComponentes´, [TSuperComboBox]);
//Esse é o que aparece com o botão direito do mouse ou duplo clique no componente
RegisterComponentEditor(TSuperComboBox, TEditorSuperComboForm);
end;
end.
unit uEditorSuperComboDialog;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, ValEdit, SuperComboBox, AUTOMASOFT;
type
TEditorSuperComboDialog = class(TForm)
ValueListEditor1: TValueListEditor;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
private
{ Private declarations }
public
itens : TStrings;
{ Public declarations }
end;
procedure Execute(Editor : TSuperComboBox);
var
EditorSuperComboDialog: TEditorSuperComboDialog;
implementation
{$R *.dfm}
procedure Execute(Editor : TSuperComboBox);
var
fEditor: TEditorSuperComboDialog;
i, l : integer;
flag : boolean;
begin
try
fEditor := TEditorSuperComboDialog.Create(Editor);
fEditor.itens:=Editor.Items;
/// verifica se tem itens
if fEditor.Itens.Count>0 then
begin
//pula os itens no formato errado
for i:=0 to fEditor.Itens.Count-1 do
begin
flag:=false;
for l:=0 to length(trim(fEditor.Itens[i])) do
begin
// showmessage(copy(trim(fEditor.Itens[i]),l,1));
if copy(trim(fEditor.Itens[i]),l,1)=´>´ then
begin
flag:=true;
break;
end;
end;
if flag then
if (trim(EXPLODE(trim(fEditor.Itens[i]),´>´)[0])<>´´) and (trim(EXPLODE(trim(fEditor.Itens[i]),´>´)[1])<>´´) then
fEditor.ValueListEditor1.InsertRow(EXPLODE(trim(fEditor.Itens[i]),´>´)[0],EXPLODE(trim(fEditor.Itens[i]),´>´)[1],TRUE);
end;
end;
//// grava mudancas
if fEditor.ShowModal = mryes then
begin
/// armazena resultado
Editor.Items.Clear;
for i:=1 to fEditor.ValueListEditor1.RowCount-1 do
begin
Editor.AddItem(fEditor.ValueListEditor1.Keys[i]+´ > ´+fEditor.ValueListEditor1.Values[fEditor.ValueListEditor1.Keys[i]],Editor);
end;
end;
finally
fEditor.Free;
end;
end;
end.
GOSTEI 0
Fabriciocolombo
10/12/2008
qual é o erro? é na compilação ou na execução?
GOSTEI 0
Cruyahoo
10/12/2008
Obrigado pela dica vou desta-lo desta forma também mas vai aqui
detalhe do que estou tentando fazer.
Bem , fiz alguns testes e consegui da senguinte maneira:
Properties Campo : Tfield read fCampo write setCampo ;
onde a setCampo segue como procedure:
procedure TAlteraSenha.SetCampoSenha(VCampo:Tfield);
begin
if Vcampo <> FcampoSenha then FcampoSenha := Vcampo;
end;
Sendo assim meu componente aparecerá no object inspector o combobox de campos da tabela no seguinte formato:
assim:
TBCLIENTESnome
TBCLIENTESendereco
ou quando se usa Data Module:
DataModule1.TBCLIENTESnome
Datamodule1.TBCLIENTESendereco
Já está funcionando, mas gostaria que apareceresse somente
o nome de campo ex. nome
enrereco
cep
hardruzzi
«
detalhe do que estou tentando fazer.
Bem , fiz alguns testes e consegui da senguinte maneira:
Properties Campo : Tfield read fCampo write setCampo ;
onde a setCampo segue como procedure:
procedure TAlteraSenha.SetCampoSenha(VCampo:Tfield);
begin
if Vcampo <> FcampoSenha then FcampoSenha := Vcampo;
end;
Sendo assim meu componente aparecerá no object inspector o combobox de campos da tabela no seguinte formato:
assim:
TBCLIENTESnome
TBCLIENTESendereco
ou quando se usa Data Module:
DataModule1.TBCLIENTESnome
Datamodule1.TBCLIENTESendereco
Já está funcionando, mas gostaria que apareceresse somente
o nome de campo ex. nome
enrereco
cep
hardruzzi
«
GOSTEI 0
Cruyahoo
10/12/2008
A todos, a quem possa ser útil
Considerando o tópico de muita avalia, e tentando dar continuidade ao
assunto sem querer desviar objetivo, aqui vai o código do componente
que se utiliza de um form que fará parte da VCL. Estes 2 componentes:
SENHA e ALTERASENHA,
geram a tela de uma entrada de senha, checa na base e retorna true,
deixando a condição com o criador do sistema esclher ( se a senha
alternativa ou a do usuario for ok entao fecha ou abre alguma coisa etc.).
O componente ALTERASENHA solicita a senha atual e habilita combo
p/ solicitacao de senha obrigatoria ou nao, alem de permitir a alteracao
da senha. O campo CampoReq é o que se refere a obrigatoriedade de impostar ou nao.
Estou tentando aprimorar para aprender mais.
Segue o codigo que eh composta de unidades do codigo componente
e a unit dfm que eh a forma do compnente, que já opera normalmente.
{Todas as referencias de variaveis partem e referenciam nesta unidade. Ate as atribuicoes
de valores para serem passados como rerefencia para o formSENHA. Ver chamada
principal SenhaOk do tipo Execute, lá estao as atribuicoes.}
unit SENHA;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DB,DBTables,Dbctrls;
type
Tsenha = class(Tcomponent)
private
// FDS: TDataSource;//Reservado
FSenhaAlt: String;
FcampoSenha : Tfield;
FCor: Tcolor;
FTitulo: String;
// procedure SetDS(Value: TDataSource);
procedure SetCampoSenha(Value:Tfield);
protected
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
function SenhaOk:boolean;//Chamadora inicial principal.Equivalente a Execute
published
// property DatSource : TDataSource read FDS write SetDS;//Reservado
property SenhaAlternat : String read FSenhaAlt write FSenhaAlt;
property Titulo : String read FTITULO write FTITULO;
property Cor : Tcolor read FCor write FCor;
property CampoSenha : Tfield read FcampoSenha write SetCampoSenha;
end;
procedure Register;
implementation
uses SENHAform;
constructor Tsenha.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
end;
destructor Tsenha.Destroy;
begin
inherited Destroy;
end;
{Reservado e testado ok}
{procedure Tsenha.SetDS(value: TDataSource);
begin
if value <> fDS then fDS := value;
end;
}
procedure Tsenha.SetCampoSenha(Value:Tfield);
begin
if value <> FcampoSenha then FcampoSenha := value;
end;
{Metodo chamador principal: chama o form de senha verifica chkSENHA criada como publica e
atribuida no form, se a senha estiver Ok, setando paralelamente a funcao aqui formSENHA.chk,
que por sua vez resulta o valor booleano para o form da aplicacao}
function Tsenha.SenhaOk:boolean; //Equivale ao metodo Execute
begin
formSENHA:=TformSENHA.Create(Application);
try
// formSENHA.Inicializar;
formSENHA.SENHALTERN:=FSenhaAlt;
formSENHA.valorSENHA:=FcampoSenha.value;
formSENHA.Caption:=FTitulo;
formSENHA.Color:=FCor;
formSENHA.ShowModal;
if formSENHA.chkSENHA then
begin
result:=true
end
else
result:=false;
finally
formSENHA.Free;
end;
end;
procedure Register;
begin
// RegisterComponents(´MyCmpDesenv´, [Tsenha]);
RegisterComponents(´MyCompProduc´, [Tsenha]);
end;
end.
/////////////Unidade form do componente:
unit SENHAform;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask, DBCtrls, ExtCtrls;
type
TformSENHA = class(TForm)
Label1: TLabel;
Edit1: TEdit;
btOK: TButton;
btCANCELA: TButton;
// procedure Inicializar; Nao usou inicializar
function CRIP6(mCad : string):string;
{Dos componentes deste form}
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
SENHALTERN : String;
valorSENHA : String;
chkSENHA : Boolean;//Sera lida na funcao SenhaOk do componente.
end;
var
formSENHA: TformSENHA;
implementation
{$R *.DFM}
{procedure TfSENHA.Inicializar; //Nao usou inicializar.
begin
dbGrid.ReadOnly:=FReadOnly;
pBusca.Visible:=FBuscar;
if FFiltrar then
dbGrid.PopupMenu:=PopupMenu1
else
dbGrid.PopupMenu:=nil;
end;}
PROCEDURE TformSENHA.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
BEGIN
btOk.Click;
END;
end;
procedure TformSENHA.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
edit1.text:=´´;
end;
{OBS btOK: Abaixo o evento cnclick foi substituido pelo efeito Modalresult da
propriedade no botao pelo método onClose Query do Form.}
procedure TformSENHA.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if (ModalResult=mrOK) then
// begin
if (Edit1.Text = ´´) then
begin
ShowMessage(´Entre com a senha´);
CanClose:=False;
end
else if((edit1.Text <> ´´) AND (CRIP6(edit1.text)=valorSENHA)) OR (edit1.text=SENHALTERN) THEN
{Fecha o form de senha retornando chkSENHA p/ SENHA.pas no método SENHAok, que por
sua vez passa true p/ a chamada boleana do componente no form da APL.}
begin
chkSENHA:=true;//Criada como publica neste form.
CanClose:=True;
end
else
begin
MessageDLG(´Senha não confere.´,mtWarning,[mbOk],0);
chkSENHA:=False;
CanClose:=False;
end;
{Se botao cancel for precionado, CloseQuery do form vai ler propriedade
ModalResult setado no botao. OnCloseQuery do form esta perguntando pelo fechamento}
IF ModalResult=mrCANCEL THEN
begin
chkSENHA:=false;
CanClose:=true;
end;
end;
FUNCTION TformSENHA.CRIP6(mCad : string):string;
var
v1,v2,v3,v4,v5,v6 : INTEGER;
t1,t2,t3,t4,t5,t6 : INTEGER;
BEGIN
v1:=ord(mCad[1]); v2:=ord(mCad[2]);
v3:=ord(mCad[3]); v4:=ord(mCad[4]);
v5:=ord(mCad[5]); v6:=ord(mCad[6]);
t1:=((v1*1 + v2*2 + v4*3 + v5*4 + v3*6 + v6)mod 223) + 32;
t2:=((v1*2 + v2*5 + v4*1 + v5*3 + v3*5 + v6)mod 223) + 32;
t3:=((v1*6 + v2*3 + v4*7 + v5*1 + v3*2 + v6)mod 223) + 32;
t4:=((v1*2 + v2*5 + v4*1 + v5*3 + v3*7 + v6)mod 223) + 32;
t5:=((v1*4 + v2*4 + v4*3 + v5*5 + v3*1 + v6)mod 223) + 32;
t6:=((v1*3 + v2*1 + v4*7 + v5*2 + v3*6 + v6)mod 223) + 32;
result:=chr(t5) + chr(t1) + chr(t6) + chr(t2) + chr(t4) + chr(t3);
END;
end.
O componente reune um form e a unidade principal, observando a dependencia na clausula Uses, fazendo com que este se possa agrupar mais componente em outro tipo de desenvolvimento, por ex. botao +
Paineis etc.
foi a técnica bem simples que consegui.
Se alguem quizer testar esteje a vontade e retorne a parece neste topico.
obrigado
Considerando o tópico de muita avalia, e tentando dar continuidade ao
assunto sem querer desviar objetivo, aqui vai o código do componente
que se utiliza de um form que fará parte da VCL. Estes 2 componentes:
SENHA e ALTERASENHA,
geram a tela de uma entrada de senha, checa na base e retorna true,
deixando a condição com o criador do sistema esclher ( se a senha
alternativa ou a do usuario for ok entao fecha ou abre alguma coisa etc.).
O componente ALTERASENHA solicita a senha atual e habilita combo
p/ solicitacao de senha obrigatoria ou nao, alem de permitir a alteracao
da senha. O campo CampoReq é o que se refere a obrigatoriedade de impostar ou nao.
Estou tentando aprimorar para aprender mais.
Segue o codigo que eh composta de unidades do codigo componente
e a unit dfm que eh a forma do compnente, que já opera normalmente.
{Todas as referencias de variaveis partem e referenciam nesta unidade. Ate as atribuicoes
de valores para serem passados como rerefencia para o formSENHA. Ver chamada
principal SenhaOk do tipo Execute, lá estao as atribuicoes.}
unit SENHA;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DB,DBTables,Dbctrls;
type
Tsenha = class(Tcomponent)
private
// FDS: TDataSource;//Reservado
FSenhaAlt: String;
FcampoSenha : Tfield;
FCor: Tcolor;
FTitulo: String;
// procedure SetDS(Value: TDataSource);
procedure SetCampoSenha(Value:Tfield);
protected
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
function SenhaOk:boolean;//Chamadora inicial principal.Equivalente a Execute
published
// property DatSource : TDataSource read FDS write SetDS;//Reservado
property SenhaAlternat : String read FSenhaAlt write FSenhaAlt;
property Titulo : String read FTITULO write FTITULO;
property Cor : Tcolor read FCor write FCor;
property CampoSenha : Tfield read FcampoSenha write SetCampoSenha;
end;
procedure Register;
implementation
uses SENHAform;
constructor Tsenha.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
end;
destructor Tsenha.Destroy;
begin
inherited Destroy;
end;
{Reservado e testado ok}
{procedure Tsenha.SetDS(value: TDataSource);
begin
if value <> fDS then fDS := value;
end;
}
procedure Tsenha.SetCampoSenha(Value:Tfield);
begin
if value <> FcampoSenha then FcampoSenha := value;
end;
{Metodo chamador principal: chama o form de senha verifica chkSENHA criada como publica e
atribuida no form, se a senha estiver Ok, setando paralelamente a funcao aqui formSENHA.chk,
que por sua vez resulta o valor booleano para o form da aplicacao}
function Tsenha.SenhaOk:boolean; //Equivale ao metodo Execute
begin
formSENHA:=TformSENHA.Create(Application);
try
// formSENHA.Inicializar;
formSENHA.SENHALTERN:=FSenhaAlt;
formSENHA.valorSENHA:=FcampoSenha.value;
formSENHA.Caption:=FTitulo;
formSENHA.Color:=FCor;
formSENHA.ShowModal;
if formSENHA.chkSENHA then
begin
result:=true
end
else
result:=false;
finally
formSENHA.Free;
end;
end;
procedure Register;
begin
// RegisterComponents(´MyCmpDesenv´, [Tsenha]);
RegisterComponents(´MyCompProduc´, [Tsenha]);
end;
end.
/////////////Unidade form do componente:
unit SENHAform;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask, DBCtrls, ExtCtrls;
type
TformSENHA = class(TForm)
Label1: TLabel;
Edit1: TEdit;
btOK: TButton;
btCANCELA: TButton;
// procedure Inicializar; Nao usou inicializar
function CRIP6(mCad : string):string;
{Dos componentes deste form}
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
SENHALTERN : String;
valorSENHA : String;
chkSENHA : Boolean;//Sera lida na funcao SenhaOk do componente.
end;
var
formSENHA: TformSENHA;
implementation
{$R *.DFM}
{procedure TfSENHA.Inicializar; //Nao usou inicializar.
begin
dbGrid.ReadOnly:=FReadOnly;
pBusca.Visible:=FBuscar;
if FFiltrar then
dbGrid.PopupMenu:=PopupMenu1
else
dbGrid.PopupMenu:=nil;
end;}
PROCEDURE TformSENHA.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
BEGIN
btOk.Click;
END;
end;
procedure TformSENHA.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
edit1.text:=´´;
end;
{OBS btOK: Abaixo o evento cnclick foi substituido pelo efeito Modalresult da
propriedade no botao pelo método onClose Query do Form.}
procedure TformSENHA.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if (ModalResult=mrOK) then
// begin
if (Edit1.Text = ´´) then
begin
ShowMessage(´Entre com a senha´);
CanClose:=False;
end
else if((edit1.Text <> ´´) AND (CRIP6(edit1.text)=valorSENHA)) OR (edit1.text=SENHALTERN) THEN
{Fecha o form de senha retornando chkSENHA p/ SENHA.pas no método SENHAok, que por
sua vez passa true p/ a chamada boleana do componente no form da APL.}
begin
chkSENHA:=true;//Criada como publica neste form.
CanClose:=True;
end
else
begin
MessageDLG(´Senha não confere.´,mtWarning,[mbOk],0);
chkSENHA:=False;
CanClose:=False;
end;
{Se botao cancel for precionado, CloseQuery do form vai ler propriedade
ModalResult setado no botao. OnCloseQuery do form esta perguntando pelo fechamento}
IF ModalResult=mrCANCEL THEN
begin
chkSENHA:=false;
CanClose:=true;
end;
end;
FUNCTION TformSENHA.CRIP6(mCad : string):string;
var
v1,v2,v3,v4,v5,v6 : INTEGER;
t1,t2,t3,t4,t5,t6 : INTEGER;
BEGIN
v1:=ord(mCad[1]); v2:=ord(mCad[2]);
v3:=ord(mCad[3]); v4:=ord(mCad[4]);
v5:=ord(mCad[5]); v6:=ord(mCad[6]);
t1:=((v1*1 + v2*2 + v4*3 + v5*4 + v3*6 + v6)mod 223) + 32;
t2:=((v1*2 + v2*5 + v4*1 + v5*3 + v3*5 + v6)mod 223) + 32;
t3:=((v1*6 + v2*3 + v4*7 + v5*1 + v3*2 + v6)mod 223) + 32;
t4:=((v1*2 + v2*5 + v4*1 + v5*3 + v3*7 + v6)mod 223) + 32;
t5:=((v1*4 + v2*4 + v4*3 + v5*5 + v3*1 + v6)mod 223) + 32;
t6:=((v1*3 + v2*1 + v4*7 + v5*2 + v3*6 + v6)mod 223) + 32;
result:=chr(t5) + chr(t1) + chr(t6) + chr(t2) + chr(t4) + chr(t3);
END;
end.
O componente reune um form e a unidade principal, observando a dependencia na clausula Uses, fazendo com que este se possa agrupar mais componente em outro tipo de desenvolvimento, por ex. botao +
Paineis etc.
foi a técnica bem simples que consegui.
Se alguem quizer testar esteje a vontade e retorne a parece neste topico.
obrigado
GOSTEI 0
Bruno6652
10/12/2008
Eu estou fazendo um editor de propriedades para os meus componentes, entretanto está dando alguns erros em algumas Units do Delphi, tais como:
DesignEditors
DesignIntf
Declarei elas, mas o Delphi acusa um erro dizendo que não existe essa Unit, meio estranho isso.
Alguem tem uma idéia?
OBS: Eu uso Delphi 2007.
Obrigado
DesignEditors
DesignIntf
Declarei elas, mas o Delphi acusa um erro dizendo que não existe essa Unit, meio estranho isso.
Alguem tem uma idéia?
OBS: Eu uso Delphi 2007.
Obrigado
GOSTEI 0
Bruno6652
10/12/2008
Pessoal, desculpem esse UP.
Mas preciso tirar essa duvida, porque to desenvolvendo os editores de propriedades conforme os turoriais e livros e nao funciona, dando erros nas units citadas.
Sera que alguem pode me ajudar nessa?
Muito obrigado
OBS: Lembrando que uso Delphi 2007
Mas preciso tirar essa duvida, porque to desenvolvendo os editores de propriedades conforme os turoriais e livros e nao funciona, dando erros nas units citadas.
Sera que alguem pode me ajudar nessa?
Muito obrigado
OBS: Lembrando que uso Delphi 2007
GOSTEI 0
Bruno6652
10/12/2008
Ninguem sabe mesmo como me ajudar nessa?
2 UPs, vou acabar sendo expulso xD
2 UPs, vou acabar sendo expulso xD
GOSTEI 0
Fabriciocolombo
10/12/2008
vc precisa incluir na library do delphy o diretório $(DELPHI)\Source\ToolsAPI.
Se estiver usando apenas em uma Package, pode apenas adicionar designide.dcp($(DELPHI)\Lib) como Requires
Se estiver usando apenas em uma Package, pode apenas adicionar designide.dcp($(DELPHI)\Lib) como Requires
GOSTEI 0
Rpdesign
10/12/2008
Bruno6652
oque o Fabricio falou funciona perfeitamente no delphi 7, porem no delphi 2007 essas suas units nao vem no diretorio do toolsapi, entao, um metodo que utilizei foi, pegar na pasta do delphi 7 e carregar junto com meu projeto, se por acaso faltar a unit proxies.pas, que tambem noa vem com o delphi 2007 é so criar uma unit em branco no delphi e salvar junto com seu projeto com o nome de proxies.pas
ainda nao sei se meu delphi 2007 veio com problemas ou se realmente nao estao mais distribuindo essas units :)
oque o Fabricio falou funciona perfeitamente no delphi 7, porem no delphi 2007 essas suas units nao vem no diretorio do toolsapi, entao, um metodo que utilizei foi, pegar na pasta do delphi 7 e carregar junto com meu projeto, se por acaso faltar a unit proxies.pas, que tambem noa vem com o delphi 2007 é so criar uma unit em branco no delphi e salvar junto com seu projeto com o nome de proxies.pas
ainda nao sei se meu delphi 2007 veio com problemas ou se realmente nao estao mais distribuindo essas units :)
GOSTEI 0
Fabriciocolombo
10/12/2008
Utilizo apenas o delphi 7, então não sei dizer com relação ao 2007, mais no meu delphi 7 tbm não vem a unit Proxies, e eu faço o seguinte:
Dentro da Unit C:\Arquivos de programas\Borland\Delphi7\Source\ToolsAPI\DesignEditors.pas, eu altero as seguintes Linhas:
Na Linha 530
Fica assim :
Na Linha 914
Fica assim :
Na Linha 2743 e 2744
Fica assim:
Para o Delphi 7 funciona bem
Dentro da Unit C:\Arquivos de programas\Borland\Delphi7\Source\ToolsAPI\DesignEditors.pas, eu altero as seguintes Linhas:
Na Linha 530
uses DesignConst, Consts, RTLConsts, Contnrs,Proxies;
Fica assim :
uses DesignConst, Consts, RTLConsts, Contnrs;//Proxies;
Na Linha 914
if (FAncestor = nil) and (Component <> Designer.Root) and IsProxyClass(Component.ClassType) then
Fica assim :
if (FAncestor = nil) and (Component <> Designer.Root) then //and IsProxyClass(Component.ClassType) then
Na Linha 2743 e 2744
while IsProxyClass(ComponentClass) do ComponentClass := TComponentClass(ComponentClass.ClassParent);
Fica assim:
// while IsProxyClass(ComponentClass) do // ComponentClass := TComponentClass(ComponentClass.ClassParent);
Para o Delphi 7 funciona bem
GOSTEI 0
Bruno6652
10/12/2008
Desculpem-me pela demora na resposta.
Eu consegui fazer funcionar.
Adicionei ao Library o diretório ToolsAPI e chamei as classes no Uses e deu certo.
Obrigado a todos que me ajudaram.
Eu consegui fazer funcionar.
Adicionei ao Library o diretório ToolsAPI e chamei as classes no Uses e deu certo.
Obrigado a todos que me ajudaram.
GOSTEI 0
Cruyahoo
10/12/2008
FabricioColombo,
Agradeço a dica, e informo que já conclui o componente,
e aquele campo onde pede o nome do campo (Tfield), relamente
não precisava de maiores tratos visto que declarando o tipo Tfield
para a propriedade, o object Insp. ja aparece com as opcoes.
Só ficou uma coisa estranha. É que as opcoes aparecem sempre como
decendentes do dataset ex:
opcao 1 TBclientesNOME
opcao 2 TBclientesCHAVE
e assim por diante. Ateh funciona , mas fica meio fora de padrao ao contrario de se apresentar na forma so dos campos ex:
opcao 1 NOME
opcao 2 CHAVE ... ETC..
eu teria que selecionar um dataset e a partir dele construir uma procedure ou funcao que me retornasse so o nome do campo.
Agradeço a dica, e informo que já conclui o componente,
e aquele campo onde pede o nome do campo (Tfield), relamente
não precisava de maiores tratos visto que declarando o tipo Tfield
para a propriedade, o object Insp. ja aparece com as opcoes.
Só ficou uma coisa estranha. É que as opcoes aparecem sempre como
decendentes do dataset ex:
opcao 1 TBclientesNOME
opcao 2 TBclientesCHAVE
e assim por diante. Ateh funciona , mas fica meio fora de padrao ao contrario de se apresentar na forma so dos campos ex:
opcao 1 NOME
opcao 2 CHAVE ... ETC..
eu teria que selecionar um dataset e a partir dele construir uma procedure ou funcao que me retornasse so o nome do campo.
GOSTEI 0