Escolar Documentos
Profissional Documentos
Cultura Documentos
y y y y y y y y y y y y y y y
Forar foco em janela Anexar dois forms Impedir que o form seja fechado com Alt+F4 Impedir que o form seja arrastado para fora das margens da tela Enviar comandos de rolagem vertical para um TMemo Construir a barra de ttulo do form com um Panel Criar form sem ttulo que possa ser arrastado Criar caixas de dilogo em tempo de execuo Determinar se uma janela (form) est maximizada Determinar se o aplicativo est minimizado Maximizar um form de forma que cubra toda a tela, inclusive a barra de tarefas Posicionar Form's em relao ao Desktop do Windows Salvar/restaurar o tamanho e posio de Form's Mostrar um Form de LogOn antes do Form principal Fazer a barra de ttulo ficar intermitente (piscante)
Result := False; ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil); ThisThreadID := GetWindowThreadPRocessId(hwnd, nil); if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then begin BringWindowToTop(hwnd); // IE 5.5 related hack SetForegroundWindow(hwnd); AttachThreadInput(ThisThreadID, ForegroundThreadID, False); Result := (GetForegroundWindow = hwnd); end; if not Result then begin // Code by Daniel P. Stasinski SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE); BringWindowToTop(hwnd); // IE 5.5 related hack SetForegroundWindow(hWnd); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE); end; end else begin BringWindowToTop(hwnd); // IE 5.5 related hack SetForegroundWindow(hwnd); end; Result := (GetForegroundWindow = hwnd); end; end; { ForceForegroundWindow }
Segunda alternativa A funo abaixo consegue forar o foco na janela especificada criando-se um formulrio com dimenso de um apenas 1 ponto e simulando um clique de mouse neste formulrio para que a aplicao receba o foco de entrada. Em seguida a janela especificada colocada em primeiro plano usando-se a funo SetForegroundWindow da API do Windows.
procedure ForceForegroundWindow(hwnd: THandle); // (W) 2001 Daniel Rolf // http://www.finecode.de // rolf@finecode.de var hlp: TForm; begin hlp := TForm.Create(nil); try hlp.BorderStyle := bsNone; hlp.SetBounds(0, 0, 1, 1); hlp.FormStyle := fsStayOnTop; hlp.Show; mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0 , 0, 0);
Terceira alternativa A biblioteca USER32.DLL possui uma funo no documentada que prope forar o foco em determinada janela. A declarao da funo :
procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall; external user32 Name 'SwitchToThisWindow'; {x = false: Size unchanged, x = true: normal size} { Exemplo } procedure TForm1.Button2Click(Sender: TObject); begin SwitchToThisWindow(FindWindow('note pad', nil), True); end;
Ateno! Nos testes que fiz usando Windows XP Professional e Delphi 6, a primeira e segunda alternativas funcionaram perfeitamente. A ltima no funcionou nos testes, mas foi mantida aqui para que outras pessoas possam experiment-la. Autor: Desconhecido Incio
end; procedure TForm1.WMMove(var Msg: TMessage); begin AjustarForm2; end; 5. Escreva o evento OnShow do Form1 como abaixo: procedure TForm1.FormShow(Sender: TObject); begin Form2.Show; end; 6. Escreve o evento OnHide do Form1 como abaixo: procedure TForm1.FormHide(Sender: TObject); begin Form2.Hide; end; 7. Escreve o evento OnReSize do Form1 como abaixo: procedure TForm1.FormResize(Sender: TObject); begin AjustarForm2; end; Pronto! Execute e experimente arrastar ou redimensionar o Form1 para ver o efeito.
Observaes Neste exemplo, se o usurio mexer no Form2 o Form1 no se ajustar automaticamente. Existem no mnimo duas alternativas para resolver este caso: deixar o Form2 sem borda ou codificar os eventos do Form2 para ajustar o Form1. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
Vamos aos passos: 1. Declare um campo (varivel) na seo private do Form: private FPodeFechar: boolean; 2. No evento OnCreate do form coloque: FPodeFechar := false; 3. No evento OnCloseQuery do form coloque: CanClose := FPodeFechar; 4. Coloque um boto no form e no seu evento Click coloque: FPodeFechar := true; Close; Pronto! Execute e teste.
Impedir que o form seja arrastado para fora das margens da tela
- Na seo Private declare a procedure abaixo: private procedure WMMove(var Msg: TWMMove); message WM_MOVE; - Abaixo da palavra implementation escreva a procedure abaixo: procedure TForm1.WMMove(var Msg: TWMMove); begin if Left < 0 then Left := 0; if Top < 0 then Top := 0; if Screen.Width - (Left + Width) < 0 then Left := Screen.Width - Width; if Screen.Height - (Top + Height) < 0 then Top := Screen.Height - Height; end; Para testar: - Execute o programa e tente arrastar o form para fora das margens da tela e veja o que acontece.
Observaes Alm desta tcnica existem API's do Windows que fazem um trabalho equivalente. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
if GetAsyncKeyState(VK_LBUTTON) < 0 then Msg.Result := HTCAPTION else Msg.Result := HTCLIENT; end; - Execute e experimente arrastar form com o mouse.
Observaes Para fechar este aplicativo pressione Alt+F4. Uma alternativa mais elegante colocar um menu local (PopupMenu) com um comando para fechar. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
Top := 25; { Ajusta o comprimento do Edit de aco rdo com a largura do form } Width := Form.ClientWidth - 20; end; { Coloca o boto OK } with TBitBtn.Create(Form) do begin Parent := Form; { Posiciona de acordo com a largura do form } Left := Form.ClientWidth - (Width * 2) - 20; Top := 80; Kind := bkOK; { Boto Ok } end; { Coloca o boto Cancel } with TBitBtn.Create(Form) do begin Parent := Form; Left := Form.ClientWidth - Width - 10; Top := 80; Kind := bkCancel; { Boto Cancel } end; { Exibe o form e aguarda a ao do usurio. Se for OK... } if Form.ShowModal = mrOK then begin Nome := Edt.Text; Result := true; end; finally Form.Free; end; end; Para chama r esta funo siga o exemplo abaixo: procedure TForm1.Button1Click(Sender: TObject); var S: string; begin if ObterNome(S) then Edit1.Text := S; end;
Observaes Os componentes Label, Edit (var Edt) e BitBtn's (botes) no so destrudos explicitamente (Componente.Free). Isto no necessrio, pois ao cri-los informei como proprietrio o Form (ex: TLabel.Create(Form)). Neste caso, estes componentes so destrudos automaticamente ao destruir o Form (Form.Free). Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
Observaes Pode-se verificar qualquer janela (form). S um lembrete: quando clicamos no boto de minimizar do form principal, na verdade ele oculto e o Application que minizado. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
Maximizar um form de forma que cubra toda a tela, inclusive a barra de tarefas
{ um "maximizar" com jeitinho brasileiro... mas funciona. No evento OnShow do form coloque o cdigo abaixo: } Top := 0; Left := 0; Width := Screen.Width; Height := Screen.Height;
Observaes Nos testes que fiz, mesmo com a barra de tarefas marcada como "Sempre Visvel", funcionou perfeitamente. Fiz os testes usando o Win95. Talvez em novas verses, possa apresentar problemas. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br
Incio
Observaes Para testar, execute este exemplo e experimente digitar nmeros de 1 a 3 em ambos os Edit's e clique no Button para ver o resultado. O Edit1 indica a posio horizontal (esquerda, centro e direita) e o Edit2 indica a posio vertical (topo, centro e em baixo). Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br
Incio
end. { Em cada formulrio que deseja salvar/restaurar: - Inclua na seo uses: uFormFunc - No evento OnShow digite: tbLoadFormStatus(Self, Self.Name); - No evento OnClose digite: tbSaveFormStatus(Self, Self.Name); }
Observaes O arquivo INI ter o nome do executvel e extenso INI e ser salvo no diretrio do Windows. A palavra Self indica o Form relacionado com a unit em questo. Poderia ser, por exemplo, Form1, Form2, etc. Onde aparece Self.Name poder ser colocado um nome a sua escolha. Este nome ser usado como SectionName no arquivo INI e deve ser idntico no evento OnShow e OnClose de um mesmo Form, porm para cada Form dever ser usado um nome diferente. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
if F.ShowModal = mrOK then begin Application.Initialize; Application.CreateForm (TForm1, Form1); Application.Run; end; finally F.Free; end; end.
Observaes O Form2 do exemplo o Form de LogOn. Este dever ser preparado para que se possa escolher o usurio, digitar a senha, etc. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio