Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1191601109
редкий гость
2007-10-05 20:18
2007.11.04
проблемка с php


15-1191217125
Slider007
2007-10-01 09:38
2007.11.04
С днем рождения ! 1 октября 2007 понедельник


15-1191433347
ке
2007-10-03 21:42
2007.11.04
про формы


15-1190956669
Dmitry S
2007-09-28 09:17
2007.11.04
Фильтр DHCP


10-1139914636
Andy BitOff
2006-02-14 13:57
2007.11.04
Ворд. Макрос. При ворд=visible работает, а в фоне нет.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский