Главная страница
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.02 c
15-1190959883
Layner
2007-09-28 10:11
2007.11.04
Кто тестил приложения написаные для Vista/D2007 на 2000/XP?


2-1192048120
smartleds
2007-10-11 00:28
2007.11.04
Господа подскажите как задать размер динамической матрицы


15-1191378171
Slider007
2007-10-03 06:22
2007.11.04
С днем рождения ! 3 октября 2007 среда


2-1192187209
kyn66
2007-10-12 15:06
2007.11.04
Окно не раскрывается полностью


3-1182706645
Jacky
2007-06-24 21:37
2007.11.04
Отслеживание статуса входящего потока данных