Array
(
)

propriedades obrigatorias no componente... Como eu faço?

Pjrm1470
   - 07 nov 2009

Não sei dizer se o que preciso é algo facil ou dificil de se fazer... Criei um componente onde o meu objeto tem uma propriedade que recebe um TTimer. Tentei fazer com que quando a aplicação fosse rodar ele verificasse se tivesse um TTimer atribuído ou não a propriedade. Se não tiver atribuído um TTimer, a aplicação fecha. Porém é o delphi que está sofrendo com isso.   | if not Assigned(FTimer) then | begin |   Exception.Create('Não é possível iniciar a Engine sem ter atribído um Timer.'+#13+ |                    'A aplicação será fechada!'); |   Application.Terminate; | end;   Quando eu coloco o componente TEngine (Meu componente que estou mencionando) Ele fecha o Delphi pois, o código acima está no Construtor do componente.   A minha idéia é fazer com que a aplicação criada com o meu componente so se execute se todas as propriedades obrigatórias do componente forem preenchidas. Alguem pode me dar uma luz de como eu posso impedir a aplicação de rodar caso as propriedades obrigatórias não estejam preenchidas!?

Jorge Abreu
   - 07 nov 2009

Boa tarde Plínio. Voce está fechando a aplicação inteira com a linha de instrução "Application.Terminate", quando na verdade pelo lógica, o ideal seria apenas remover o seu componente da memória, isto pois voce não só colocaria este componente na aplicação para que a aplicação toda dependesse somente dele, faria ??? O código mais viável. #Código

   
   if not Assigned(FTimer) then
   begin
       Exception.Create('Não é possível iniciar a Engine sem ter atribído um Timer.'+#13+
                     'A aplicação será fechada!');
       FreeAndNil(Self);
   end;
  Agora é claro, que se voce pretende reutilizar o componente dentro de sua aplicação, não se esqueça de testá-lo se o mesmo está ou não na memória, e a em caso de não estiver, instanciá-lo novamente. 

Pjrm1470
   - 07 nov 2009

Boa tarde Jorge. Acho que você entendeu errado a minha questão quando eu perguntei: Alguem pode me dar uma luz de como eu posso impedir a aplicação de rodar caso as propriedades obrigatórias não estejam preenchidas!?   A minha intenção não é remover meu componente da aplicação, mas sim impossibilitar que a aplicação rode caso não tenha valor a propriedade.   Se antes de rodar a aplicação alguem não jogou valor na propriedade, na execução da aplicação, o componente verifica (pelo menos é o que eu quero) se ha valor, se há... Permite o programa continuar rodando, senão fecha a aplicação.   Não é FreeAndNil que eu qro. Gostaria de saber como posso fazer para pegar a execução do programa e fazer essa verificação. Em momento algum meu componente pode ser liberado da memoria.   Att, Plínio.

Jorge Abreu
   - 07 nov 2009

Boa tarde Plínio. Sinceramente não entendi mesmo o que voce pretende fazer. Quando voce diz: A minha intenção não é remover meu componente da aplicação, mas sim impossibilitar que a aplicação rode caso não tenha valor a propriedade. Então eu presumo que essa aplicação vai rodar dentro de outra aplicação e lá dentro voce configura seus atributos ?????? Como voce espera configurar propriedades e atributos sem que o objeto ou aplicação esteja instanciado em memória ????? Existe um meio de voce passar valores String para dentro de uma aplicação executável através do prompt do DOS, assim       Entrentanto essa passagem de parâmetro só é permitida se for do tipo String. Dentro da Aplicação voce pega os valores assim:   Na verdade, o que eu quero dizer e lhe fazer entender, que quando voce roda uma aplicação, esta já tem que está com seus atributos (Propriedades) já configurados no momento em que a aplicação é criada, ou pelo menos permitir que o usuário set (configure) a aplicação em tempo de execução, mas para isso o mesma tem que rodar no primeiro momento em que ela (Aplicação) esteja na memória, senão como vai poder configurar os atributos.         

Pjrm1470
   - 10 nov 2009

Tá vamos por parte.   Não é a aplicação que quero disponibilizar, mas sim meus componentes. Suponha que você crie um componente simples. | TMeuCompo = Class(TComponente) | private |   FNome: String; | public |   property Nome: String read FNome write FNome; | end;   Esse componente você quer disponibilizar para as pessoas utilizarem ele, porem o componente so permitirá o aplicativo ao qual for colocado, executar... Se a sua propriedade Nome Estiver com valor diferente de Nulo ou de EmptyStr.   O exemplo que você deu é: Ao colocar o componente no aplicativo, vc definifiu no OnShow (ou poderia ter sido no OnCreate) que se TMeuCompo.Nome = EmptyStr, então Application.Terminate;. Porém não é isso. Não é o usuário definir manualmente esse fechamento, até porque ninguem fará isso. Imagina eu colocar na minha página: "Ao usar meus componentes favor colocar no OnCreate de sua aplicação a verificação: if Trim(TMeuCompo.Nome) = EmptyStr then begin   ShowMessage('A propriedade Nome é obrigatória para que seja usado o componente TMeuCompo');   Application.Terminate; end;" Minha pagina e eu seria muito bem criticada. "Porque eu faria isso? quero utilizar o componente. Ele que deveria ter feito isso dentro do componente. dah. rsrs". Entende?   Talvez haja uma mensagem que é enviada quando é dado o comando de criação. Não sei qual é, se é WM_ ou CM_ mas se der pra capturar a mensagem poderia colocar no componente para que quando alguem que estiver usando meu componente... na hora de rodar a aplicação, o componente que disponibilizei verificar se a propriedade está com algum valor diferente de vazio.   Att, Plínio.

Jorge Abreu
   - 11 nov 2009

Boa noite Plínio

Entendi mais ou menos, entrentanto vamos ver se consigo te ajudar.  Quando voce está em tempo de projeto, no momento em que voce arrasta um componente da palheta de Componentes para dentro do form, dessa forma:   esse componente cria um instância dentro do form e na parte publicada da classe TForm1, desse jeito:       Inicialmente voce pode configurar dentro do seu componente um método que verifica se todas as suas propriedades estão nulas ou não, então esse método será um function que retorna um valor boolean, assim:     Repare que eu defini as propriedades Nome e Time, que vão acessar as variáveis encapsuladas FNome e FTime na parte Published (Desta vez declarada), isto porque se voce estiver criando um componente de palheta, estas propriedades além de estarem públicas podem ser acessadas no Object Inspector, permitindo assim ser configurada as propriedades dos componentes em tempo de projeto também no Object Inspector.   Agora dentro da Aplicação, ainda em tempo de projeto, quando o componente for arrastado, no Evento OnCreate da Aplicação, voce invoca o método IsSetFullProperty, dessa forma:     Isto é, se o seu componente foi arrastado ou pelo menos instanciando em uma das seções da classe da aplicação, assim:       Dica importante: nunca invoque Application.Terminate de dentro de um componente, pois voce pode correr o risco de quando estiver definindo o componente em tempo de projeto, de fechar o Delphi.   Espero ter te ajudado.   O Senhor é meu Pastor e nada me faltará. (Sl 23:01)