Propriedade para novo componente
Criei um componente para validação de Inscrições Estaduais, e quero inserir uma Propriedade UF, q capture esta de um ComboBox, ou de uma ListBox inserida no formulário, assim como existem componentes que permitem q se indiquem outro no mesmo formulário. Desde já agradeço qualquer cooperação.
Xandyr
Curtidas 0
Respostas
Paulo_amorim
06/05/2004
Olá
Essa propriedade não é do Tipo String?
Se o qe vc quer é indicar qual o componente em si (tipo COmboBox), vc pode colocar a propriedade do tipo TComboBox.
Se ela pode ser do listbox tambem, vc tem que procurar um ancestral comum dos 2...e defina tua variavel pra ser desse tipo. o Object Inspector já faz a identificação
da uma olhada no Help pra ver os ancestrais
Espero que ajude
Até+
Essa propriedade não é do Tipo String?
Se o qe vc quer é indicar qual o componente em si (tipo COmboBox), vc pode colocar a propriedade do tipo TComboBox.
Se ela pode ser do listbox tambem, vc tem que procurar um ancestral comum dos 2...e defina tua variavel pra ser desse tipo. o Object Inspector já faz a identificação
da uma olhada no Help pra ver os ancestrais
Espero que ajude
Até+
GOSTEI 0
Beppe
06/05/2004
No Delphi 7 vc pode usar a classe TCustomListControl como sendo o tipo da propriedade, assim vc pode usar tanto combos como listboxes. Não estou bem lembrado a partir de qual versão q ela foi introduzida; se ela não esxitir vc terá q escolher entre um e outro.
Uma propriedade deste tipo, exige mais cuidado do q uma proriedade simples:
Uma propriedade deste tipo, exige mais cuidado do q uma proriedade simples:
protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; ... published property UFList: TCustomListControl read FUFList write SetUFList; ... procedure TSeuComp.SetUFList(Value: TWinControl); begin FUFList := Value; if Value <> nil then Value.FreeNotification(Self); end; procedure TSeuComp.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Operation = opRemove) and (AComponent = FUFList) then FUFList := nil; end;
GOSTEI 0
Paulo_amorim
06/05/2004
No Delphi 7 vc pode usar a classe TCustomListControl como sendo o tipo da propriedade, assim vc pode usar tanto combos como listboxes. Não estou bem lembrado a partir de qual versão q ela foi introduzida; se ela não esxitir vc terá q escolher entre um e outro.
Olá
Olhei no D5 e ambos ListBox e ComboBox derivam de TWinControl...sem passar por esse ancestral que o Beppe falou.
Se for o caso que vc está usando, o problema vai ser que aparecerá botões, edits, etc... :?
Até+
GOSTEI 0
Beppe
06/05/2004
A classe TCustomListControl tem comportamento de lista(métodos AddItem, Clear, etc) tem como herdeiros apenas TComboBox e TListBox, todos com igual comportamento. Se um componente herdar de TCustomListControl, vc sabe q vai funcionar. A vantagem é q o usuário pode escolher um componente q vc nem conhecia, dando mais flexibilidade.
Nas versões anteriores, TWinControl não é seguro: sem typecasts, vc não pode adiconar ítems, por exemplo. Este é um modelo rígido demais para ser seguido. Restam duas alternativas. Criar uma propriedade do tipo TCustomComboBox, para exibir em combos, uma propriedade TCustomListBox para exibir em listboxes, ou então, disparar um evento q o usuário pode usar para adicionar os ítems no controle que quiser.
Nas versões anteriores, TWinControl não é seguro: sem typecasts, vc não pode adiconar ítems, por exemplo. Este é um modelo rígido demais para ser seguido. Restam duas alternativas. Criar uma propriedade do tipo TCustomComboBox, para exibir em combos, uma propriedade TCustomListBox para exibir em listboxes, ou então, disparar um evento q o usuário pode usar para adicionar os ítems no controle que quiser.
GOSTEI 0
Chao_pa
06/05/2004
Caro colega, gostaria que tomasse o pequeno comentário e talvez sugestões feitas por mim no texto abaixo, como um conselho e não como critica.
Também sou desenvolvedor de componentes (desde 199...), a maior parte do meu trabalho é desenvolver componentes da área de computação gráfica, mais especificamente componentes de captura de imagens, usados principalmente por aplicativos utilizados por empresas de segurança e em softwares de administração de portarias (condomínios, empresas, ...), em minha pouca experiência como desenvolvedor de componentes, aprendi que na maioria dos casos a entrada e de dados, feitas em componentes externos, deve interfacear com nossos componentes através de uma propriedade simples (como exemplo: ´property UF: String read GetUF write SetUF´), ou métodos, chamados através de manipuladores de eventos desses componentes (de entrada de dados).
Como exemplo para seu componente, poderiamos usar o evento OnChange do ComboBox para escrever um manipulador para entrada do dado na propriedade do nosso componente ou chamar um método de validação do nosso componente:
no OnChange do ComboBox poderiamos digitar algo como:
NossoComponente.Validate(String selecionada no ComboBox/ListBox, String com o número da Inscrição a ser validada que poderia ter sido digitada em um edit);
ou ainda
NossoComponente.Inscricao(String com o número da Inscrição a ser validada talvez digitada em um edit);
NossoComponente.UF(String selecionada no ComboBox/ListBox);
NossoComponente.Validate;
para mim esse tipo de abordagem dá mais liberdade ao desenvolvedor que estará usando seu componente, por exemplo, suponhamos que um desenvolvedor queira fazer a validação no momento em que é escolhida a UF em um ComboBox e outro queira que a validação seja feita quando o usuário do sistema clique no botão OK do formulário de entrada/cadastro onde os dados estão sendo digitados, na sua abordagem a escolha do último desenvolvedor seria muito trabalhosa ou não seria possível já que com o ComboBox/ListBox acoplados ao seu componente, quando o usuário do sistema selecionasse a UF no Combo/ListBox, a validação seria feita automaticamente, enquanto que utilizando um método ou propriedades como as que eu citei acima bastaria colocar o seguinte código no OnClick do botão:
NossoComponente.Validate(String selecionada no ComboBox, String com o número da Inscrição a ser validade talvez digitada em um edit);
ou ainda
NossoComponente.Inscricao(String com o número da Inscrição a ser validade talvez digitada em um edit);
NossoComponente.UF(String selecionada no ComboBox);
NossoComponente.Validate;
Um outro problema seria o fato de seu componente dar a volta na separação entre a interface gráfica e as regras de negócio da aplicação, que geralmente é feita em um programa desenvolvido sobre a ótica da orientação a objetos. Não poderiamos usar seu componente para validar a inscrição estadual apenas após termos feito algumas verificações sobre o preenchimento dos dados no formulário a validação sempre seria, obrigatoriamente, feita quando fosse selecionado um item no CoboBox, e não quando fosse mais apropriado para a aplicação.
Na minha opnião, há ainda um problema maior, já que se a sua ´propriedade´ aceita apenas ComboBox ou ListBox como componentes de entrada de dados, ele não poderia ser utilizado em uma aplicação que utiliza-se um componente que não fossem Combo/ListBox e seus descendentes, o que engessaria o desenvolvedor do aplicativo que utilizasse seu componente. Escrever um componente que aceitasse qualquer componente como componente de origem de dados, pelo simples motivo que a maioria dos componentes de interface com o usuário ainda não foram desenvolvidos.
E se ao invés de utilizar um componente visual eu quizesse usar um arquivo ou tabela de um BD como fonte de dados, e decidisse não passar os dados por nenhum componente visual, como poderia validar as inscrições que lá estão armazenadas.
Os componentes que fazem referência a um outro componente, como exemplo DataSources, tem a garantia de que os componentes que fazem acesso a banco de dados são sempre descendentes de TDataSet, que é um componente fantástico em sua concepção e abstração, o que gera descendentes que mantém essas características, componentes de interface gráfica geralmente não tem a mesma preocupação com tanto rigor em seus projetos e compromisso com com sua hierarquia, a própria VCL não mantém esse compromisso (problema já percebido por você através das outras respostas postadas), vamos supor que eu crie um grid de onde o usuário selecione a UF, eu não poderia utilizar seu componente.
Também sou desenvolvedor de componentes (desde 199...), a maior parte do meu trabalho é desenvolver componentes da área de computação gráfica, mais especificamente componentes de captura de imagens, usados principalmente por aplicativos utilizados por empresas de segurança e em softwares de administração de portarias (condomínios, empresas, ...), em minha pouca experiência como desenvolvedor de componentes, aprendi que na maioria dos casos a entrada e de dados, feitas em componentes externos, deve interfacear com nossos componentes através de uma propriedade simples (como exemplo: ´property UF: String read GetUF write SetUF´), ou métodos, chamados através de manipuladores de eventos desses componentes (de entrada de dados).
Como exemplo para seu componente, poderiamos usar o evento OnChange do ComboBox para escrever um manipulador para entrada do dado na propriedade do nosso componente ou chamar um método de validação do nosso componente:
no OnChange do ComboBox poderiamos digitar algo como:
NossoComponente.Validate(String selecionada no ComboBox/ListBox, String com o número da Inscrição a ser validada que poderia ter sido digitada em um edit);
ou ainda
NossoComponente.Inscricao(String com o número da Inscrição a ser validada talvez digitada em um edit);
NossoComponente.UF(String selecionada no ComboBox/ListBox);
NossoComponente.Validate;
para mim esse tipo de abordagem dá mais liberdade ao desenvolvedor que estará usando seu componente, por exemplo, suponhamos que um desenvolvedor queira fazer a validação no momento em que é escolhida a UF em um ComboBox e outro queira que a validação seja feita quando o usuário do sistema clique no botão OK do formulário de entrada/cadastro onde os dados estão sendo digitados, na sua abordagem a escolha do último desenvolvedor seria muito trabalhosa ou não seria possível já que com o ComboBox/ListBox acoplados ao seu componente, quando o usuário do sistema selecionasse a UF no Combo/ListBox, a validação seria feita automaticamente, enquanto que utilizando um método ou propriedades como as que eu citei acima bastaria colocar o seguinte código no OnClick do botão:
NossoComponente.Validate(String selecionada no ComboBox, String com o número da Inscrição a ser validade talvez digitada em um edit);
ou ainda
NossoComponente.Inscricao(String com o número da Inscrição a ser validade talvez digitada em um edit);
NossoComponente.UF(String selecionada no ComboBox);
NossoComponente.Validate;
Um outro problema seria o fato de seu componente dar a volta na separação entre a interface gráfica e as regras de negócio da aplicação, que geralmente é feita em um programa desenvolvido sobre a ótica da orientação a objetos. Não poderiamos usar seu componente para validar a inscrição estadual apenas após termos feito algumas verificações sobre o preenchimento dos dados no formulário a validação sempre seria, obrigatoriamente, feita quando fosse selecionado um item no CoboBox, e não quando fosse mais apropriado para a aplicação.
Na minha opnião, há ainda um problema maior, já que se a sua ´propriedade´ aceita apenas ComboBox ou ListBox como componentes de entrada de dados, ele não poderia ser utilizado em uma aplicação que utiliza-se um componente que não fossem Combo/ListBox e seus descendentes, o que engessaria o desenvolvedor do aplicativo que utilizasse seu componente. Escrever um componente que aceitasse qualquer componente como componente de origem de dados, pelo simples motivo que a maioria dos componentes de interface com o usuário ainda não foram desenvolvidos.
E se ao invés de utilizar um componente visual eu quizesse usar um arquivo ou tabela de um BD como fonte de dados, e decidisse não passar os dados por nenhum componente visual, como poderia validar as inscrições que lá estão armazenadas.
Os componentes que fazem referência a um outro componente, como exemplo DataSources, tem a garantia de que os componentes que fazem acesso a banco de dados são sempre descendentes de TDataSet, que é um componente fantástico em sua concepção e abstração, o que gera descendentes que mantém essas características, componentes de interface gráfica geralmente não tem a mesma preocupação com tanto rigor em seus projetos e compromisso com com sua hierarquia, a própria VCL não mantém esse compromisso (problema já percebido por você através das outras respostas postadas), vamos supor que eu crie um grid de onde o usuário selecione a UF, eu não poderia utilizar seu componente.
GOSTEI 0
Xandyr
06/05/2004
Caro colega, gostaria que tomasse o pequeno comentário e talvez sugestões feitas por mim no texto abaixo, como um conselho e não como critica.
Também sou desenvolvedor de componentes (desde 199...), a maior parte do meu trabalho é desenvolver componentes da área de computação gráfica, mais especificamente componentes de captura de imagens, usados principalmente por aplicativos utilizados por empresas de segurança e em softwares de administração de portarias (condomínios, empresas, ...), em minha pouca experiência como desenvolvedor de componentes, aprendi que na maioria dos casos a entrada e de dados, feitas em componentes externos, deve interfacear com nossos componentes através de uma propriedade simples (como exemplo: ´property UF: String read GetUF write SetUF´), ou métodos, chamados através de manipuladores de eventos desses componentes (de entrada de dados).
Como exemplo para seu componente, poderiamos usar o evento OnChange do ComboBox para escrever um manipulador para entrada do dado na propriedade do nosso componente ou chamar um método de validação do nosso componente:
no OnChange do ComboBox poderiamos digitar algo como:
NossoComponente.Validate(String selecionada no ComboBox/ListBox, String com o número da Inscrição a ser validada que poderia ter sido digitada em um edit);
ou ainda
NossoComponente.Inscricao(String com o número da Inscrição a ser validada talvez digitada em um edit);
NossoComponente.UF(String selecionada no ComboBox/ListBox);
NossoComponente.Validate;
para mim esse tipo de abordagem dá mais liberdade ao desenvolvedor que estará usando seu componente, por exemplo, suponhamos que um desenvolvedor queira fazer a validação no momento em que é escolhida a UF em um ComboBox e outro queira que a validação seja feita quando o usuário do sistema clique no botão OK do formulário de entrada/cadastro onde os dados estão sendo digitados, na sua abordagem a escolha do último desenvolvedor seria muito trabalhosa ou não seria possível já que com o ComboBox/ListBox acoplados ao seu componente, quando o usuário do sistema selecionasse a UF no Combo/ListBox, a validação seria feita automaticamente, enquanto que utilizando um método ou propriedades como as que eu citei acima bastaria colocar o seguinte código no OnClick do botão:
NossoComponente.Validate(String selecionada no ComboBox, String com o número da Inscrição a ser validade talvez digitada em um edit);
ou ainda
NossoComponente.Inscricao(String com o número da Inscrição a ser validade talvez digitada em um edit);
NossoComponente.UF(String selecionada no ComboBox);
NossoComponente.Validate;
Um outro problema seria o fato de seu componente dar a volta na separação entre a interface gráfica e as regras de negócio da aplicação, que geralmente é feita em um programa desenvolvido sobre a ótica da orientação a objetos. Não poderiamos usar seu componente para validar a inscrição estadual apenas após termos feito algumas verificações sobre o preenchimento dos dados no formulário a validação sempre seria, obrigatoriamente, feita quando fosse selecionado um item no CoboBox, e não quando fosse mais apropriado para a aplicação.
Na minha opnião, há ainda um problema maior, já que se a sua ´propriedade´ aceita apenas ComboBox ou ListBox como componentes de entrada de dados, ele não poderia ser utilizado em uma aplicação que utiliza-se um componente que não fossem Combo/ListBox e seus descendentes, o que engessaria o desenvolvedor do aplicativo que utilizasse seu componente. Escrever um componente que aceitasse qualquer componente como componente de origem de dados, pelo simples motivo que a maioria dos componentes de interface com o usuário ainda não foram desenvolvidos.
E se ao invés de utilizar um componente visual eu quizesse usar um arquivo ou tabela de um BD como fonte de dados, e decidisse não passar os dados por nenhum componente visual, como poderia validar as inscrições que lá estão armazenadas.
Os componentes que fazem referência a um outro componente, como exemplo DataSources, tem a garantia de que os componentes que fazem acesso a banco de dados são sempre descendentes de TDataSet, que é um componente fantástico em sua concepção e abstração, o que gera descendentes que mantém essas características, componentes de interface gráfica geralmente não tem a mesma preocupação com tanto rigor em seus projetos e compromisso com com sua hierarquia, a própria VCL não mantém esse compromisso (problema já percebido por você através das outras respostas postadas), vamos supor que eu crie um grid de onde o usuário selecione a UF, eu não poderia utilizar seu componente.
Caro colega, foi muito boa a sua colocação e por assim dizer ´preocupação´, porém só postei a pergunta sobre um tipo de propriedade que pretendo inserir e que seria [b:1caecbc9ab]usada como parâmetro para a validação[/b:1caecbc9ab], mas a validação não ocorreria quando o usuário seleciona-se um item, e sim, por se tratar de um componente DBEdit, quando o usuário, tentasse salvar no banco de dados a Insc. Estadual. Tb não seria o único método de acesso, existindo no componentes outra função para acesso a esse parâmetro. Foi colocado por vc tb que não poderia usar o meu componente fora de um contesto visual, o que está correto, por isso criei um biblioteca que faz a validação, sendo o componente apenas a casca, onde são digitados e exibidos os resultados, sendo assim, posso usar essa biblioteca e suas funções em qualquer componente ou aplicação. Então para quer criar um componente visual, simples, para facilitar, estou fazendo um sistema que tem 10 cadastros diferentes, sendo necessário em cada um a validação do I.E. então pq ficar digitando toda a vez as mesmas funções e criando eventos OnBeforePost. se eu pósso simplesmente inserir um componente que faça a validação?
GOSTEI 0
Chao_pa
06/05/2004
Caro colega, foi muito boa a sua colocação e por assim dizer ´preocupação´, porém só postei a pergunta sobre um tipo de propriedade que pretendo inserir e que seria [b:333ba237cf]usada como parâmetro para a validação[/b:333ba237cf], mas a validação não ocorreria quando o usuário seleciona-se um item, e sim, por se tratar de um componente DBEdit, quando o usuário, tentasse salvar no banco de dados a Insc. Estadual. Tb não seria o único método de acesso, existindo no componentes outra função para acesso a esse parâmetro. Foi colocado por vc tb que não poderia usar o meu componente fora de um contesto visual, o que está correto, por isso criei um biblioteca que faz a validação, sendo o componente apenas a casca, onde são digitados e exibidos os resultados, sendo assim, posso usar essa biblioteca e suas funções em qualquer componente ou aplicação. Então para quer criar um componente visual, simples, para facilitar, estou fazendo um sistema que tem 10 cadastros diferentes, sendo necessário em cada um a validação do I.E. então pq ficar digitando toda a vez as mesmas funções e criando eventos OnBeforePost. se eu pósso simplesmente inserir um componente que faça a validação?
É sempre bom ouvir pontos de vista diferentes, a minha opnião apenas reflete minhas necessidades de trabalho, onde procuro ser sempre o mais genérico possível visto que meus componentes são usados pelos mais diversos grupos de programadores, com as mais diversas necessidades, e uma das minhas constantes preocupações é nunca ser demasiadamente específico e construir componentes que façam apenas o que devem fazer e não mais.
Eu realmente nunca desenvolvi um componente tão específico, que fosse usado só por mim, dentro de um único contexto, mas posso citar, como exemplo, um componente que criei que exibia imagens capturadas de uma câmera de segurança em um janela personalizada e gravava a imagem em um banco de dados, alguns programadores queriam apenas um arquivo .jpg, não utilizariam BD, outros não queriam que a imagem fosse exibida em uma janela personalizada e sim em um simples panel, que já existiam em dezenas de softwares que já estavam desenvolvidos, ... e por aí afora.
Mais uma vez, minha intenção foi de apenas uma dar uma sugestão.
Obrigado pela compreensão e sucesso.
GOSTEI 0
Xandyr
06/05/2004
[quote:4b406ed3ed=´xandyr´]Caro colega, foi muito boa a sua colocação e por assim dizer ´preocupação´, porém só postei a pergunta sobre um tipo de propriedade que pretendo inserir e que seria [b:4b406ed3ed]usada como parâmetro para a validação[/b:4b406ed3ed], mas a validação não ocorreria quando o usuário seleciona-se um item, e sim, por se tratar de um componente DBEdit, quando o usuário, tentasse salvar no banco de dados a Insc. Estadual. Tb não seria o único método de acesso, existindo no componentes outra função para acesso a esse parâmetro. Foi colocado por vc tb que não poderia usar o meu componente fora de um contesto visual, o que está correto, por isso criei um biblioteca que faz a validação, sendo o componente apenas a casca, onde são digitados e exibidos os resultados, sendo assim, posso usar essa biblioteca e suas funções em qualquer componente ou aplicação. Então para quer criar um componente visual, simples, para facilitar, estou fazendo um sistema que tem 10 cadastros diferentes, sendo necessário em cada um a validação do I.E. então pq ficar digitando toda a vez as mesmas funções e criando eventos OnBeforePost. se eu pósso simplesmente inserir um componente que faça a validação?
É sempre bom ouvir pontos de vista diferentes, a minha opnião apenas reflete minhas necessidades de trabalho, onde procuro ser sempre o mais genérico possível visto que meus componentes são usados pelos mais diversos grupos de programadores, com as mais diversas necessidades, e uma das minhas constantes preocupações é nunca ser demasiadamente específico e construir componentes que façam apenas o que devem fazer e não mais.
Eu realmente nunca desenvolvi um componente tão específico, que fosse usado só por mim, dentro de um único contexto, mas posso citar, como exemplo, um componente que criei que exibia imagens capturadas de uma câmera de segurança em um janela personalizada e gravava a imagem em um banco de dados, alguns programadores queriam apenas um arquivo .jpg, não utilizariam BD, outros não queriam que a imagem fosse exibida em uma janela personalizada e sim em um simples panel, que já existiam em dezenas de softwares que já estavam desenvolvidos, ... e por aí afora.
Mais uma vez, minha intenção foi de apenas uma dar uma sugestão.
Obrigado pela compreensão e sucesso.[/quote:4b406ed3ed]
Entendo seu ponto de vista, e sou totalmente a favor, existem muitos componentes super específicos, por isso criei a biblioteca, que pode ser utilizada em qualquer contexto, até mesmo em programas não visuais. A implentação de um componente DBEdit, só vem a complementar a biblioteca, como não permitir que sejam digitados valores não numéricos e (exceto para SP) e impondo um limite do número de caracteres digitados conforme o UF (existem estados com 8, 9, 10, ... , 14 digitos, para IE). Se for necessério implementar uma validação fora do contesto do banco de dados, posso implementar um componente TEdit, ou simplesmente usar a biblioteca.
GOSTEI 0