Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ilano

Eventos em componentes criados em tempo de execução

Recommended Posts

Olá pessoal,

Ainda uso o Delphi 7. Desenvolvi um pequeno gerenciador de SQL onde posso construir e rodar minhas instruções SQLs. Quem quiser ver o vídeo da ferramenta já pode ser vista aqui, mas estou querendo melhorá-la e preciso atribui evento a componentes criados em tempo de execução. Estes componentes são criados dentro de TabSheets que também são criados em tempo de execução. Um desses eventos segue descrito abaixo. Sei que vou precisar fazer grandes mudanças na ferramenta, mas preciso torná-la melhor.

procedure TFrmMenuPrincipal.CriarNovaAba;
Var
P : Integer;
abas : TAdvTabSheet;
pMemoSQL : TAdvMemo;
begin
P:=AdvPageControl2.PageCount + 1;
abas:=TAdvTabSheet.Create(AdvPageControl2);
abas.Caption:='SQL ' + IntToStr(P);
abas.Name:='tabSQL' + IntToStr(P);
abas.AdvPageControl:=AdvPageControl2;
pMemoSQL:=TAdvMemo.Create(Self);
pMemoSQL.Parent:=abas;
pMemoSQL.Lines.Clear;
pMemoSQL.Name:='TxtSQL' + IntToStr(P);
pMemoSQL.Align:=alClient;
pMemoSQL.SyntaxStyles:=AdvSQLMemoStyler1;
pMemoSQL.AutoExpand:=False;
end;

O que estou precisando? Preciso inserir o código abaixo no evento OnKeyDown desses Memos:

procedure TFrmMenuPrincipal.TxtSQLKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If (Key = VK_SPACE) AND (GetKeyState(VK_CONTROL) < 0) Then
Begin
SalvarSQLAtual;
Application.CreateForm(TFrmAutocompletar, FrmAutocompletar);
FrmAutocompletar.pMemo:=TxtSQL;
FrmAutocompletar.pMStyler:=AdvSQLMemoStyler1;
FrmAutocompletar.p1:=TxtSQL.SelEndY;
FrmAutocompletar.p2:=TxtSQL.SelEndX;
FrmAutocompletar.ShowModal;
End
Else
If Key = VK_F3 Then
Begin
If Trim(TxtSQL.Selection) <> '' Then
GuardarSQLTemporaria;
End;
end;

Alguém poderia me ajudar?

Grato,

Ilano.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma procedure para executar estes comandos.

Em private, adicione

procedure TxtSQLKeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

Aperte CTRL+SHIT+T para criar o procedimento.

Para modificar um evento de um componente criado em tempo de execução, é necessario a modificação de evento esteja sendo efetuada no procedimento para criar o objeto.

Modificar evento em tempo de criação de objeto:

Nomedavariavel.NomedoEvento:= ProcedureDeEvento.

Ou no seu caso:

pMemoSQL.OnKeyDown:= TxtSQLKeyDown;

Codigo completo:

 pMemoSQL:=TAdvMemo.Create(Self);
 with pMemoSQL do
  begin   
   Parent:=abas;
   Lines.Clear;
   Name:='TxtSQL' + IntToStr(P);
   Align:=alClient;
   SyntaxStyles:=AdvSQLMemoStyler1;
   AutoExpand:=False;
   OnKeyDown:= TxtSQLKeyDown;
  end

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá SBits,

Cara, a criação dos memos deu certo. Onde está pegando agora? Não sei se você assistiu ao vídeo, mas ainda exitem algumas dúvidas para resolver de vez a aplicação, que são as seguintes:

1. Tenho duas grids que possuem as tabelas da base e outra os campos das tabelas. Ao dar dois cliques numa dessas grids como faço para que estas informações sejam enviadas para o memo ativo?

2. Para executar uma sentença SQL, seleciono a sentença desejada, pois num memo posso criar vários SQLs, e teclo F5. Como faço para que isso seja interpretado pelo sistema alternando entre as abas, ou seja, entre os memos?

3; Tenho um formulário que traz outras SQLs guardadas em banco, como faço para, ao clicar no botão COPIAR, essa instrução SQL ser levada para o memo ativo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, o que está faltando, praticamente, é só o sistema identificar qual dos memos de cada aba está ativo. Por exemplo:

Criei, dinamicamente, 3 abas, cada uma com um memo. Quando eu crio um memo, minha variável está como Memo3 mas, quando eu voltar para o Memo2 ou Memo1, quero que o sistema entenda que estou em um desses memos. Ou seja, quero que ao clicar no botão Executar SQL ele entenda que está se tratando de um dos memos criados anteriormente e não do último. Não sei se fui bem claro, caso não é falar que tento me explicar novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, eu só preciso fazer que, no evento OnShow de cada aba (TAdvTabSheet) o pMemoSQL seja igual ao TxtSQL(X), tipo:

Ao ativar a aba 1, o comando TxtSQLKeyDown entenda que será executado o TxtSQL1;

Ao ativar a aba 2, o comando TxtSQLKeyDown entenda que será executado o TxtSQL2;

Ao ativar a aba 3, o comando TxtSQLKeyDown entenda que será executado o TxtSQL3;

E assim sucessivamente.

No comando TxtSQLKeyDown que se segue, o TxtSQL deverá entende qual deles será executado, pois no momento, só está executando o último TAdvMemo (TxtSQL) criado:

procedure TFrmMenuPrincipal.TxtSQLKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);
begin
If (Key = VK_SPACE) AND (GetKeyState(VK_CONTROL) < 0) Then
Begin
SalvarSQLAtual;
Application.CreateForm(TFrmAutocompletar, FrmAutocompletar);
FrmAutocompletar.pMemo:=TxtSQL;
FrmAutocompletar.pMStyler:=AdvSQLMemoStyler1;
FrmAutocompletar.p1:=TxtSQL.SelEndY;
FrmAutocompletar.p2:=TxtSQL.SelEndX;
FrmAutocompletar.ShowModal;
End
Else
If Key = VK_F3 Then
Begin
If Trim(TxtSQL.Selection) <> '' Then
GuardarSQLTemporaria;
End;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.