Ilano 0 Denunciar post Postado Setembro 20, 2016 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
SBits 1 Denunciar post Postado Setembro 22, 2016 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
Ilano 0 Denunciar post Postado Setembro 23, 2016 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
Ilano 0 Denunciar post Postado Setembro 26, 2016 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
Ilano 0 Denunciar post Postado Setembro 27, 2016 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