Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.04;
Скачать: CL | DM;

Вниз

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

Текущий архив: 2007.11.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
2-1192187209
kyn66
2007-10-12 15:06
2007.11.04
Окно не раскрывается полностью


2-1192084067
vamp_avp
2007-10-11 10:27
2007.11.04
реестр!!!


9-1086063518
КиТаЯц
2004-06-01 08:18
2007.11.04
GLScene форум


15-1191593116
Черный Шаман
2007-10-05 18:05
2007.11.04
Что лучше широкоформатка 16:9 или классика 4:3(мониторы)


2-1192104275
tytus
2007-10-11 16:04
2007.11.04
функция определения выбранного item-a