Sobre procurar formulário...
pessoal como procurar por um formulário no projeto...? mas apenas um formulário e não um TComponent... tipo algo que passo o seu nome e ele me retorna uma classe ou algo similar...
Bruno Belchior
Curtidas 0
Respostas
Bruno Belchior
30/05/2005
Pela variável global [b:c0d0dbf4f1]Screen[/b:c0d0dbf4f1] eu acesso a propriedade [b:c0d0dbf4f1]CustomForms[/b:c0d0dbf4f1] varrendo isso usando [b:c0d0dbf4f1]CustomFormsCount[/b:c0d0dbf4f1] o delphi varerrá apenas os Formulários ou todos os componentes contidos nele também?
GOSTEI 0
Renatosilva
30/05/2005
Bruno, Application tem uma propriedade que é um array dos forms da aplicação. Você poderia criar uma classe com o mesmo array como propriedade só que indexado pelo nome como você quer (o Application não tem isso), no entanto não sei como fazer, é como acessar campos em TTable assim: tblCustomer[´CustName´] := ´Obi-Wan Kenobi´.
Ou poderia criar uma função que percorresse o array e comparasse com o nome desejado, tendo um desempenho inferior do que a propriedade indexada. Pesquise a respeito, qualquer coisa poste.
Ou poderia criar uma função que percorresse o array e comparasse com o nome desejado, tendo um desempenho inferior do que a propriedade indexada. Pesquise a respeito, qualquer coisa poste.
GOSTEI 0
Massuda
30/05/2005
Pela variável global [b:afa56172b3]Screen[/b:afa56172b3] eu acesso a propriedade [b:afa56172b3]CustomForms[/b:afa56172b3] varrendo isso usando [b:afa56172b3]CustomFormsCount[/b:afa56172b3] o delphi varerrá apenas os Formulários ou todos os componentes contidos nele também?
Apenas os forms. A lista é uma lista de forms, não componentes... para cada item (form) na lista, você pode utilizar a lista Controls ou Components para acessar os componentes contidos no form....tipo algo que passo o seu nome e ele me retorna uma classe ou algo similar...
Isso só vai funcionar para forms que já tenham sido criados e estejam em uso. Não funcionará para forms que ainda não foram criados.GOSTEI 0
Bruno Belchior
30/05/2005
Application tem uma propriedade que é um array dos forms da aplicação
mas que propriedade é essa?GOSTEI 0
Bruno Belchior
30/05/2005
na verdade eu precizo acessar todos os formulários e saber se eles derivam de uma determinada classe...
GOSTEI 0
Massuda
30/05/2005
na verdade eu precizo acessar todos os formulários e saber se eles derivam de uma determinada classe...
Acho que isso funcionaria...for I := 0 to Screen.FormCount-1 do begin if Screen.Forms[I] is TMinhaClasseEspecial then begin // deriva da minha classe especial end; end;
GOSTEI 0
Bruno Belchior
30/05/2005
é exatamente isso que estou fazendo só que precizo de todos os forms (inclusive os que não foram criados)...
GOSTEI 0
Massuda
30/05/2005
é exatamente isso que estou fazendo só que precizo de todos os forms (inclusive os que não foram criados)...
A arquitetura do seu programa precisa realmente disso? Isso só funciona baseado no conhecimento de como o Delphi gera os aplicativos.Basicamente, você precisa analisar o arquivo do seu executável e parsear os resources RCDATA embutidos nele (note que nem todos os resources RCDATA são necessariamente forms). Se seu programa utilizar forms em DLLs/BPLs, estas também terão de ser analisadas. Se eu encontrar um exemplo simples disso posto aqui.
GOSTEI 0
Bruno Belchior
30/05/2005
na verdade estou trabalhando em um componente que precizo de algo que verifique todos os formulários da aplicação...
GOSTEI 0
Renatosilva
30/05/2005
Ih cara confundi. A propriedade é Application.MainForm.MDIChildren mas é só para aplicações MDI. Mas tem uma parada maneira que pode ser o que você quer:
procedure TForm1.Button1Click(Sender: TObject); var Component: TCOmponent; begin Component := Application.FindComponent(´Formd1´); if Component = nil then ShowMessage(´Oh God! Not found!´) else if Component is TForm then Showmessage(´Oh found a form´); end;
GOSTEI 0
Massuda
30/05/2005
na verdade estou trabalhando em um componente que precizo de algo que verifique todos os formulários da aplicação...
Fiquei sem entender se você precisa fazer isso em runtime ou design time... Em runtime, a única forma é a que postei antes.Em design time, acho que daria para analisar o uses do DPR do projeto, mas não faço idéia de como você poderia analisar se um determinado form é derivada de uma determinada classe. Note que você pode ter linkado no seu programa forms em units que não estão no uses do DPR, mas estão no uses de alguma unit do projeto.
GOSTEI 0
Renatosilva
30/05/2005
como você poderia analisar se um determinado form é derivada de uma determinada classe.
if Variable is TFormSubClass then...
GOSTEI 0
Bruno Belchior
30/05/2005
é um componente que usa a idéia do usercontrol ele adiciona vários itens em um coleção em design time... porém gostaria que no loaded do componente ele verificasse todos os formulários descendentes de um formulário de cadastro meu e então sem ter que inserir manualmente ele já inseriria esses itens altomático...
GOSTEI 0
Bruno Belchior
30/05/2005
[b:cc54649578]renato3110[/b:cc54649578], não gostaria de usar [b:cc54649578]FindComponent[/b:cc54649578] pq imagine só qts componentes vou ter em um grande projeto então gostaria de varrer por formulários mesmo...
GOSTEI 0
Bruno Belchior
30/05/2005
e outra coisa o método [b:824a6d9910]FindComponent[/b:824a6d9910] só procura por componentes que são criados passando como seu proprietário o Application...
GOSTEI 0
Renatosilva
30/05/2005
Acho que você não entendeu o código que postei. Ele pega apenas os forms, é só adaptar à sua necessidade! Tá, pode ter outros objetos que não TForm tendo Application como owner, mas que eu saiba isso não é normal e só acontece quando você explicitamente faz isso!!
Outra coisa: como você quer modificar forms que ainda não foram criados? Isso não tem sentido!
Outra coisa: como você quer modificar forms que ainda não foram criados? Isso não tem sentido!
GOSTEI 0
Massuda
30/05/2005
Outra coisa: como você quer modificar forms que ainda não foram criados? Isso não tem sentido!
Se eu entendi direito, o que o Bruno tem é um componente que em design time precisa obter a lista dos forms utilizados no projeto para determinar quais forms são herdados de uma determinada classe, ou seja, nenhum form do projeto foi criado ainda, simplesmente porque estamos executando dentro da IDE do Delphi.GOSTEI 0
Bruno Belchior
30/05/2005
não quero modificar apenas verificar se eles descendem de um determinado formulário... porém com certeza isso daria um erro pois gostaria também de pegar a propriedade name e caption do formulário... agora pergunto como pegar isso direto dos resourses do .exe, não achei praticamente nada sobre isso...
GOSTEI 0
Bruno Belchior
30/05/2005
Se eu entendi direito, o que o Bruno tem é um componente que em design time precisa obter a lista dos forms utilizados no projeto para determinar quais forms são herdados de uma determinada classe
Na verdade é em Run Time... pra ser mais precizo no [b:8363f460fe]Loaded[/b:8363f460fe] do component...GOSTEI 0
Massuda
30/05/2005
...como pegar isso direto dos resourses do .exe, não achei praticamente nada sobre isso...
Se eu conseguir achar um exemplo simples em casa, posto aqui.GOSTEI 0