Форум: "KOL";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
ВнизHow to drag Form или как таскать форму Найти похожие ветки
← →
Nsp (2007-04-01 01:12) [0]Здравствуйте,
чтобы избежать возможного недоумения, скажу сразу, что я не программист по професии, но с основами программирования на знаком по университетскому курсу. Пишу для себя маленькие утилитки.
Ну не любю я лишнего - наверное жизненная философия у меня такая. И потому не приемлю утилиты, которые выполняют несколько простеньких операций, но «весят» при этом сотни килобайт. Отсюда и интерес к KOL.
А по сути вопрос такой:
- как сделать так, чтобы форму можно было таскать за любую точку её поверхности?
← →
mdw © (2007-04-01 01:36) [1]Примерно так:
function TForm1.OnMessage(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result:= False;
if Msg.message = WM_LBUTTONDOWN then begin
form.Perform(WM_NCLBUTTONDOWN, HTCAPTION, Msg.lParam);
Result:= True;
end;
end;
← →
Nsp (2007-04-01 14:04) [2]Спасибо, что не оставили мой вопрос без внимания.
Я конечно же пытался разобраться сам, прежде чем задавать этот вопрос на форуме. В том числе читал FAQ по KOL и конкретно вопрос "Как обрабатывать произвольное сообщение WM_XXX?" Читал и «Книгу о KOL» "2.23.8 Сообщения" - там тоже похожее описание, правда в примере почему-то не function, а procedure стоит - наверное опечатка.
Нашел кое-что и в «Delphi Russian Knowledge Base».
И вот что у меня из всего этого получилось:
program DragForm;
uses
Windows, messages, KOL;
var Form1: PControl;
function DragMain(var Msg: tagMSG; var rslt: Integer): Boolean;
begin
Result:=false;
If Msg.message = WM_NCHITTEST Then Form1.Perform(WM_NCHITTEST, HTCAPTION, 0);
Result:=true;
end;
begin
Form1:=NewForm(Applet, "Probnaja forma");
Form1.CenterOnParent;
Form1.Style:=WS_BORDER;
Form1.OnMessage:=TOnMessage(MakeMethod(nil, @DragMain));
Run(Form1);
end.
Очень похоже.
Однако в этом случае вылетает ошибка "Runtime error 216" (Access violation).
Замена в коде Msg.message = WM_NCHITTEST -> Msg.message = WM_LBUTTONDOWN и Form1.Perform(WM_NCHITTEST, HTCAPTION, 0) -> Form1.Perform(WM_NCLBUTTONDOWN, HTCAPTION, msg.lParam); приводит к той же ошибке.
Ошибка происходит именно при проверке условия Msg.message = WM_LBUTTONDOWN
Но быть может на самом деле это из-за того, что я неверно саму функцию вызываю? А как тогда правильно?
P.S. Может быть кому-то это покажется первоапрельской шуткой. Пусть так, не судите строго. Только подскажите как правильно. :-)
← →
danger © (2007-04-01 15:49) [3]
> Однако в этом случае вылетает ошибка "Runtime error 216"
> (Access violation).
> Замена в коде Msg.message = WM_NCHITTEST -> Msg.message
> = WM_LBUTTONDOWN и Form1.Perform(WM_NCHITTEST, HTCAPTION,
> 0) -> Form1.Perform(WM_NCLBUTTONDOWN, HTCAPTION, msg.lParam);
> приводит к той же ошибке.
Читайте FAQ, там рассматривается этот вопрос. Если конкретно, то проблема в DragMain - на самом деле, ей передается на один параметр больше, чем указано у вас.
← →
Nsp (2007-04-01 18:10) [4]Спасибо, что напомнили, с вашей помощью разобрался.
Правда в FAQ на этот вопрос особого внимания не обращается. То есть конечно есть в ответе на вопрос "Как правильно оформить вызов модальной формы?" нужные места в примерах кода, но если знать не будешь - догадаться сложно, что именно здесь "собака порылась". А вот в «Статьях и уроках о KOL и MCK» в части 3 <url=http://www.kolnmck.ru/lessons/createcomp3.shtml>«Создание визуального KOL компонента: Сфера вид сбоку»</url> имеется пример с правильно оформленной функцией. Однако действительно подробно внимание этому уделяется в «Книге о KOL» в Приложении А.
Но это так, для тех может быть, кто когда-нибудь столкнется с этим вопросом.
Спасибо всем, кто откликнулся.
Среди параметров функции не хватало самого первого - Sender
Рабочий код выглядит так:
program DragForm;
uses
Windows, messages, KOL;
var Form1: PControl;
function DragMain(Sender: PControl; var Msg: tagMSG; var rslt: Integer): Boolean;
begin
Result:=false;
If Msg.message = WM_LBUTTONDOWN Then
begin
Form1.Perform(WM_NCLBUTTONDOWN, HTCAPTION, Msg.lParam);
Result:=true;
end;
end;
begin
Form1:=NewForm(Applet, "Пробная форма");
Form1.CenterOnParent;
Form1.Style:=WS_BORDER;
Form1.OnMessage:=TOnMessage(MakeMethod(nil, @DragMain));
Run(Form1);
end.
Еще раз спасибо всем, кто помог разобраться.
P.S. Осталось только ещё разобраться почему данный код и в самом деле функционирует с WM_NCLBUTTONDOWN , но не функционирует с WM_NCHITTEST (как это описано в «Delphi Russian Knowledge Base»)?
← →
Danger © (2007-04-01 20:10) [5]
> Спасибо, что напомнили, с вашей помощью разобрался.
> Правда в FAQ на этот вопрос особого внимания не обращается.
Этот вопрос рассмотрен в http://www.kolnmck.ru/lessons/faq.shtml#12 , ну и в дополнительных источниках ("Статьи и уроки .... "), конечно, тоже есть.
> Однако в этом случае вылетает ошибка "Runtime error 216"
> (Access violation).
Использование err.pas было бы информативней при отладке. По крайней мере, не безликое сообщение :)
← →
Nsp (2007-04-01 21:04) [6]>> Правда в FAQ на этот вопрос особого внимания не обращается.
>Этот вопрос рассмотрен в http://www.kolnmck.ru/lessons/faq.shtml#12
Я и говорю, что не будешь знать в чем дело - не догадаешься. Хотя может быть это потому, что я не профессиональный программист и мне это неочевидно.
Вопрос там поставлен так:
«У меня в KOL при присвоении события просходят странные вещи -прога не вылетает, зависает или событие всегда приходит с пустыми параметрами - почему?»
Ответ звучит так:
Надо делать так
[и далее идут только примеры]
Примеры - это нужно, это хорошо, но ответа на поставленный вопрос "почему" - нет. Должно быть этой "малости" мне и не хватило в FAQ, чтобы разобраться, вспомнить и понять.
Ответ на этот вопрос дается только в «Книге о KOL» в Приложении А.
Но это мелочи.
Одна ваша фраза «... на самом деле, ей передается на один параметр больше ...» позволила обнаружить причину ошибки.
Спасибо вам.
← →
Danger © (2007-04-01 23:02) [7]Nsp [6]
> Вопрос там поставлен так:
> «У меня в KOL при присвоении события просходят странные
> вещи -прога не вылетает, зависает или событие всегда приходит
> с пустыми параметрами - почему?»
> Ответ звучит так:
> Надо делать так
> [и далее идут только примеры]
Да, почему-то на сайте (kolnmck.ru) этот вопрос в FAQ теперь изменен (и на мой взгляд, не в лучшую сторону). У меня сохранилась старая версия KOL FAQ, где этот вопрос очень хорошо рассмотрен, с комменариями и примерами.
To mdw и MTsvDN: Раз вопрос выносится в FAQ, я думаю, стоит его подробнее рассматривать. Предлагаю отредактировать этот вопрос, добавить деталей и причины проблемы; или вернуть старый вариант.
← →
mdw © (2007-04-02 12:15) [8]Так, в чем же дело? Отредактируйте этот вопрос, добавте деталей и причины проблемы и добавим в FAQ.
Я не очень понял в чем проблема. В том, как таскать форму за любую точку её поверхности? так вопрос к KOL не относится. Или в использовании функции MakeMethod? так в описании все написано...
Но если считаете что, что-то нужно добавить в FAQ, то без проблем, подготовте материалы и или сюда или на мыло, выложу:))
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c