Pergunta

Para evitar singletons e variáveis ??globais que eu gostaria de ser capaz de passar parâmetros para um componente TFrame. Contudo, desde a TFrame normalmente está incluído no formulário em tempo de design que só é possível usar o construtor padrão.

O formulário pai pode, naturalmente, definir algumas propriedades no retorno de chamada OnCreate depois da TFrame foi criado. No entanto isso não garante que uma propriedade não é esquecido, e as dependências não são tão claras como a utilização de um construtor.

Uma boa maneira seria se fosse possível registar uma fábrica para a criação de componentes enquanto o arquivo DFM está sendo lido. Em seguida, os parâmetros necessários podem ser passados ??para o construtor TFrame quando criado pela fábrica. Existe uma maneira de fazer isso?

Ou alguém tem uma solução melhor sobre como passar parâmetros para um TFrame?

Foi útil?

Solução

Todos os componentes, incluindo descendentes de TFrame, precisa ser capaz de ser construído usando o construtor herdado de TComponent. Caso contrário, eles não podem ser usados ??corretamente em tempo de design. Se a restrição do uso de tempo de design é aceitável para você, então você poderia substituir esse construtor e gerar uma exceção. Isso impediria a componente de ser colocado em um formulário em tempo de design. Basta fornecer algum outro construtor que requer outros parâmetros.

Por causa da exigência de tempo de design, todos os componentes precisam ser capazes de existir com algumas ou todas as suas propriedades ainda em seus valores padrão. Isso não significa que os componentes têm que fazer coisas úteis enquanto eles estão nesse estado, mas eles precisam ser capazes de permanecer nesse estado indefinidamente. Deve ser OK, por exemplo, para colocar um componente em um formulário, salve o formulário, e perto Delphi, com a intenção de retomar a forma-design em um momento posterior. O componente deve permitir-se ser salvos e restaurados, mesmo se todas as suas propriedades não foram criados para utilização final ainda.

A minha opção preferida é fazer cumprir as regras do componente apenas em tempo de execução. Verifique se todas as propriedades estão definidas para valores sensíveis antes de permitir que eles sejam usados. Você pode usar afirmações para impor a utilização adequada de seus componentes. Os consumidores de suas classes vai aprender muito rapidamente se não tiver terminado a criação de seus componentes em suas formas.

Outras dicas

Eu normalmente adicionar um público, não-virtual "Inicializar" ou (Inicializar para os americanos) procedimento que exige que todos os parâmetros a serem prestados. Este, então, definir as propriedades.

Faça as propriedades protegido ou privado, se possível, de modo a única maneira que pode ser definido é de chamar Inicializar (AFoo, Abar: integer).

Então, em TFormXXX.FormCreate ou TformXXX.Create, tem-se:

inherited;
Initialise(foo, bar);

você poderia criar / registercomponent seu próprio componente TFrame e lugar que no formulário -. é criar poderia ter nada passado para ele

Se uma fábrica poderia fornecer os parâmetros que você precisa, por que você não apenas substituir o construtor padrão para o seu quadro, e pedir a fábrica de classe para os parâmetros?

Eu costumo fazer o meu próprio construtor. Eu não gosto de criar quadros em designtime de qualquer maneira.

a) um quadro pode ser criada dinamicamente quando necessário e destruídos quando não for necessário

b) dar o quadro uma propriedade do público com o tipo de dados de parâmetro ou uma estrutura de dados e transmitir os valores para a forma por meio da propriedade.

Exemplo:
TAddress - uma classe para manter os elementos habituais de um endereço
. TAddressFra - um quadro com os controles visuais para exibir o endereço

  • preencher uma instância de TAddress com valores
  • criar uma instância de TAddressFra
  • atribuir a propriedade TAddressFra.address com a instância TAddress
  • usar o procedimento setAddress(o_address : TAddress) para atribuir os valores dos atributos TAddress para os componentes visuais correspondentes na TAddressFra
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top