Forma i jej Maximized

0

Cześć. Mam mały, ale denerwujący problem - kiedy podczas zamyaknia aplikacji zapisuje jej rozmiary i pozycje oraz czy jest zmaksymalizowana. Jeżeli jest to podczas następnego startu powinna być zmaksymalizowana no i tak jest. Wszystko OK do czasu kiedy będe chciał ją po starcie znowu przywrócić do starych rozmiarów plikająć na Button okna "Przywróć do dołu". Wtedy się przywraca, ale jej rozmiar jest taki sam jak po zmaksymalizowaniu :/ Myślałem o zapisywaniu przed zaksywamizacją rozmiaru i po przywracaniu je odczytać, ale nie ma takie czegoś jak OnMaximalized :/ Ktoś wie może jak mi pomóc ?

0

Ależ, jest :). Zdarzenie OnMaximize, czy OnMaximized obiektu TApplication. Ewentualnie użyj nakładki, czyli komponentu TApplicationEvents.

0

zapisz sobie najlepiej obie sytuacje to będziesz miał pewność, że nic nie zawiedzie :D

0

Niestety :/ Nie ma Application.OnMaximize czy *ed, ale jest OnRestore, czy to działa tak, że jeżeli okno jest zmaksymalizowane i klikne jeszcze raz na button maksymalizacji to wykona się przed tym OnRestore, czy ta procedura słuzy do czegoś innego ?

0

Niestety, nie działa i OnRestore, tzn. ta procedura jest do czegoś innego :/ ma może ktoś jeszcze jakieś pomysły ?

0

Może jakoś tak?

procedure TForm1.FormResize(Sender: TObject);
begin
  if not (WindowState = wsMaximized) then
    // Zapisz do pliku
end;
0

No tak, ale w jakim momencie to potem przywrócić z pliku jak OnRestore nie działa :/ ?

0

Rzeczywiście, pomyłka z tym zdarzeniem, nie ma takiego :|. W takim razie pozostaje przechwycenie komunikatu WS_SYSCOMMAND oraz komend SC_MAXIMIZE i SC_RESTORE w nim zawartych.

0

A jak się nazywa ta funkcja, bo SendMessage to wykonuje tą czynność, a jak ją przechwycić ?

0

procedure Answer(var Msg: TMessage); message SC_MAXIMIZE;

0
Deti napisał(a)

procedure Answer(var Msg: TMessage); message SC_MAXIMIZE;

Nie, nie, komunikat to WM_SYSCOMMAND :). SC_MAXIMIZE znajduje się chyba w WParam komunikatu.

// aha, no tak - odpowiadałem na szybkiego - deti

0

Coś ona nie działa, tzn. coś mu niepasi z tym message :/

0

Znaczy, co konkretnie wywala?

0

Że coś się nie zgadza :/

[Error] Unit1.pas(24): Unknown directive: 'message'

0

A spróbuj dać tą procedurę jako metodę. Czyli zadeklarować ją w klasie formy.

0

Nie da rady, coś mi niewychodzi :( Mógłby ktoś mi pomóc dając przykład jak to wszystko zadeklarować ?

0
type
TForm1=class(TForm)
...
private
procedure command(var Msg: TMessage); message WM_COMMAND;
...
end;



procedure TForm1.command(var Msg: TMessage);
begin

end;
0

[sciana] Zamiast TForm1 dawałem Form1 :/ Ale OK, niby się kompiluje, ale teraz gdzie wrzucić ten SC_MAXIMIZE ? Przepraszam za moją dociekliwość w prostych rzeczach, ale chciałbym się po prostu dowiedzieć więcej na temat komunikatów, tak na przyszłość [green]

0

Porównuj z tym Msg.WParam. Chyba WParam, jak nie pójdzie, to sprawdź z LParam.

0

Dałem przykładowo "form1.caption := inttostr(Msg.WParam);" w tyj procedurze command no i nic, po zmaksymalizowaniu i przywracaniu itp. To trzeba jakoś "włączyć" ? Tzn. Dać coś w OnCreate formy, żeby zaczęło przechwytywać czy coś ?

0

Cóż, w zasadzie, to nie trzeba nic włączać... :0 A zobacz, czy przy innych okazjach działa - tzn. minimalizacja, kliknięcia w buttony, itd.

0

Hmm dziwne, działa, tzn. wyświetla w Captionie formy "290", ale dopiero jak wrzucilem na forme buttona i go kliknąłem :-/ Ale niestety nic się niedzieje przy minimalizowaniu/rozciąganiu/maksymalizowaniu itp. formy...

0

Siedziałem na tym dużo czasu wczoraj i dzisiaj i doszedłem tylko do tego, że zamiast WM_COMMAND dałem WM_SYSCOMMAND tylko, że wtedy nie da się zamknąć aplikacji, zminimalizować jej, zmaksymalizować, przenieść itp. :/ Kurde pójde chyba do kumpla dzisiaj jak nic niewymyśle i porzycze od niego Kompedium programisty, tam coś było o komuniaktach, no chyba, że wcześniej ktoś z Was mi pomoże wejść na dobry trop [wstyd]

0

No fakt, nie zauważyłem, że tam był WM_COMMAND. Jednakże wcześniej mówiłem o WM_SYSCOMMAND :). A żeby działała minimalizacja itd, to musisz wywołać na końcu domyślną procedurę okienka.

Msg.Result:=DefWindowProc(Msg.Handle, Msg.Message, Msg.WParam, Msg.LParam);

Czy jakoś tak :).

0

[soczek] Wielkie dzięki thenkles już wszystko działa (w SPACJA końcu) [soczek]

0

hello a może o takie coś chodzi

W onClose użyj GetWindowPlacement
W onCreate użyj SetWindowPlacement

procedure TForm1.FormCreate(Sender: TObject);
var WndPlacement: PWindowPlacement;
begin
  //Load Config
  new(WndPlacement);
  WndPlacement.length:=SizeOf(WINDOWPLACEMENT);
  if configMaximized then begin
    WndPlacement.showCmd:=SW_SHOWMAXIMIZED;
    WndPlacement.rcNormalPosition:=Rect(100,100,200,200);
  end else begin
    WndPlacement.showCmd:=SW_SHOWNORMAL;
    WndPlacement.rcNormalPosition:=Rect(0,0,200,200);
  end;

  SetWindowPlacement(Handle,WndPlacement);
end;

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