Elo.
Mam taką zagwozdkę. Mam formę której szerokość użytkownik może sobie zmieniać, ale tylko dla określonych wartości i w pewien "dziarski" sposób. Już tłumaczę. Jak wiadomo gdy zmieniamy rozmiar okna najpierw rysuje nam się sama ramka zgodnie z pozycją kursora. Dopiero jak zwolnimy przycisk myszy, forma "fizycznie" zmieni rozmiar (o ile mamy w systemie wyłączone "pokazuj zawartość okien podczas przeciągania" czy jakoś tak, ale nie ważne. Chciałbym kontrolować zmianę rozmiaru okna już na poziomie rysowania tej ramki, czyli np. aby można było zmieniać rozmiar tylko co 40 pixeli (z pewnym marginesem aby użytkownik nie musiał dokładnie celować). Symulacja:
Forma ma Width powiedzmy 100. "Skok" rozmiaru co 40 pixeli:
Następuje zmiana rozmiaru (rysowanie ramki): 110 px (ramka zostaje na 100); 117px (ramka zostaje na 100); 130px (ramka zostaje na 100); 140 px (zgadza się, ramka wskakuje na 140 px); 156px (ramka pozostaje na 140)..... 180px (zgadza się, ramka wskakuje na 180); następuje "puszczenie" przycisku myszy, forma zmienia rozmiar na 180. Chyba wiadomo o co chodzi. Ale ja nie wiem jak to uzyskać. Tzn, moge przez OnCanResize, ale jak wiadomo, to jest wywołane dopiero w momencie zwolnienia przycisku myszy, czyli za późno. Szukając na forum, znalazłem coś takiego:
procedure Sizing(var Message: TMessage); message WM_SIZING;
To jest to czego potrzebuję, na bieżąco dostaję informację o szerokości rysowania ramki. Ale co dalej? Przydałby się jakiś prosty i szybki algorytm. Jest wieczór, cały dzień pracowałem przed komputerem i chyba stos mi się przepełnił, bo nie mogę wymyśleć nic sensownego :). Nie wiem właściwie czego szukam, nowy width powinien być chyba podzielny przez wartość "skoku":
procedure TMainForm.Sizing(var Message: TMessage);
var
PR:PRect;
aNewWidth: Integer;
const
SKOK = 40;
begin
PR := Pointer(Message.LParam);
//bo w PRect są wartości względem rozmiarów ekranu
aNewWidth := Pr.Right-Pr.Left;
//co tutaj?
if (....)<>(...) then
Abort;
end;
Nie wiem co więcej napisać :) . W ogóle nie wiem czy PRect jest potrzebny, może w którymś z przychodzących parametrów Message jest aktualna szerokość ramki, jeszcze nie sprawdzałem. Co jak szerokość jest niewłaściwa? Abort? Czy jakieś Result muszę zwrócić w Message? To wszystko to ogólnie taki bajer, ale dla samej istoty programowania, jestem ciekaw jak to rozwiązać :)
Pozdrawiam wszystkich i każdego z osobna.