Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.04;
Скачать: CL | DM;

Вниз

Липкие окна   Найти похожие ветки 

 
ElectriC ©   (2007-03-27 17:29) [0]

Как заставить форму моей программы прилипать к краям экрана?


 
SergeR ©   (2007-03-27 18:28) [1]

Смотреть координаты формы при перемещении и при разнице границ окна и экрана, например, в 10 пикселов менять Myform.left и Myform.top на нужные.


 
ElectriC ©   (2007-03-27 18:45) [2]

Ясно, попробуем!


 
ElectriC ©   (2007-03-28 21:31) [3]

Кстати, нашёл код (для VCL), который позволяет прилипать окнам к краям экрана:
...

 private
  procedure WMWINDOWPOSCHANGING
           (var Msg: TWMWINDOWPOSCHANGING);
            message WM_WINDOWPOSCHANGING;
...

procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
var
 WorkArea : TRect;
 StickAt  : Word;
begin
 StickAt := 10;
 SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
 with WorkArea, Msg.WindowPos^ do
  begin
    Right  := Right  - cx;
    Bottom := Bottom - cy;
    If abs(Left   - x) <= StickAt then x := Left;
    If abs(Right  - x) <= StickAt then x := Right;
    If abs(Top    - y) <= StickAt then y := Top;
    If abs(Bottom - y) <= StickAt then y := Bottom;
  end;
inherited;
end;
Подскажите, как можно этот код переделать, чтобы он работал в KOL?


 
Дмитрий К   (2007-03-29 00:30) [4]

Примерно так:

program stick;

uses windows, messages, kol;

type
 PForm1 = ^TForm1;
 TForm1 = object(TObj)
   form, btn: pcontrol;
 public
   function DoMessage(var Msg: TMsg; var Rslt: Integer):Boolean;
   procedure DoClick(Sender: PObj);
 end;
var Form1: PForm1;
{ TForm1 }

procedure TForm1.DoClick(Sender: PObj);
begin
 form.close;
end;

function TForm1.DoMessage(var Msg: TMsg; var Rslt: Integer): Boolean;
var
WorkArea : TRect;
StickAt  : Word;
wp: PWindowPos;
begin
 result:=false;
 if msg.message = WM_WINDOWPOSCHANGING then
 begin
   StickAt := 10;
   SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
   wp:=PWindowPos(msg.lParam);
   with WorkArea, wp^ do
   begin
     Right  := Right  - cx;
     Bottom := Bottom - cy;
     If abs(Left   - x) <= StickAt then x := Left;
     If abs(Right  - x) <= StickAt then x := Right;
     If abs(Top    - y) <= StickAt then y := Top;
     If abs(Bottom - y) <= StickAt then y := Bottom;
   end;
 end;
end;

begin
 New(Form1,Create);
 with Form1^ do
 begin
   form:=NewForm(nil,"Sticky");
   form.Add2AutoFree(Form1);
   applet:=form;
   form.OnMessage:=DoMessage;
   btn:=NewButton(form, "Close").CenterOnParent;
   btn.onClick:=DoClick;
 end;
 run(applet);
end.


 
ElectriC ©   (2007-03-29 01:24) [5]

Ok! Попробуем!


 
Jon ©   (2007-03-29 02:14) [6]

Also see Thaddy"s example:

http://delphi.blue-aura.co.uk/forum/showthread.php?t=559


 
ElectriC ©   (2007-03-29 03:18) [7]

А почему, при:

If (Msg.message = WM_WINDOWPOSCHANGING) and (CheckBox.Checked) then
begin
   StickAt := 10;
   SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
   wp      := PWindowPos(msg.lParam);

   with WorkArea, wp^ do
     begin
        Right  := Right  - cx; Bottom := Bottom - cy;

        If abs(Left   - x) <= StickAt then x := Left;
        If abs(Right  - x) <= StickAt then x := Right;
        If abs(Top    - y) <= StickAt then y := Top;
        If abs(Bottom - y) <= StickAt then y := Bottom;
     end;
end;

возникает ошибка?
P.S. Хочу, чтобы программа проверяла, если CheckBox1.Checked then окно прилипает к краям экрана else окно не прилипает к краям экрана. Не подскажете, как сделать?
P.P.S. Последний мой вопрос по "прилипанию"!!!


 
ElectriC ©   (2007-03-29 15:46) [8]

.


 
D[u]fa ©   (2007-03-29 16:19) [9]

какая ошибка то хоть? может из-за CheckBox.Checked а может еще чего.. телепатить не умею


 
ElectriC ©   (2007-03-29 17:06) [10]


> может из-за CheckBox.Checked

Да, из-за CheckBox.Checked!!!


 
Vladimir Kladov   (2007-03-29 19:17) [11]

Может возникать рекурсия. Попытка изменить позицию в обработчике WM_WINDOWPOSCHANGING приводит к тому, что система шлет это сообщение еще раз. И т.д.

Вы хотя бы ошибку указывайте, когда сообщаете. Человечество утратило способности к телепатии в результате глобальной катастрофы, произошедшей много тысяч лет назад. Наверное.


 
ElectriC ©   (2007-03-29 19:58) [12]


> Вы хотя бы ошибку указывайте

Пожалуйста!))) Вот ошибка:

Project D:\Проекты(Delphi)\MyKol\MyKol.exe with message
"ACCESS VIOLATION AT 0x004072b0: READ OF ADDRESS 0x000004b5".
Process Stopped.

Что нужно изменить, чтобы не возникало этой ошибки? (Если можно, то по подробней объясняйте).


 
D[u]fa ©   (2007-03-29 21:03) [13]

создай переменную и в нее сохрани значение CheckBox1.Checked и в своей процедуре исп уже ее


 
ElectriC ©   (2007-03-29 22:45) [14]


> создай переменную и в нее сохрани значение CheckBox1.Checked
> и в своей процедуре исп уже ее

Попробуем!


 
ElectriC ©   (2007-03-29 23:29) [15]

Всё оки))


 
Don ©   (2007-03-30 16:38) [16]

Ошибка скорее всего была из-за того, что сообщение WM_WINDOWPOSCHANGING приходило во время создания формы, а CheckBox1 еще не был создан.


 
ElectriC ©   (2007-03-30 23:26) [17]


> Ошибка скорее всего была из-за того, что сообщение WM_WINDOWPOSCHANGING
> приходило во время создания формы, а CheckBox1 еще не был
> создан.

Понятно! Будем"с знать!



Страницы: 1 вся ветка

Текущий архив: 2007.11.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
6-1172949074
Den81
2007-03-03 22:11
2007.11.04
WebBrowser и Java функции


15-1190800801
ТТ
2007-09-26 14:00
2007.11.04
компиляция-оптимизация


2-1192091776
AIK
2007-10-11 12:36
2007.11.04
Загрузить файл с помощью перетаскивания его курсором


15-1190814358
Галинка
2007-09-26 17:45
2007.11.04
что почитать про VMWare


2-1191920306
andreil
2007-10-09 12:58
2007.11.04
Delphi не может использовать переменные из моих модулей?