ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Problema com Matriz

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
mobius1qwe
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 8 de Dezembro de 2010
Mensagens: 146

MensagemEnviada: Seg Mai 22, 2017 3:45 pm    Assunto: Problema com Matriz Responder com Citação

Boa tarde pessoas
Queria criar uma matriz que vai gravar definições usadas no Application.CreateForm() e instanciar os forms a partir dessa matriz, por exemplo:
Código:
Matriz = ([TfPrincipal, fPrincipal]
         ,[TfDataModule, fDataModule]
         ,[TfForm2, fForm2]
         ,...
         )

E depois faria algo do tipo pra instanciar os forms
Código:
Application.CreateForm(Matriz[0][0], Matriz[0][1])

Pra ficar de uma forma mais elegante, essa matriz seria uma constante, que daí se precisasse alterar o código, eu só alteraria os valores da matriz e os forms continuariam sendo instanciados.

Preciso dessa funcionalidade porque estou criando o form dinamicamente e atribuindo o código de createform aos botões na tela, mas não queria instanciar 2 vetores (1 com a TComponentClass e outro com TVarReference) pra fazer esse código, gostaria de usar matriz, mas não consigo fazer funcionar, já tentei aplicar generics de várias formas mas não funciona.

Alguém tem alguma ideia?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Mai 22, 2017 4:17 pm    Assunto: Responder com Citação

Você pode fazer assim:

Código:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TReferencia = Record
    Classe: TComponentClass;
    Referencia: TForm;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Matriz: array of TReferencia;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Form2: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(Matriz[0].Classe, Matriz[0].Referencia);
  if Assigned(Matriz[0].Referencia) then
    Matriz[0].Referencia.ShowModal;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(Matriz, 1);
  Matriz[0].Classe := TComponentClass(Self.ClassType);
  Matriz[0].Referencia := Form2;
end;

end.


eu criei um record que vai armazenar a classe e a referência e depois criei um array desse record.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mobius1qwe
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 8 de Dezembro de 2010
Mensagens: 146

MensagemEnviada: Seg Mai 22, 2017 5:44 pm    Assunto: Responder com Citação

leo_cj escreveu:
type
TReferencia = Record
Classe: TComponentClass;
Referencia: TForm;
end;

Eu uso o Delphi XE10, esqueci de mencionar e to criando uma aplicação em FMX, não existe a declaração TComponentClass nele, deve ser outro nome.

leo_cj escreveu:

procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(Matriz, 1);
Matriz[0].Classe := TComponentClass(Self.ClassType);
Matriz[0].Referencia := Form2;
end;[/code]

Esse Self.ClassType não vai me servir, o form que instancia os outros não precisa ser indexado, ele vai criar os outros forms em tempo de execução, não sei se precisam estar declarados pra isso, mas isso eu testo depois

Pensei em utilizar registro mas queria uma solução mais flexível porque pretendo expandir o sistema pra aceitar forms via DLL.

Queria fazer uma atribuição de componente através do nome, no caso eu iria ler o conjunto de forms que iriam ser criados de um banco de dados, jogar numa matriz, porque são pares de dados, fazer alguns ajustes como largura, altura, etc., atribuir esse form a um botão que seria criado dinamicamente, o botão não iria existir no form, eu iria criar o botão e setar a criação do form no método onClick dele, tudo em tempo de execução, daí quando o form aparecesse na tela, clicava no botão e ele chamava a outra tela.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Mai 22, 2017 5:54 pm    Assunto: Responder com Citação

Como não tem o TComponentClass, você vai precisar ver o tipo esperado no CreateForm e substituir na declaração do record.

quanto ao Self.ClassType, eu utilizei o próprio form principal no preenchimento da matriz apenas como um exemplo de uso, no seu caso você preencheria os valores de acordo com a sua necessidade.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Mai 22, 2017 7:20 pm    Assunto: Responder com Citação

Podes dá uma olhada em TFmxObject.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Mai 23, 2017 11:43 am    Assunto: Responder com Citação

Fiz o teste abaixo e funcionou. Delphi XE5 e Firemonkey.

Código:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms,
  FMX.Dialogs, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    Matriz: array of array of string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TComponentClass(GetClass(Matriz[0][0])),
    TForm(Matriz[0][1]));

  if Assigned(TForm(Matriz[0][1])) then
    TForm(Matriz[0][1]).ShowModal;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(Matriz, 1,1);
  Matriz[0][0] := 'TForm2';
  Matriz[0][1] := 'Form2';
end;

end.


Você vai precisar registrar a classe em todos os forms filhos que serão chamados na matriz.

Exemplo, form filho Form2, coloque o código abaixo no final do Form2:

Código:
initialization
  RegisterClass(TForm2);

finalization
  UnRegisterClass(TForm2);

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Ter Mai 23, 2017 11:51 am    Assunto: Responder com Citação

natanbh1 escreveu:
Fiz o teste abaixo e funcionou. Delphi XE5 e Firemonkey.

Código:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms,
  FMX.Dialogs, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    Matriz: array of array of string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TComponentClass(GetClass(Matriz[0][0])),
    TForm(Matriz[0][1]));

  if Assigned(TForm(Matriz[0][1])) then
    TForm(Matriz[0][1]).ShowModal;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(Matriz, 1,1);
  Matriz[0][0] := 'TForm2';
  Matriz[0][1] := 'Form2';
end;

end.


Você vai precisar registrar a classe em todos os forms filhos que serão chamados na matriz.

Exemplo, form filho Form2, coloque o código abaixo no final do Form2:

Código:
initialization
  RegisterClass(TForm2);

finalization
  UnRegisterClass(TForm2);


Legal, não sabia que dava pra fazer desse jeito, ficou bem prático
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB