Paulo Nobre Postado Novembro 6, 2006 Denunciar Share Postado Novembro 6, 2006 Supondo Form1 o principal e form2 "secundário", quando minimizamos o form2 ele não vai para a barra de tarefas e sim minimiza acima dela. Existe uma maneira de contornar isto, ou seja, fazê-lo minimizar na barra de tarefas? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Novembro 6, 2006 Denunciar Share Postado Novembro 6, 2006 Como você mesmo disse que eu tinha um ás na manga: Eu só sei de um jeito de fazer isso que seria chamar o form em uma nova aplicação, ou seja, cada form na verdade seria uma aplicação diferente. Só que aí não seria possível um form se comunicar com o outro, a não ser que você seja um s3c ou um Micheus da vida, rsrsrs.Na verdade existe um meio como você pode ter reparado no código que o s3c postou pra resolver o seu problema do TrayIcon, que seria alocar memória no espaço da outra aplicação para então se estabelecer a comunicação. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 6, 2006 Autor Denunciar Share Postado Novembro 6, 2006 Só que aí não seria possível um form se comunicar com o outro, a não ser que você seja um s3c ou um Micheus da vidaComo não sou nem um s3c, nem um Michel, nem um Thales da vida vou ficando com o form minimizando acima da barra de tarefas.Mas que é feio pará caramba é!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Novembro 6, 2006 Denunciar Share Postado Novembro 6, 2006 Só pra você se divertir. Voce deve ter visto como eu fiz naquele programa de criptografia para abrir um form diferente quando se clica em cima do arquivo, então do mesmo jeito dá pra abrir um form em outra aplicação. Vamos supor que você tenha 3 forms (TForm1, TForm2, TForm3). Aí você coloca no Project->View Source o seguinte->program Project1; uses Forms, SysUtils, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} var formID : cardinal; begin Application.Initialize; if (ParamStr(1) <> '') then begin try formID:=StrToInt(ParamStr(1)); except formId:=0; end; if (formID <> 0) then begin case formID of 1:Application.CreateForm(TForm1, Form1); 2:Application.CreateForm(TForm2, Form2); 3:Application.CreateForm(TForm3, Form3); else Application.CreateForm(TForm1, Form1); end; end else Application.CreateForm(TForm1, Form1); end else Application.CreateForm(TForm1, Form1); Application.Run; end. Aí para abrir um form invés de chamar Form2:=TForm2.create...... você chama assim-> var ComLine : string; begin ComLine:='""'+ParamStr(0)+'"'+' 3'+'"'; WinExec(ComLine, SW_SHOWNORMAL); end;aí a comunicação poderia ser estabelecida por meio de menssagens. Ok? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 7, 2006 Denunciar Share Postado Novembro 7, 2006 Você pode redefinir CreateParams de Form2 e setar WndParent = 0.Ex:procedure CreateParams(var Params: TCreateParams); override; procedure TForm2.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.WndParent := 0; end;Isso tira a dependência do Form2 como sendo de TApplication e o Windows o controla como um Form independente. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 7, 2006 Autor Denunciar Share Postado Novembro 7, 2006 s3c,Neste caso usaria este código quando interceptasse a mensagem de minimização?É isso? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Progr'amador Postado Novembro 7, 2006 Denunciar Share Postado Novembro 7, 2006 Olá Paulo,Posso entrar na conversa?!O s3c realmente sabe tudo, o cara é fera mesmo!!! :) Quanto ao uso, seria assim:type TForm2 = class(TForm) procedure CreateParams(var Params: TCreateParams); override; private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation procedure TForm2.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.WndParent := 0; end; Abs. Progr'amador. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 7, 2006 Denunciar Share Postado Novembro 7, 2006 s3c,Neste caso usaria este código quando interceptasse a mensagem de minimização?É isso?Não, porque CreateParams é executado na criação do Form.É só colocar o código que ele será executado informando que o Form2 não possui Handle Parent. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 7, 2006 Autor Denunciar Share Postado Novembro 7, 2006 Olá Paulo,Posso entrar na conversa?!Claro que pode Progr'amador!Valeu pela ajuda.Não, porque CreateParams é executado na criação do Form.É só colocar o código que ele será executado informando que o Form2 não possui Handle Parent.Mancada minha!!Obrigado,s3c. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Novembro 7, 2006 Denunciar Share Postado Novembro 7, 2006 Isso tira a dependência do Form2 como sendo de TApplication e o Windows o controla como um Form independente.O cara sabe tudo mesmo, muito fera.type TForm2 = class(TForm) procedure CreateParams(var Params: TCreateParams); override; private { Private declarations } public { Public declarations } end;Eu declarei na interface public, porque achei que fosse mais correto. Declarar desse jeito aí é a mesma coisa que declarar na interface public?Eu sabia que era alguma coisa relacionada ao parent do form e que tinha que dizer ao windows que o form não tinha parent, mas vai saber como. Muito fera. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 7, 2006 Denunciar Share Postado Novembro 7, 2006 Eu declarei na interface public, porque achei que fosse mais correto. Declarar desse jeito aí é a mesma coisa que declarar na interface public?Acho que é a mesma coisa, mas particularmente para mim o mais correto seria declarar esse método na private, já que além de ser específico para cada Form, é executado antes do onCreate. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Novembro 7, 2006 Denunciar Share Postado Novembro 7, 2006 Acho que é a mesma coisa, mas particularmente para mim o mais correto seria declarar esse método na private, já que além de ser específico para cada Form, é executado antes do onCreate.Originalmente está em protected para poder ser overriden mas já que o compilador não reclama em override um método na interface errada acho que não faz diferença. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Marocs Diego Postado Dezembro 1, 2006 Denunciar Share Postado Dezembro 1, 2006 Boa tarde a todos, estava vendo esta discussão, e testei o código do CreateParams, ele cria os forms separadamente, mas os forms que são criado sem o parent, não habilitaa opção de fechar, minimizar, restaurar quando se clica com o botão direito do mouse na barra de tarefas.alguém poderia me ajudar....Desde já grato pela atenção...AttMarcos Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Dezembro 2, 2006 Denunciar Share Postado Dezembro 2, 2006 Boa tarde a todos, estava vendo esta discussão, e testei o código do CreateParams, ele cria os forms separadamente, mas os forms que são criado sem o parent, não habilitaa opção de fechar, minimizar, restaurar quando se clica com o botão direito do mouse na barra de tarefas.Como estão as propriedades: BorderIcons e BorderStyle ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Marcso Postado Dezembro 4, 2006 Denunciar Share Postado Dezembro 4, 2006 Como estão as propriedades: BorderIcons e BorderStyle ? Depois que você escreveu sobre os Borders, fiz um teste com as propriedades em todos os tipos,mas o erro é porque eu uso um componente skin, ele faz que esse erro ocorra, fiz um teste sem o skin e funcionou perfeitamente, de qualquer forma valeu pela resposta.attMarcos Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hudson Cavazin Postado Abril 7, 2007 Denunciar Share Postado Abril 7, 2007 (editado) eu testei o codigo aqui e funcionou perfeitamente, mais quando eu estou no form2 (usando o codigo citado acima) ele abre normalmente uma nova janela e coloca na barra de tarefas, mas se eu chamo o "ShowMessage", ou se acontece mensagem de erro ou abro outro form, ele da o foco para o form principal. alguém sabe porque ocorre esse erro ? Editado Abril 7, 2007 por Hudson Cavazin Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Abril 7, 2007 Denunciar Share Postado Abril 7, 2007 OpaResumindo seria assim, você acabou de criar um programa e seu formprincipal se chama Form1 e adicionou ao programa um outro formchamado Form2... Quando você chamar o Form2 o que aconteceé que por padrão ele vai receber como WndParent o Handle da Aplicação(TApplication)...Handle é o nome que se dá a propriedade que armazena a identificaçãoda janela, toda janela possue um Handle, desde botões e tudo mais, éassim que o Windows identifica qual janela aconteceu tal evento, o Windowscontrola tudo por mensagens...Quando a barra de tarefas vai enumerar as janelas criadas ela verificase tal possue uma janela principal, ou podemos chamar de WndParente se ela tiver simplesmente o controle dessa janela na barra de tarefas passaa ser o mesmo botão da janela principal...Então alterando o WndParent nos Params da janela setando para0 você afirma que esta janela tem um controle independente e não o controleda aplicação (TApplication)...Ai o que acontece é que, quando você da um ShowMessage por exemplo é criadauma janela para exibir a mensagem e essa janela pega o WndParent da janela quea chamou, no caso se fosse do Form1 seria o Handle de TApplication ou seja, doprograma, mas como você setou o WndParent do Form2 para 0 então a janelade mensagem fica sem controle e por isso acontece esse problema...Bom é meio ruim de explicar espero que tenha entendido mais ou menos ahuauhaabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hudson Cavazin Postado Abril 7, 2007 Denunciar Share Postado Abril 7, 2007 (editado) explicação ótima, mais para resolver meu problema o que devo fazer ?abraço! Editado Abril 7, 2007 por Hudson Cavazin Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Abril 7, 2007 Denunciar Share Postado Abril 7, 2007 OpaEntão, eu já tive este problema uma vez mas não lembro o que eu fiz pararesolver, testei aqui também no Delphi 2006 e não consegui emular o problema,se for possível faça um exemplo com o problema e poste aqui, de preferênciahospede em algum site tipo www.4shared.com ou www.rapidshare.com e posteo link com o exemplo...abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hudson Cavazin Postado Abril 8, 2007 Denunciar Share Postado Abril 8, 2007 (editado) o link está aíhttp://rapidshare.com/files/25008760/teste.rar Editado Abril 9, 2007 por Hudson Cavazin Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Abril 9, 2007 Denunciar Share Postado Abril 9, 2007 OpaEu não achei nenhuma solução para isto a não ser você trocar todos os ShowMessagepor algo como MessageBox, eu testei aqui emulando um erro StrToInt('a'); e ficounormal a mensagem, parece que este problema somente acontece com o ShowMessagemesmo... A diferença é que no MessageBox você pode personalizar também as suasmensagens com icones e botões...Eu faço assim, adiciono em uma unit que é usada por todo o programa ou seja, a unit quevai ficar suas funções...const (* Messagebox *) MB_ERROR = MB_OK or MB_ICONERROR; //A mensagem é de erro MB_QUESTION = MB_YESNO or MB_ICONQUESTION; //A mensagem é uma pergunta MB_INFORMATION = MB_OK or MB_ICONINFORMATION; //A mensagem é de informação function MessageOut(hHandle: HWND; const szText: String; iType: Integer): Integer; begin Result := MessageBox(hHandle, PChar(szText + ' '), 'Safe Desktop', iType); end; Então para usar você faz exemploMensagem de erroMessageOut(Handle, 'O preenchimento do campo nome é obrigatório...', MB_ERROR);Mensagem de perguntaif MessageOut(Handle, 'Gostaria de salvar as alterações?', MB_QUESTION) = idYes then//O cara clicou em Sim, você pode usar idNo para saber se clicou em NãoMensagem de informaçãoMessageOut(Handle, 'O usuário foi cadastrado com sucesso!', MB_ERROR);Acho que fica bem melhor o uso de Messagebox ao invés de ShowMessage até porque dauma aparência melhor no programa... fica mais apresentável...Ou vamos torcer para que alguém poste uma maneira caso queira usar o ShowMessageabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hudson Cavazin Postado Abril 9, 2007 Denunciar Share Postado Abril 9, 2007 é Churc, na verdade eu não uso o showmessage mesmo, so citei como exemplo, meu maior problema é que do form2 eu chamo um outro form (form3) atraves de um botao certo, e esse form3 é chamado atraves do evento "ShowModal" e eu não usei parametros como usei no form2 para criar nova janela na barra de tarefas, e quando o form3 é apresentado na "tela", ele aparece como se tivesse junto com o form1. não sei se fui bem claro, caso não tenho sido, faço um exemplo assim que der um tempinho. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Abril 9, 2007 Denunciar Share Postado Abril 9, 2007 OpaFoi bem claro sim, mas ai sabe o que você pode fazer tipo assim...Talvez tenha maneira melhor:Procedure SetWindowOnTop(aForm: TForm; bTop: Boolean); var clFlags: Cardinal; begin if bTop then clFlags := HWND_TOPMOST else clFlags := HWND_NOTOPMOST; SetWindowPos(aForm.Handle, clFlags, aForm.Left, aForm.Top, aForm.Width, aForm.Height, SWP_NOMOVE and SWP_NOZORDER); end;Pra usar seria assim, antes de chamar o Modal do form você chama elaSetWindowOnTop(Form2, True);Form3.ShowModal;SetWindowOnTop(Form2, False);Se o owner do botão for o Form2 você pode usar Self ao invés de Form2... mas não muda nada...Isso ai vai funcionar masss talvez não seja a melhor maneira...abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hudson Cavazin Postado Abril 9, 2007 Denunciar Share Postado Abril 9, 2007 ah beleza, só mais uma coisa, eu usando o inputbox no form2 vai acontecer o mesmo problema do showmessage, então você me indicaria criar um outro form pra funcionar como se fosse um inputbox ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Abril 9, 2007 Denunciar Share Postado Abril 9, 2007 OpaÉ, é o que eu indicaria, crie uma janela que faça o mesmo que o input boxmas faça-a dinâmica ou seja, uma janela compatível com todo tipo de operaçãoque você chamaria um input box...Vamos esperar talvez outras pessoas tenham outra solução!abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hudson Cavazin Postado Abril 10, 2007 Denunciar Share Postado Abril 10, 2007 OpaFoi bem claro sim, mas ai sabe o que você pode fazer tipo assim...Talvez tenha maneira melhor:CODEProcedure SetWindowOnTop(aForm: TForm; bTop: Boolean);var clFlags: Cardinal;begin if bTop then clFlags := HWND_TOPMOST else clFlags := HWND_NOTOPMOST; SetWindowPos(aForm.Handle, clFlags, aForm.Left, aForm.Top, aForm.Width, aForm.Height, SWP_NOMOVE and SWP_NOZORDER);end;Pra usar seria assim, antes de chamar o Modal do form você chama elaSetWindowOnTop(Form2, True);Form3.ShowModal;SetWindowOnTop(Form2, False);Se o owner do botão for o Form2 você pode usar Self ao invés de Form2... mas não muda nada...Isso ai vai funcionar masss talvez não seja a melhor maneira...abraçoé não funciono, ele trava a aplicação ;xnum sei mais o que faço ;oo Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Paulo Nobre
Supondo Form1 o principal e form2 "secundário", quando minimizamos o form2 ele não vai para a barra de tarefas e sim minimiza acima dela. Existe uma maneira de contornar isto, ou seja, fazê-lo minimizar na barra de tarefas?
Link para o comentário
Compartilhar em outros sites
28 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.