Fórum Macro no Delphi tem como ? #169202
13/07/2003
0
Pessoal,
Imaginen o cadastro de clientes de um aplicativo.
Estou desenvolvendo um projeto onde, em uma tabela DBF por exemplo, tenho as informações de qual tabela, quais campos, qual o tipo de dados, qual o tamanho, o texto que vou colocar no label e assim por diante.
Quando o aplicativo é iniciado e entramos no cadastro de clientes, o formulário baseado no nome da tabela, localiza os campos criando os componentes em RunTime, na ordem em que estiverem no dicionário.
Isso é útil por exemplo, ao invéz de ter que abrir todo o projeto para mudar o formulário afim de alterar a ordem de um campo, basta alterar a ordem no dicionário e desta forma, o campo assumirá a nova ordem no formulário sem que se precise mexer no projeto !
O meu problema consiste em: para os campos, gostaria de atribuir funções de validação que pudessem, de acordo com a necessidade serem trocadas, sem precisar mexer no executável (projeto).
Ou seja, em um campo chamado VALIDACAO eu teria um texto dizendo qual função executar para validar os dados do campo:
Ex.: Cliente,Bairro, String, 20, 0, validabairro(dbedit32.text)
onde:
[Cliente] é o nome da tabela
[bairro] nome do campo
[String] tipo de dados
[20] tamanho da string
[0] tamanho do decimal (quando numérico)
[validabairro(dbedit32.text)] nome da função de validação
o que quero é atribuir ao evento OnExit ou OnValidate do dbEdit32 a função validabairro(dbEdit32.text) passando como parâmetro o conteúdo do campo bairro.
Como faço para o Delphi entender isso ? pois ele acusa erro em tempo de execução que o tipo de dados é incompatível.
Será que fui claro ?
Imaginen o cadastro de clientes de um aplicativo.
Estou desenvolvendo um projeto onde, em uma tabela DBF por exemplo, tenho as informações de qual tabela, quais campos, qual o tipo de dados, qual o tamanho, o texto que vou colocar no label e assim por diante.
Quando o aplicativo é iniciado e entramos no cadastro de clientes, o formulário baseado no nome da tabela, localiza os campos criando os componentes em RunTime, na ordem em que estiverem no dicionário.
Isso é útil por exemplo, ao invéz de ter que abrir todo o projeto para mudar o formulário afim de alterar a ordem de um campo, basta alterar a ordem no dicionário e desta forma, o campo assumirá a nova ordem no formulário sem que se precise mexer no projeto !
O meu problema consiste em: para os campos, gostaria de atribuir funções de validação que pudessem, de acordo com a necessidade serem trocadas, sem precisar mexer no executável (projeto).
Ou seja, em um campo chamado VALIDACAO eu teria um texto dizendo qual função executar para validar os dados do campo:
Ex.: Cliente,Bairro, String, 20, 0, validabairro(dbedit32.text)
onde:
[Cliente] é o nome da tabela
[bairro] nome do campo
[String] tipo de dados
[20] tamanho da string
[0] tamanho do decimal (quando numérico)
[validabairro(dbedit32.text)] nome da função de validação
o que quero é atribuir ao evento OnExit ou OnValidate do dbEdit32 a função validabairro(dbEdit32.text) passando como parâmetro o conteúdo do campo bairro.
Como faço para o Delphi entender isso ? pois ele acusa erro em tempo de execução que o tipo de dados é incompatível.
Será que fui claro ?
Ebatista
Curtir tópico
+ 0
Responder
Posts
02/01/2004
Galodoido
Olá, ebatista;
Acho que vc precisaria e de fazer uma espécie de macro substituição. Porém estou tentando uma forma de fazer isto, mas ainda ñ encontrei.
Caso encontre, lhe informo.
Acho que vc precisaria e de fazer uma espécie de macro substituição. Porém estou tentando uma forma de fazer isto, mas ainda ñ encontrei.
Caso encontre, lhe informo.
Responder
Gostei + 0
02/01/2004
Barcelos
Olá amigo,
Vou lhe dar um exemplo de como chamar uma procedure/function em tempo de execução através de strings. Você pode adaptar de acordo com as suas necessidades.
Esse exemplo vai atribuir a Procedure FuiClicado para o evento Onclick do componente Button2. Declare a unit TypInfo na Seção Uses do seu formulário.
Primeiro crie a(s) função(ões)/procedimento(s) que será(ão) passada(s) em tempo de execução. Lembre-se de que esta(s) deve ter os mesmos parâmetros do evento em questão. Como eu vou atribuir ao evento OnClick, minha procedure deve ter um parâmetro do tipo TObject. Detalhe: Esta função deve ser declarada na seção published da unit para que tenha efeito:
...
published
procedure FuiClicado(Sender : TObject)
end;
procedure TForm1.FuiClicado(Sender : TObject);
begin
ShowMessage(´Fui Clicado!´);
end;
Agora crie o procedimento que vai atribuir a function/procedure ao componente:
Procedure TForm1.AtribuirFuncao(Controle : TControl;Evento : String;Metodo : TMethod);
var PProp : PPropInfo;
begin
PProp := GetPropInfo(Controle.ClassInfo,Evento);
If Assigned(PProp) then
SetMethodProp(Controle,PProp,Metodo);
end;
Agora basta você passar esta procedure em algum lugar:
procedure TForm1.Button1Click(Sender: TObject);
var
metodo: TMethod;
begin
metodo.Code := MethodAddress(´FuiClicado´);
metodo.Data := Self;
//aqui eu atribuo a procedure FuiClicado ao método Onclick do Button2
AtribuirFunco(Button2, ´OnClick´, metodo);
end;
Lembre-se porém, que como você está usando RTTI, o programa tende a ficar mais lento.
Se houver algum erro neste código, me passa um email que te mando um exemplo. Pode haver algum erro porque o computador que estou usando não tem Delphi...
Espero ter ajudado,
Barcelos
osbarcelos@hotmail.com
Vou lhe dar um exemplo de como chamar uma procedure/function em tempo de execução através de strings. Você pode adaptar de acordo com as suas necessidades.
Esse exemplo vai atribuir a Procedure FuiClicado para o evento Onclick do componente Button2. Declare a unit TypInfo na Seção Uses do seu formulário.
Primeiro crie a(s) função(ões)/procedimento(s) que será(ão) passada(s) em tempo de execução. Lembre-se de que esta(s) deve ter os mesmos parâmetros do evento em questão. Como eu vou atribuir ao evento OnClick, minha procedure deve ter um parâmetro do tipo TObject. Detalhe: Esta função deve ser declarada na seção published da unit para que tenha efeito:
...
published
procedure FuiClicado(Sender : TObject)
end;
procedure TForm1.FuiClicado(Sender : TObject);
begin
ShowMessage(´Fui Clicado!´);
end;
Agora crie o procedimento que vai atribuir a function/procedure ao componente:
Procedure TForm1.AtribuirFuncao(Controle : TControl;Evento : String;Metodo : TMethod);
var PProp : PPropInfo;
begin
PProp := GetPropInfo(Controle.ClassInfo,Evento);
If Assigned(PProp) then
SetMethodProp(Controle,PProp,Metodo);
end;
Agora basta você passar esta procedure em algum lugar:
procedure TForm1.Button1Click(Sender: TObject);
var
metodo: TMethod;
begin
metodo.Code := MethodAddress(´FuiClicado´);
metodo.Data := Self;
//aqui eu atribuo a procedure FuiClicado ao método Onclick do Button2
AtribuirFunco(Button2, ´OnClick´, metodo);
end;
Lembre-se porém, que como você está usando RTTI, o programa tende a ficar mais lento.
Se houver algum erro neste código, me passa um email que te mando um exemplo. Pode haver algum erro porque o computador que estou usando não tem Delphi...
Espero ter ajudado,
Barcelos
osbarcelos@hotmail.com
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)