Form MDI e MDICHILD e as barras de Rolagem Como resolver?
Alôu a todos, novamente.
Após pesquisar e ´NÂO´ encontrar nenhuma resposta satisfatória no ´FÓRUM´ gostaria de obter resposta para este problema irritante que é a criação de mdichilds e a barra de rolagem no form MDI principal. Como resolver esta porc**** ? Peguei uma rotina em um outro site... mas a mesma retorna um erro dizendo que falta uma variável na linha indicada com *** asteriscos *** segue a rotina abaixo.
Mais uma vez, obrigado a todos os que ´PELEJAM´ e descobrem as soluções para nossos problemas.
Rafael.
//declare essa função
function ClientWindowProc(wnd: HWND; msg: Cardinal; wparam, lparam: Integer ): Integer; stdcall;
var
f: Pointer;
begin
f := Pointer( GetWindowLong( wnd, GWL_USERDATA ));
case msg of
WM_NCCALCSIZE:
begin
if (GetWindowLong( wnd, GWL_STYLE ) and (WS_HSCROLL or WS_VSCROLL)) 0 then
SetWindowLong(wnd, GWL_STYLE, GetWindowLong(wnd, GWL_STYLE) and not (WS_HSCROLL or WS_VSCROLL));
end;
end;
Result := CallWindowProc(f, wnd, msg, wparam, lparam);
end;
// No evento OnCreate do MDI Form coloque o seguinte código
if ClientHandle 0 then
begin
if (not (GetWindowLong(ClientHandle, GWL_USERDATA) 0)) then
begin
*********************************************
SetWindowLong(ClientHandle, GWL_USERDATA, SetWindowLong (ClientHandle, GWL_WNDPROC, integer(@ClientWindowProc)));
**************************************************^
onde está o ^ é onde o cursor para dizendo haver falta de uma variável.... Alguém se habilita ? :lol:
end;
end;
Após pesquisar e ´NÂO´ encontrar nenhuma resposta satisfatória no ´FÓRUM´ gostaria de obter resposta para este problema irritante que é a criação de mdichilds e a barra de rolagem no form MDI principal. Como resolver esta porc**** ? Peguei uma rotina em um outro site... mas a mesma retorna um erro dizendo que falta uma variável na linha indicada com *** asteriscos *** segue a rotina abaixo.
Mais uma vez, obrigado a todos os que ´PELEJAM´ e descobrem as soluções para nossos problemas.
Rafael.
//declare essa função
function ClientWindowProc(wnd: HWND; msg: Cardinal; wparam, lparam: Integer ): Integer; stdcall;
var
f: Pointer;
begin
f := Pointer( GetWindowLong( wnd, GWL_USERDATA ));
case msg of
WM_NCCALCSIZE:
begin
if (GetWindowLong( wnd, GWL_STYLE ) and (WS_HSCROLL or WS_VSCROLL)) 0 then
SetWindowLong(wnd, GWL_STYLE, GetWindowLong(wnd, GWL_STYLE) and not (WS_HSCROLL or WS_VSCROLL));
end;
end;
Result := CallWindowProc(f, wnd, msg, wparam, lparam);
end;
// No evento OnCreate do MDI Form coloque o seguinte código
if ClientHandle 0 then
begin
if (not (GetWindowLong(ClientHandle, GWL_USERDATA) 0)) then
begin
*********************************************
SetWindowLong(ClientHandle, GWL_USERDATA, SetWindowLong (ClientHandle, GWL_WNDPROC, integer(@ClientWindowProc)));
**************************************************^
onde está o ^ é onde o cursor para dizendo haver falta de uma variável.... Alguém se habilita ? :lol:
end;
end;
Microbios
Curtidas 0
Respostas
Marcelo Saviski
02/02/2005
Experimente colocar essa função ClientWindowProc sobre as outras, logo depois do [b:8162685aa8]implementation[/b:8162685aa8], para que ela apareça antes do FormCreate.
Não sei se isso soluciona mais é uma tentativa
outra coisa, quando ele diz que não encontra uma variável, ele diz qual ele não esta encontrando, o nome dela, qual é?
Não sei se isso soluciona mais é uma tentativa
outra coisa, quando ele diz que não encontra uma variável, ele diz qual ele não esta encontrando, o nome dela, qual é?
GOSTEI 0
Microbios
02/02/2005
Marcelo,
Não. Ele Não Diz qual é a variável que está faltando. O que é estranho!
E quanto a função ela já esta antes (no meu programa) do evento on create logo abaixo da uses... sendo assim é a primeira função do meu MDI.
obrigado pela tentativa.... *rs* mas acho que ainda não vai ser resolvido
Não. Ele Não Diz qual é a variável que está faltando. O que é estranho!
E quanto a função ela já esta antes (no meu programa) do evento on create logo abaixo da uses... sendo assim é a primeira função do meu MDI.
obrigado pela tentativa.... *rs* mas acho que ainda não vai ser resolvido
GOSTEI 0
Microbios
02/02/2005
Queria fazer uma correção: O local onde está faltando a variável não é onde está indicado e sim após o (@ClientWindowProc) *** AQUI ***));
é onde o cursor para dando o erro. E não onde eu apontei anteriormente.
é onde o cursor para dando o erro. E não onde eu apontei anteriormente.
GOSTEI 0
Massuda
02/02/2005
Botando lenha na fogueira... comigo compilou sem problemas e elimina as barras de rolagem que apareciam quando movimenta o form MDI Child dentro do MDI Form... era esse o efeito esperado?
Segue o código que usei no meu form principal (MDI Form)...A propósito, estou usando D5 Pro com os updates instalados.
Segue o código que usei no meu form principal (MDI Form)...
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); // ... implementation // ... function ClientWindowProc(wnd: HWND; Msg: Cardinal; wparam, lparam: Integer): Integer; stdcall; var f: Pointer; begin f := Pointer(GetWindowLong(wnd, GWL_USERDATA)); case Msg of WM_NCCALCSIZE: begin if (GetWindowLong(wnd, GWL_STYLE) and (WS_HSCROLL or WS_VSCROLL)) <> 0 then SetWindowLong(wnd, GWL_STYLE, GetWindowLong(wnd, GWL_STYLE) and not (WS_HSCROLL or WS_VSCROLL)); end; end; Result := CallWindowProc(f, wnd, Msg, wparam, lparam); end; procedure TForm1.FormCreate(Sender: TObject); begin if ClientHandle <> 0 then begin if (not (GetWindowLong(ClientHandle, GWL_USERDATA) <> 0)) then begin SetWindowLong(ClientHandle, GWL_USERDATA, SetWindowLong(ClientHandle, GWL_WNDPROC, Integer(@ClientWindowProc))); end; end; // ... end; // ...
GOSTEI 0
Microbios
02/02/2005
Caro Massuda,
No meu delphi não compilou, uso o 6 com todos os updates possíveis e impossíveis... *rs* mas noto algo no seu código que no meu ficou diferente, por exemplo:
Não declaro a function ClientWindowProc em alguma sessão public ou private ?
Não seria TForm.ClientWindowProc então?
se eu colocar ela após implementation acima o uses, o uses na recompilação acaba duplicando e sempre ficando acima da 1ª função que é a em questão.
Não é para usar essa função no form MDI ?
*** Pelo que vejo acho que estou fazendo muita lenha!!!!! *RS* de montão!
Aguardo,
Rafael
No meu delphi não compilou, uso o 6 com todos os updates possíveis e impossíveis... *rs* mas noto algo no seu código que no meu ficou diferente, por exemplo:
Não declaro a function ClientWindowProc em alguma sessão public ou private ?
Não seria TForm.ClientWindowProc então?
se eu colocar ela após implementation acima o uses, o uses na recompilação acaba duplicando e sempre ficando acima da 1ª função que é a em questão.
Não é para usar essa função no form MDI ?
*** Pelo que vejo acho que estou fazendo muita lenha!!!!! *RS* de montão!
Aguardo,
Rafael
GOSTEI 0
Massuda
02/02/2005
Não declaro a function ClientWindowProc em alguma sessão public ou private ?
Não... essa função será usada pelo Windows e o Windows não sabe nada de classes do Delphi. Essa função precisa no ´estilo antigo´.se eu colocar ela após [b:50345f5bca]implementation acima o uses[/b:50345f5bca], o uses na recompilação acaba duplicando e sempre ficando acima da 1ª função que é a em questão.
Nunca vi isso acontecer, mas me parece que pelas regras da linguagem, o [b:50345f5bca]uses[/b:50345f5bca] tem de estar após um [b:50345f5bca]interface[/b:50345f5bca] ou um [b:50345f5bca]implementation[/b:50345f5bca].Não é para usar essa função no form MDI ?
Não... tem que estar no form principal (com estilo fsMDIForm) basicamente porque é nesse form que está a área que você quer que não apareça as barras de rolagem.No form principal de um aplicativo MDI, existem duas janelas: uma do form (que você tem controle) e outra onde as janelas/forms MDIChild aparecem (essa janela você pode manipular usando a propriedade ClientHandle do form principal combinado com a API do Windows).
GOSTEI 0
Microbios
02/02/2005
Colega Massuda....
:oops: :roll: :roll: Como de fato.... vc tem razão! Ele remove as barras e é o efeito esperado para o talz MDI.... oops... Mas, hehehe como problema a gente só aumenta... o fato é que eu pensei que ele ´TAMBÉM´ impediria a movimentação de um MdiChild para fora da área do MDI. Te confesso que era isso que eu queria ´MESMO´ que ele fizesse mas nem prestei atenção... :lol:
Agora voltando a vaca fria... tem como aproveitando esse código impedir a movimentação para fora da área do MDI?
Agradeço sua colaboração e desculpe pela [b:a3d3aba335]desatenção!!![/b:a3d3aba335]
Rafael
:oops: :roll: :roll: Como de fato.... vc tem razão! Ele remove as barras e é o efeito esperado para o talz MDI.... oops... Mas, hehehe como problema a gente só aumenta... o fato é que eu pensei que ele ´TAMBÉM´ impediria a movimentação de um MdiChild para fora da área do MDI. Te confesso que era isso que eu queria ´MESMO´ que ele fizesse mas nem prestei atenção... :lol:
Agora voltando a vaca fria... tem como aproveitando esse código impedir a movimentação para fora da área do MDI?
Agradeço sua colaboração e desculpe pela [b:a3d3aba335]desatenção!!![/b:a3d3aba335]
Rafael
GOSTEI 0
Massuda
02/02/2005
... tem como aproveitando esse código impedir a movimentação para fora da área do MDI?
Não :shock: Na verdade nem precisa usar o código que esconde as barras de rolagem.Pesquisando no NG da Borland, encontrei [url=http://groups.google.com.br/groups?hl=pt-BR&lr=&selm=VA.00007bb5.0022a2f8¬40antispam.compuserve.com]este código[/url] para ser incluído no form MDIChild:
type TForm2 = class... private procedure WMWindowPosChanging(var Msg: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING; // ... procedure TForm2.WMWindowPosChanging(var Msg: TWMWindowPosChanging); var R: TRect; begin with Msg.WindowPos^ do begin if (flags and SWP_NOMOVE) = 0 then begin Windows.GetClientRect(Application.MainForm.ClientHandle, R); if x < 0 then x := 0; if y < 0 then y := 0; if (x + cx) > R.Right then x := R.Right - cx; if (y + cy) > R.Bottom then y := R.Bottom - cy; end; end; inherited; end;
GOSTEI 0
Microbios
02/02/2005
Caro colega...
É... agora eu acho que a saga acabou né.! Tomara que sim!
Foi até bom, pois quem fazer uma pesquisa no fórum sobre este assunto,
vai encontrar este nosso debate, solucionando todas as dúvidas.
Então Agradeço muito a ajuda. Espero poder debater :D novamente com vc.
Até
Rafael
É... agora eu acho que a saga acabou né.! Tomara que sim!
Foi até bom, pois quem fazer uma pesquisa no fórum sobre este assunto,
vai encontrar este nosso debate, solucionando todas as dúvidas.
Então Agradeço muito a ajuda. Espero poder debater :D novamente com vc.
Até
Rafael
GOSTEI 0
Alcantarus
02/02/2005
Amigos,
Ja usei os codigo acima, MAS, precisaria que ao Maximizar o Form Filho, ele respeitasse a area do Form Pai, e SOMENTE maximizasse nessa area. Ele esta maximizando na area do Form Pai, deixando assim uma visualizacao pessima, inclusive ate ´complicando´ com relacao aos botoes da Barra de Titulo... Miniminar, Maximizar, Restaurar, Fechar...
Grato,
Alcantarus.
Ja usei os codigo acima, MAS, precisaria que ao Maximizar o Form Filho, ele respeitasse a area do Form Pai, e SOMENTE maximizasse nessa area. Ele esta maximizando na area do Form Pai, deixando assim uma visualizacao pessima, inclusive ate ´complicando´ com relacao aos botoes da Barra de Titulo... Miniminar, Maximizar, Restaurar, Fechar...
[-]- Barra de Titulo (Form Pai)----------[-][ ][X] | |[-]- Barra de Titulo (Form Filho)------[-][ ][X] | | +-----------------------------------------------------
Grato,
Alcantarus.
GOSTEI 0