Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "KOL";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.262 c
2-1192027076
smaller
2007-10-10 18:37
2007.11.04
Как непрерывно выводить звук, с плавно меняющейся частотой?


15-1190820126
terc
2007-09-26 19:22
2007.11.04
HTML Расположения обьекта относительно другова обьекта


2-1191938001
em240
2007-10-09 17:53
2007.11.04
Возможно ли работать с DTS MSSQL 2000 как COM?


2-1192106178
GamerZone
2007-10-11 16:36
2007.11.04
Статус сервера


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский