Форум: "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