Ir para conteúdo
Fórum Script Brasil
  • 0

Form Secundário Minimizando Na Barra De Tarefas


Paulo Nobre

Pergunta

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

Posts Recomendados

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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

Como 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 é!!

Link para o comentário
Compartilhar em outros sites

  • 0

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?

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0
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.

Link para o comentário
Compartilhar em outros sites

  • 0
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.
Link para o comentário
Compartilhar em outros sites

  • 0
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.
Link para o comentário
Compartilhar em outros sites

  • 0
Guest Marocs Diego

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 habilita

a 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...

Att

Marcos

Link para o comentário
Compartilhar em outros sites

  • 0
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 habilita

a 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 ?
Link para o comentário
Compartilhar em outros sites

  • 0
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.

att

Marcos

Link para o comentário
Compartilhar em outros sites

  • 0

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 por Hudson Cavazin
Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Resumindo seria assim, você acabou de criar um programa e seu form

principal se chama Form1 e adicionou ao programa um outro form

chamado 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ção

da janela, toda janela possue um Handle, desde botões e tudo mais, é

assim que o Windows identifica qual janela aconteceu tal evento, o Windows

controla tudo por mensagens...

Quando a barra de tarefas vai enumerar as janelas criadas ela verifica

se tal possue uma janela principal, ou podemos chamar de WndParent

e se ela tiver simplesmente o controle dessa janela na barra de tarefas passa

a ser o mesmo botão da janela principal...

Então alterando o WndParent nos Params da janela setando para

0 você afirma que esta janela tem um controle independente e não o controle

da aplicação (TApplication)...

Ai o que acontece é que, quando você da um ShowMessage por exemplo é criada

uma janela para exibir a mensagem e essa janela pega o WndParent da janela que

a chamou, no caso se fosse do Form1 seria o Handle de TApplication ou seja, do

programa, mas como você setou o WndParent do Form2 para 0 então a janela

de mensagem fica sem controle e por isso acontece esse problema...

Bom é meio ruim de explicar espero que tenha entendido mais ou menos ahuauha

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Então, eu já tive este problema uma vez mas não lembro o que eu fiz para

resolver, 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ência

hospede em algum site tipo www.4shared.com ou www.rapidshare.com e poste

o link com o exemplo...

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Eu não achei nenhuma solução para isto a não ser você trocar todos os ShowMessage

por algo como MessageBox, eu testei aqui emulando um erro StrToInt('a'); e ficou

normal a mensagem, parece que este problema somente acontece com o ShowMessage

mesmo... A diferença é que no MessageBox você pode personalizar também as suas

mensagens com icones e botões...

Eu faço assim, adiciono em uma unit que é usada por todo o programa ou seja, a unit que

vai 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 exemplo

Mensagem de erro

MessageOut(Handle, 'O preenchimento do campo nome é obrigatório...', MB_ERROR);

Mensagem de pergunta

if 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ão

Mensagem de informação

MessageOut(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 da

uma aparência melhor no programa... fica mais apresentável...

Ou vamos torcer para que alguém poste uma maneira caso queira usar o ShowMessage

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

é 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.

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Foi 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 ela

SetWindowOnTop(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

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

É, é o que eu indicaria, crie uma janela que faça o mesmo que o input box

mas faça-a dinâmica ou seja, uma janela compatível com todo tipo de operação

que você chamaria um input box...

Vamos esperar talvez outras pessoas tenham outra solução!

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Opa

Foi bem claro sim, mas ai sabe o que você pode fazer tipo assim...

Talvez tenha maneira melhor:

CODE

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 ela

SetWindowOnTop(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 ;x

num sei mais o que faço ;oo

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...