Fórum Form MDI e MDICHILD e as barras de Rolagem Como resolver? #267193
02/02/2005
0
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
Curtir tópico
+ 0Posts
02/02/2005
Marcelo Saviski
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
02/02/2005
Microbios
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
02/02/2005
Microbios
é onde o cursor para dando o erro. E não onde eu apontei anteriormente.
Gostei + 0
02/02/2005
Massuda
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
03/02/2005
Microbios
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
03/02/2005
Massuda
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
03/02/2005
Microbios
: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
03/02/2005
Massuda
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
03/02/2005
Microbios
É... 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
15/10/2005
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
Clique aqui para fazer login e interagir na Comunidade :)