Sobre procurar formulário...

Delphi

30/05/2005

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

Bruno Belchior

Curtidas 0

Respostas

Bruno Belchior

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

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.


GOSTEI 0
Massuda

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

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

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

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

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

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

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

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

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

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

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

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

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

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!


GOSTEI 0
Massuda

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

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

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

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
POSTAR