Ir para conteúdo
Fórum Script Brasil
  • 0

[DELPHI/AJUDA] Como Acessar uma Procedure Localizada em um Form Criado


ClausRT

Pergunta

Olá, essa é a minha primeira postagem nesse fórum (além de ser o terceiro em que pergunto) e peço desculpas por qualquer erro que eu esteja cometendo.
Sou iniciante em programação orientada a objetos, estudando à apenas seis meses a IDE Delphi 7 em meu curso. Estou a 3 dias do termino do prazo final do trabalho que conclui essa matéria e boa parte de meu projeto está pronto, mas emperrei em um ponto do qual eu não sei o que fazer.
A ideia do meu projeto é o gerenciamento de fichas e anotações para se jogar RPG (Role Playing Game) de mesa. O programa principal cria, conforme um registro é carregado ou um formulário para se criar um novo registro é chamado, dinamicamente abas contendo o formulário que será usado. Eu já desenvolvi uma procedure para salvar os dados do formulario no aquivo que eu determinei como "banco de dados" para esse tipo de registro e outra procedure para se abrir um registro - que foi bem simples depois de pensar algumas horas.
Como eu executo essa procedure de salvamento ou como eu crio uma que ache os componentes dentro desse formulário dinâmico?
Aqui vão as procedures citadas.
//Função de abertura de registro/aba
 
//No caso J_Principal é meu Main Form, Campanha é meu registro e PC_Area_de_Trabalho é o PageControl onde as abas que são criadas dinamicamente ficam localizadas
procedure TJ_Principal.AbrirCampanha (C : String);
 
var
  Tab : TTabSheet;
  Form : TJ_Campanha;
 
begin
 
  Tab := TTabSheet.Create(Self);
  Form := TJ_Campanha.Create(Tab);
 
  Seek(ArqCam, 0);
 
  while (not EoF(ArqCam)) do
  begin
 
    Read(ArqCam, Campanha);
 
    if (C = Campanha.Titulo) then
    begin
 
      Seek(ArqCam, FilePos(ArqCam) -1);
      Break;
 
    end;
 
  end;
 
  if (AbaExiste(Campanha.Titulo)) then
  begin
 
    FreeAndNil(Tab);
    Exit;
 
  end;
 
  with Tab do
  begin
 
    PageControl := PC_Area_de_Trabalho;
    Caption := Campanha.Titulo;
    ImageIndex := 1;
 
  end;
 
  with Form do
  begin
 
    Align := alClient;
    BorderStyle := bsNone;
    Parent := Tab;
 
    L_Cria_Mod.Caption := 'Criado por: ' + Campanha.Criador + ' em: '  +
                           DateToStr(Campanha.DataDeCriacao) +
                          '  Modificado em: ' + DateToStr(Campanha.DataDeModificacao);
 
    E_Nome.Text := Campanha.Titulo;
    M_Resumo.Text := Campanha.Resumo;
    M_Detalhes.Text := Campanha.Detalhes;
 
    if (Campanha.Permissao) then
      Form.RP_Permissao.ItemIndex := 1
    else
      Form.RP_Permissao.ItemIndex := 0;
 
    Show;
  end;
 
  PC_Area_de_Trabalho.ActivePage := Tab;
end;
//Aqui a procedure padrão para se criar uma nova aba (Um formulario, no sentido literal, não de Form, onde é preenchido os dados que irão ser salvos em Registro)
procedure TJ_Principal.CriarAba (F : TFormClass);
var
 
  Tab : TTabSheet;
  Form : TForm;
  Tag : Integer;
 
begin
  Tab := TTabSheet.Create(Self);
  Form := F.Create(Tab);
 
  if (F = TJ_Campanha) then Tag := 1 else
  if (F = TJ_Aventura) then Tag := 2 else
  if (F = TJ_Cena) then Tag := 3
  else  Tag := 0;
 
 
 
  Case (Tag) of
    1 : Form.Caption := 'Novo - Campanha *';
    2 : Form.Caption := 'Novo - Aventura *';
    3 : Form.Caption := 'Novo - Cena *';
    4 : Form.Caption := 'Novo - Personagem *';
    5 : Form.Caption := 'Novo - Raça *';
    6 : Form.Caption := 'Novo - Classes *';
    7 : Form.Caption := 'Novo - Habilidade *';
    8 : Form.Caption := 'Novo - Item *';
  end;
 
  if (AbaExiste(Form.Caption)) then
  begin
    FreeAndNil(Tab);
    Exit;
  end;
 
  with Tab do
  begin
    PageControl := PC_Area_de_Trabalho;
    Caption := Form.Caption;
    ImageIndex := Tag;
  end;
 
  with Form do
  begin
    Align := alClient;
    BorderStyle := bsNone;
    Parent := Tab;
    //Name := 'Nome'; //Só coloquei isso pois minha ultima tentativa mal sucedida era usar o Application.FindCOmponent('Nome'), porém meu teste não funcionou v.v
    Show;
  end;
 
  PC_Area_de_Trabalho.ActivePage := Tab;
end;
//Função que verifica se já existe alguma aba igual já aberta
function TJ_Principal.AbaExiste(NomeAba: string): Boolean;
var
  I : Integer;
  Aba : TTabSheet;
begin
  Result := False;
 
  for I := 0 to PC_Area_de_Trabalho.PageCount - 1 do
  begin
    if ((PC_Area_de_Trabalho.Pages[I].Caption = NomeAba) or
    (PC_Area_de_Trabalho.Pages[I].Caption = ('*' + NomeAba))) then
    begin
      Aba := PC_Area_de_Trabalho.Pages[I];
      PC_Area_de_Trabalho.ActivePage := Aba;
      Result := True;
      Break;
    end;
  end;
end;
//Esse é a unica Procedure que não está localizada no Main Form
//Processo que salva os dados preenchidos em um Form préviamente aberto com CriaAba.
//Funciona perfeitamente se tiver um botão dentro do formulário que o ative, mas o Main Form(J_Principal) não consegue acessa-lo, pois como é criado dinamicamente
//e se tem mais de um tipo de form TJ_Campanha aberto, ele não sabe para qual eu estou me referindo.
procedure TJ_Campanha.SalvarArquivo;
var
  I : Integer;
begin
  I := 1;
  Seek(ArqCam, 0);
 
  while (not EoF(ArqCam)) do
  begin
    Read(ArqCam, Campanha);
 
    if (Self.E_Nome.Text = Campanha.Titulo) then
 
      if (MessageDlg('Já existe um registro com esse nome, deseja salvar mesmo assim?'
          + #13 + 'Caso SIM, ambos os registros serão mantidos.', mtConfirmation,
          [mbYes, mbNo], 0) = mrYes) then
 
      begin
        Seek (ArqCam, 0);
 
        while(not EoF(ArqCam)) do
        begin
          Read(ArqCam, Campanha);
          if (Campanha.Titulo = Self.E_Nome.Text + IntToStr(I)) then
          begin
            Inc(I);
            Seek(ArqCam, 0);
          end;
        end;
 
        E_Nome.Text := E_Nome.Text + IntToStr(I);
        Break;
      end
      else
        Exit;
  end;
 
  with Campanha do
  begin
    Criador := Usuario.Nome;
    DataDeCriacao := Date + Time;
    DataDeModificacao := Date + Time;
    Titulo := E_Nome.Text;
    Resumo := M_Resumo.Text;
    Detalhes := M_Detalhes.Text;
 
    if (RP_Permissao.ItemIndex = 0) then
      Permissao := False
    else
      Permissao := True;
 
    for I := 1 to Self.LB_PJogaveis.Count do //O que é essa propriedade ItemHeight???
      PJ[I] := Copy(Self.LB_PJogaveis.Items[I-1], 0, Pos('  ', Self.LB_PJogaveis.Items[I-1]));
 
    for I := 1 to Self.LB_PNJogaveis.Count do
      PnJ[I] := Copy(Self.LB_PNJogaveis.Items[I-1], 0, Pos('  ', Self.LB_PNJogaveis.Items[I-1]));
 
    for I := 1 to Self.LB_AventurasEscolhidas.Count do
      Aventuras[I] := Copy(Self.LB_AventurasEscolhidas.Items[I-1], 0, Pos('  ', Self.LB_AventurasEscolhidas.Items[I-1]));
  end;
 
  Write(ArqCam, Campanha);
  J_Principal.PC_Area_de_Trabalho.ActivePage.Caption := Campanha.Titulo;
end;
Todo esse código foi desenvolvido por mim, ao longo de dois dias com a ajuda desses links aqui:
http://lucianopimenta.com/post.aspx?id=171- Que utilizou a abertura em abas para fazer um Navegador
http://www.devmedia.com.br/websys.5/webreader.asp?cat=3&artigo=1907&revista=clubedelphi_110#a-1907- Inicialmente eu iria usar essa classe, mas ela se demonstrou incompativel com a minha IDE por motivos desconhecidos.
Eu meio que estou desesperado. Se alguém tiver alguma ideia de como eu devo proceder a partir de agora, eu agradeço. Se algo ficou mal explicado, me desculpem, pois estou morrendo de sono, mas perguntem por que eu tento me explicar de novo com outras palavras.
Desde já, agradeço.
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

exemplo:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure SalvarArquivo;
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.SalvarArquivo;
begin
   showmessage ('procedure SalvarArquivo');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   form2.showmodal;
end;

end.
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

uses Unit1;

procedure TForm2.Button1Click(Sender: TObject);
begin
   Form1.SalvarArquivo;
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Você não compreendeu o meu problema, mas obrigado por tentar ajudar.

A questão é que, por exemplo, eu tenho um Form T_Campanha, quando o usuario for criar uma nova Campanha ou for abrir uma Campanha já existente o programa cria um Form desse tipo dinamicamente em uma aba (o TabSheet também é criado dinamicamente no seu PageControl). Vai ter mais de um Form/aba do mesmo tipo, mas com conteúdo diferente e o programa deve trabalhar assim. Como eu vou fazer com que um botão no Form Principal ative a função de Salvar dentro da aba/form ativo no momento (PageControl1.ActivePage) OU como acessar os objetos internos a essa aba/form para a função estar localizada direto no Main Form???

Link para o comentário
Compartilhar em outros sites

  • 0

o TabSheet tem um indice ( PageIndex )... voce pode acessa-lo por esse indice

da mesma forma que voce cria dinamicamente o TabSheet, voce pode criar tambem um botão ( com o código e chamar uma procedure do form principal )

basta fazer a referencia a unit no form que cria os tabsheets

para acessar os componentes internos do tabsheet, veja esse link

https://books.google.com.br/books?id=dJaBlpUphB0C&pg=PA206&lpg=PA206&dq=listar+todos+os+componentes+de+um+tabsheet+delphi&source=bl&ots=EM1tTGii-G&sig=W2sUOUSQ-7d5ZbHK7NnKcSV-jic&hl=pt-BR&sa=X&ei=wiiWVOHdBaK1sQTI6oGwCQ&ved=0CGoQ6AEwCQ#v=onepage&q=listar%20todos%20os%20componentes%20de%20um%20tabsheet%20delphi&f=false

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...