nie czaje co z tymi komunikatami

0

mam sobie procedurke

procedure TFMain.WndProc(var Msg: TMessage);
begin
  if (Msg.Msg = WM_SIZE) and (Msg.WParam = SIZE_MINIMIZED) then
    Application.MainForm.Visible := False ;
  inherited;
end;

i mam sobie druga procedurke

procedure TFMain.KlikniecieWTray(var Message: TMessage);
var
 Punkt : TPoint;
begin
 case Message.LParam of
  WM_LBUTTONUP:
   FMain.Visible := not FMain.Visible;
  WM_RBUTTONDOWN:
   begin
   GetCursorPos(Punkt);
   PopupTray.Popup(Punkt.x,Punkt.y);
   end;
 end;
end;  

obie rabia to samo tylko ta druga obsluguje zdarzenie klikniecie w ikone w trayu a a pierwsza powinna robic to samo tylko w zdarzeniu minimalizacji okna...
tylko wlasnie tu jest problem jak ta druga dziakla bez zarzutu to pierwsza robi cos dziwnego znika fomatka ale program pozostaje na dole na pasku okien - i nie moge tego przywrocic do normalnego widoku - czy ktos wie co jest grane

wanze: jezeli chcesz napisac poczytaj tu czy tam to sobie daruj bo juz przeczytalem wszystkie art. na temat komunikatow na tej stronie
prosze o konkretne posty a nie gdybanie...

pozdr

0

Samo schowanie głównego formularza to nie wszystko. Najwyraźniej niedokładnie czytałeś wszystkie artykuy (albo nie wszystkie czytaleś :P ). Ja znalazłem kiedyś cuś takiego:

procedure TForm1.minimalizacja(Sender :TObject);
var Action :TCloseAction;
    ExtendedStyle :integer;
begin
 Form1.Hide;
 ExtendedStyle:=GetWindowLong(Application.Handle, GWL_EXSTYLE);
 SetWindowLong(Application.Handle,GWL_EXSTYLE,
             ExtendedStyle or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
 Shell_NotifyIcon(NIM_ADD,@IconNotifyData);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 with IconNotifyData do
  begin
   hIcon:=Application.Icon.Handle;
   uCallbackMessage:=WM_USER+1;
   cbSize:=SizeOf(IconNotifyData);
   Wnd:=Handle;
   uID:=100;
   uFlags:=NIF_MESSAGE+NIF_ICON+NIF_TIP;
  end;
 StrPCopy(IconNotifyData.szTip, Application.Title);
 Application.OnMinimize:=minimalizacja;
end;

Działa bez zarzutów.

0

<ort>TwÓj</ort> problem polega na tym ze jesli wywolujesz procedure pierwsza komenda:
Application.MainForm.Visible := False; ukrywa forme, ale nie zmienia wartosci zmiennej FMain. Dlatego gdy uruchamiasz druga procedure z sekwencji: FMain.Visible := not FMain.Visible; wynika ze forma jest widoczna wiec <ort>po prostu </ort><ort>prubuje </ort>ja ukryc ponownie.

<ort>Hyba </ort>- nie mam tu Delphi zeby to sprawdzic :)

0

<ort>TwÓj</ort> problem polega na tym ze jesli wywolujesz procedure pierwsza komenda:
Application.MainForm.Visible := False; ukrywa forme, ale nie zmienia wartosci zmiennej FMain. Dlatego gdy uruchamiasz druga procedure z sekwencji: FMain.Visible := not FMain.Visible; wynika ze forma jest widoczna wiec <ort>po prostu </ort><ort>prubuje </ort>ja ukryc ponownie.

<ort>Hyba </ort>- nie mam tu Delphi zeby to sprawdzic :)

zaraz zaraz...
podalem oby dwie procedury zeby ktos mogl zauwazyc jakas roznice jezeli uzywam drugiej procedury gdzie jest FMain.Visible := not Fmain.Visible to to dziala bez zarzutu czy jest w programie ta druga procedura czy tez jej nie ma.
Natomiast ta pierwsza procedura jak jest sama w programie tzn kompiluje program bez tej drugiej procedury ktora dziala, to ona nie dziala w ogole i jest tak samo jak skompiluje ja z ta druga wiec tu nie mozna mowic o jakim dublowaniu sie ze nie moze ustawic vicible na fals jezeli juz jest false bo ta druga procedura chcialbym zauwazyc robi na przeczenie aktualnej wartosci a nie ze ustawia niezaleznie od stanu wlasciwosci Visible, a pierwsza procedura ustawia zawsze na false bo on jest wykonywana tylko wtedy gdy zajdzie zdarzenie minimalizacji a ono moze zajsc tylk owtedy jak jest visible na true...
wiec problem przypomne polega na tym ze procedura dzialajaca robi to samo co niedzialajaca wiec problem chyba twki w obsludze messsage'ow tzn w 'przechwytywaniu i obrodze ich' w procedurze WndProc...

co do posta gdzie jest kod to jeszcze nie sprawdzilem dzialania ale dzieki... sprawdze na pewno

0

<delphi>procedure TForm1.minimalizacja(Sender :TObject);
var Action :TCloseAction;
ExtendedStyle :integer;
begin
Form1.Hide;
ExtendedStyle:=GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle,GWL_EXSTYLE,
ExtendedStyle or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
Shell_NotifyIcon(NIM_ADD,@IconNotifyData);
end;

zapodalem taka procedurke no i dziala... ale:
ort! do traya przy minimalizacji, zamykaniu aplikacji i maxymalizacji czyli na kazdy przycisk umiesczony w gornym prawym rogu formatki....
btw moze mi ktos naswietlic te funkcje GetWindowLong i SetWindowLong ??
z gory dzikeki..
pozdr

0

no to moze ort! poradze w inny sposob tylko niech mi ktos powie jak przepuscic reszte komunikatow

zapodam koda i powiem dalje o co chodzi:

interface

procedure DoTraya(var Message : TMessage); message WM_SYSCOMMAND;


implementation

procedure TFMain.DoTraya(var Message: TMessage);
begin
  case Message.Msg of WM_SYSCOMMAND :
    begin
      if Message.WParam = SC_MINIMIZE then
        Application.MainForm.Visible := False ;
     { if Message.WParam = SC_CLOSE then
        Application.Terminate;
    end;
  end;
end; 

to dziala wzystko prawidlowo tylko jak przepuscic reszte komunikatow ktore nie sa obsuligiwane przez ta procedure a sa 'typu' WM_SYSCOMMAND np SC_MOVE, SC_SIZE
wiec chodzi o to ze cche tylko oprogramowac komunikaty sc_minimize i sc_close a cala reszta ma chodzic normlanie bo w tym przypadku program nie reague w ogole na przesuwanie nie idze tego zrobic, maxymalizacje itd.

ma ktos pomysla??
z gory dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1