Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Липкие окна [Delphi, Windows]


ElectriC ©   (2007-03-27 17:29:00) 

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


ElectriC   (2007-03-30 23:26:00) [1]


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

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


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

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


ElectriC   (2007-03-29 23:29:00) [3]

Всё оки))


ElectriC   (2007-03-29 22:45:00) [4]


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

Попробуем!


D[u]fa   (2007-03-29 21:03:00) [5]

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


ElectriC   (2007-03-29 19:58:00) [6]


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

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

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

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


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

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

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


ElectriC   (2007-03-29 17:06:00) [8]


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

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


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

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


ElectriC   (2007-03-29 15:46:00) [10]

.


ElectriC   (2007-03-29 03:18:00) [11]

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

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. Последний мой вопрос по "прилипанию"!!!


Jon   (2007-03-29 02:14:00) [12]

Also see Thaddy's example:

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


ElectriC   (2007-03-29 01:24:00) [13]

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


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

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

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-28 21:31:00) [15]

Кстати, нашёл код (для 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?


ElectriC   (2007-03-27 18:45:00) [16]

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


SergeR   (2007-03-27 18:28:00) [17]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо