Mouse não funciona no PageControl

Delphi

Lógica de programação

25/03/2018

Minha aplicação roda perfeito. Estou testando agora criar os forms dentro de um pagecontrol pra ficarem todas as janelas visíveis na tela principal do sistema. Consegui fazer tudo ficar show. O problema esta no funcionamento do mouse. Em campos de entrada de teclado (edits, maskedits, memos) o mouse não faz nada. Ele não mostra o cursor dentro do componente. E mesmo que eu puxe o foco com o teclado, quando clico ele não faz nada dentro do elemento. Não possiciona o cursor, não seleciona o texto. Nos demais, ele funciona normal. Radiogroup grid, tudo normal. Alguém saberia me ajudar nessa questão?
Marcello Assumpção

Marcello Assumpção

Curtidas 0

Respostas

Fabricio Kawata

Fabricio Kawata

25/03/2018

Oi Marcello. Nesse tipo de abordagem, o Form deve ser criado no momento da criação do seu Parent, sendo assim faça o seguinte: no formulário raiz deixe apenas o PageControl, sem adicionar nenhuma TabSheet nele. Uma vez que uma TabSheet será a Parent de cada Form "filho", criaremos esses dois objetos no mesmo momento. A seguir, use o código abaixo para criar cada Form e TabSheet:<br />
<br />
var<br />
MeuForm : TForm2;<br />
MeuTabSheet : TTabSheet;<br />
begin<br />
// Cria e incorpora a TabSheet ao PageControl existente<br />
MeuTabSheet := TTabSheet.Create(PageControl1);<br />
MeuTabSheet.PageControl := PageControl1;<br />
<br />
// Cria o Form e o incorpora à TabSheet criada<br />
MeuForm := TForm2.Create(MeuTabSheet);<br />
MeuForm.Parent := MeuTabSheet;<br />
MeuForm.Align := alClient;<br />
MeuForm.BorderStyle := bsNone;<br />
MeuForm.Visible := true;<br />
MeuTabSheet.Caption := MeuForm.Caption;<br />
<br />
PageControl1.ActivePage := MeuTabSheet;<br />
end;<br />
<br />
Seguindo por essa linha, você verá que o Form é inteiramente incorporado à TabSheet, habilitando assim todos os devidos controles de mouse e teclado providos pelo Windows.<br />
<br />
Espero ter te ajudado.<br />
<br />
Abraço e bons desenvolvimentos!
GOSTEI 0
Fabricio Kawata

Fabricio Kawata

25/03/2018

Oi Marcello. Nesse tipo de abordagem, o Form deve ser criado no momento da criação do seu Parent, sendo assim faça o seguinte: no formulário raiz deixe apenas o PageControl, sem adicionar nenhuma TabSheet nele. Uma vez que uma TabSheet será a Parent de cada Form "filho", criaremos esses dois objetos no mesmo momento. A seguir, use o código abaixo para criar cada Form e TabSheet:

var
MeuForm : TForm2;
MeuTabSheet : TTabSheet;
begin
// Cria e incorpora a TabSheet ao PageControl existente
MeuTabSheet := TTabSheet.Create(PageControl1);
MeuTabSheet.PageControl := PageControl1;

// Cria o Form e o incorpora à TabSheet criada
MeuForm := TForm2.Create(MeuTabSheet);
MeuForm.Parent := MeuTabSheet;
MeuForm.Align := alClient;
MeuForm.BorderStyle := bsNone;
MeuForm.Visible := true;
MeuTabSheet.Caption := MeuForm.Caption;

PageControl1.ActivePage := MeuTabSheet;
end;

Seguindo por essa linha, você verá que o Form é inteiramente incorporado à TabSheet, habilitando assim todos os devidos controles de mouse e teclado providos pelo Windows.

Espero ter te ajudado.

Abraço e bons desenvolvimentos!
GOSTEI 0
Marcello Assumpção

Marcello Assumpção

25/03/2018

Oi Fabrício, eu faço quase isso.

Primeiro, eu fiz um exemplo simples, conforme seu modelo mas ainda assim o problema persiste, não altera a ocorrência do problema...

Eu fiz esses testes no Delphi 10 Seattle.

Já no meu projeto mesmo, o código é ligeiramente diferente, mas tudo funciona como no exemplo. Segue abaixo meu código:



//------------------------------------------------------------------------------
tsPrincipal := TTabSheet.Create(pcPrincipal);
tsPrincipal.Name := 'tsENTRADAS';
tsPrincipal.Caption := 'Entradas';
tsPrincipal.PageControl := pcPrincipal;
//------------------------------------------------------------------------------
frmEntradas := TfrmEntradas.create(self,LModulo);
frmEntradas.Parent := tsPrincipal;
frmEntradas.show;
frmEntradas.WindowState := wsMaximized;
frmEntradas.Align := alClient;
pcPrincipal.ActivePageIndex := pcPrincipal.ComponentCount;


O formulário é criado perfeito, funcionando ok. Ainda crio uma cópia do DataModule no formshow.

Ainda assim, o mouse não traz o foco em alguns componentes, especificamente nos de entrada de dados digitados. Ele provoca a entrada no componente, mas isso não se reflete na tela. O cursor não pisca e não habilita a edição. Eu contornei o problema no onclick do componente, forçando o foco e selecionando para por o cursor no final da seleção, usando o código abaixo:

if (Sender is TMaskEdit) then
begin
if not (Sender as TMaskEdit).Focused then
(Sender as TMaskEdit).SetFocus;
(Sender as TMaskEdit).SelStart := (Sender as TMaskEdit).SelLength + 1
end

Ficou 90% bom. Ainda não consigo clicar no meio do texto e lá posicionar o cursor.



GOSTEI 0
POSTAR