Вопрос : Как обрабатывать произвольное сообщение
WM_XXX?
Элементарно :) Надо использовать событие OnMessage, которое
есть у любого (практически, в разумных пределах) компонента. Делаем так:
function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result := False;
if Msg.message = WM_XXX thenbegin// тут идет работа с сообщением, делаем что хотим// фактически OnXXX// Если мы не хотим, что бы это сообщение// обрабатывалось еще другим (стандартным) обработчиком// пишем// Result := True;// Если функция должна что?то возвращать системе в//ответ на сообщение, то пишем следующее:// Rslt := What_you_must_to_return;end;
end;
Rslt - это то, что
возвращается системе в ответ на сообщение. Result - это для процедуры
перечисления динамических обработчиков событий. Сигнал, что надо
прекратить дальнейшую обработку (true). А дальше - по обстоятельствам.
Если Result=FALSE, то Rslt установится следующим обработчиком или
обработчиком по умолчанию. Обычно Result устанавливается в TRUE
одновременно с установкой нужного Rslt, когда дальнейшая обработка уже
точно не нужна или вредна.
Вопрос : Вот я свойства формы меняю, у меня ничего не
выходит, в чем дело?
Менять надо свойства не формы, а компонента KOLForm, в MCK
наша большая и любимая форма потеряла свои функции, и теперь является лишь
носителем, посадочной площадкой MCK-компонентов. Конечно, некоторое
соответствие осталось, например - размеры формы. В остальном про нее можно
забыть.
Вопрос : Я задал форме событие OnCreate - а она не
реагирует?
И не будет. Почему? См. выше. Все сообщения, которые ты
раньше вязал к форме теперь надо вязать к KOLForm. Например, вместо
Form1.OnCreate надо KOLForm1.OnFormCreate.
Вопрос : А будет (есть ли уже) ли KOL под Builder,
Kylix, Lazarus, FreePascal и т.п.?
На данный момент такого НЕТ! KOLnMCK - Delphi only and
for... кххх... В смысле пока только под Дельфи. Насчет будущего -
насколько я знаю создатель (Владимир Кладов - не путать с Создатель :) не
собирается портировать KOLnMCK на Builder, Kylix, Lazarus... и т.д. Ему
это не надо. Насчет того возможно ли это, под Builder вообщем-то нет
проблем - нужно только время и желание. Под Kylix - вообще
мульти-платформенность=универсальность, а, как известно это против
идеологии KOL ("Ничего лишнего!" - сам придумал :). Придется идти на
компромисс с идеологией, а как говаривал товарищ Ленин - нам такой хоккей
не нужен. Это я про совмещение. Правда, можно KOL с нуля переделать под
Kylix. И оставить голый Линух. Но это уже будет не KOL, а KYOLL (KeY
Object Linux Library) наверное. Насчет "иных" компиляторов - там проблемы
с совместимостью ООП-модели, придется перелопачивать море кода, подгоняя
сначала KOL под компилятор, а потом компилятор под KOL, а собственно ради
чего? Вот может в будущем ситуация изменится к лучшему. Еще конечно всегда
есть надежна на энтузиастов.
Вопрос : Я вот на KOL программу написал, а если я ее
на MCK перепишу, она сильно увеличиться в размере?
Если сильно не повезет байт на 10. А в теории размер не
должен меняться вообще (почему? см. вопрос 1), хотя есть редкие ситуации и
редкие компоненты, когда, отказавшись от MCK можно написать код немного
меньший (примером может, является использование MHUpDown с Buddy, MCK код
больше на одну строку, чем мог бы быть, во как! Правда, это обещали
устранить). Но повторюсь, что эти ситуации очень редки и увеличение код
очень незначительно, как что можно сказать (с большой долей вероятности) -
что размер не измениться вообще.
Вопрос : Я вот хочу RTTI пользовать, пишу (MySuper
as(is) TSmth) - а меня компилятор ругает - почему?
В KOL нет RTTI, поскольку используется "старая" ООП-модуль
(не class, а object). В итоге вместо MySuper as TSmth пишем
PSmth(MySuper), а вместо MySuper is TSmth пишем
TSmth.AncestorOfObject(MySuper)
Вопрос : Мне нужен StatusBar - где я могу найти этот
компонент?
Во превных есть "придаточный компонент"
Form1.Form.StatusCtl. Но пользоваться им не очень удобно. Для задания
одной строки ("протой") достаточно изменить свойство
KOLForm1.StatusSimpleText (MCK) или Form1.Form.SimpleStatusText (KOL).
Если же нужно нечто по мощнее можно использовать StatusText и
StatusPanelRightX. Например:
В
результате получите две сектиции, причем правая граница первой секции
будет 15 пикселов от начала StatusBar. Да учтите, что сами панели
создаются присвоением StatusText, потому важен поряд следования строк. И
правая граница всех секций отсчитывается от одного "нуля" (Т.е. это НЕ
ширина, а именно X-координата!).
Вопрос : У меня в KOL, при (после) присвоении
(выполнения) события, просходят странные вещи - прога вылетает, зависает
или событие всегда приходит с пустыми параметрами - почему?
Вопрос стал классическими граблями, потому я еще раз его
переделал, и даже малость переформулировал (чтобы привлечь дополнительное
внимание). Когда я вижу в форуме вопрос подобного характера у меня "разум
теряется", хочется крикнуть RTFM и нечто подобное, так что большая просьба
его не задавать. При возникновении схожих симптомов обязательно вспомнить
сей вопрос и ответ. Отмечу, что сие свойственно исключительно "чистым"
KOL-писателям, те, кто используют MCK, вряд ли встретят такое, но в любом
случаи это надо знать. Это была преамбула, теперь амбула... Ситуация
тривиальна, имеем объект (кнопка Button1) и хотим присвоить событие (для
OnClick, MyClick), это делается так:
Тут
все нормально. Теперь надо сворганить сам MyClick, так-с смострит
объявление TOnEvent:
TOnEvent = procedure( Sender: PObj ) of object;
И делаем:
procedure MyClick(Sender: PObj );
begin
PControl(Sender).Caption := 'Dummy Is!';
end;
Кажется,
что граблей нет... жмем F9, потом Button1 - И получаем по голове! В чем же
дело??? Если теперь проследить Debug'ор состояние Sender увидим, что он
nil. А-а-а ну все понятно, конечно, как это мы хотели nil.Caption:='Что то
там'. А где же Sender? Сейчас разберемся, и так объявление TOnEvent на
сцену:
TOnEvent = procedure( Sender: PObj ) of object;
Вот из-за этого словечка, у нас нечего не выходит, получается, что первое
место, всегда забито под Pointer=nil (если это процедура, но не метод
объекта!). Потому нам придется писать:
В
Dummy всегда nil, поскольку от такого параметра толку "нуль" (нет, даже
"ноль"), он и зовется Dummy (англ. если не знаете, посмотрите в словаре -
прим. переводчика). Дубль два... F9, Button1, Ура! Теперь если у нас это
не просто процедура, а метод, то выглядеть это будет так:
public
procedure MyClick(Sender: PObj );
procedure TForm1.MyClick(Sender: PObj );
begin
PControl(Sender).Caption := 'Dummy Is!';
end;
Button1.OnClick := MyClick;
Как
видим, никаких Dummy - и не надо, все работает.
KOL - это библиотека объектных типов для программирования в
среде Delphi. Основная цель KOL - уменьшение размера конечной программы
(Win32, GUI) в 5-10 раз по сравнению с тем, что дает VCL. Поддерживаются
все 32-разрядные версии Delphi, начиная с Delphi2 и заканчивая Delphi6.
MCK - это набор зеркальных компонент, позволяющих разрабатывать проект на
основе библиотеки KOL визуально. Компоненты MCK устанавливаются на палитру
компонентов, работа с ними происходит так же, как это обычно делается в
Delphi при визуальной разработк. В откомпилированном проекте визуальные
компоненты замещаются своими невизуальными двойниками из KOL.
Использование MCK сокращает размер исполнимой программы так же, как и при
использовании KOL невизуально. Преимущество - визуальная разработка.
Недостаток - зависимость от версии Delphi.
Вопрос : Зависит ли размер программы, сделанной с
помощью KOL, от версии Delphi?
В очень малой степени. Разница между версиями Delphi3 и
Delphi5 может колебаться (обычно) в пределах 1Кбайта, причем в любую
сторону. Однако, замена system.dcu предлагается пока только для Delphi5 и
Delphi6, а с этой заменой программа может быть еще на 9-10К меньше. Так
что выбирайте сами.
Вопрос : Библиотека KOL развивается, добавляются
новые события, свойства, методы. Не опасаетесь ли Вы, что ваша библиотека
раздуется до таких же размеров, как VCL? (И в чем тогда смысл изобретать
велосипед...)
Нисколько! Благодаря своей продуманной организации, KOL
позволяет компилятору Delphi использовать так называемый smart-linking
(дословно: "остроумное связывание"). Возьмем, к примеру, одно из
дополнений: событие OnDropFiles (добавлено 1 мая 2001, v0.71). Если оно не
используется и не назначено, код программы не увеличивается НИ НА ОДИН
БАЙТ. И только в случае, когда такое событие использовано в конечной
программе, из библиотеки будет добавлен код двух процедур: метода
SetOnDropFiles и процедуры WndProcDropFiles. Все дело в том, что на
процедуру WndProcDropTarget имеется ссылка только из метода SetDropTarget,
на который ссылка появляется только в случае явного присваивания значения
событию OnDropTarget. И так устроена практически вся библиотека. (Так
должна была бы быть построена VCL, но поскольку она устроена НЕ ТАК, то
она и не может конкурировать с KOL в плане экономии кода, подключаемого к
исполнимой программе).
Вопрос : Я устанавливаю дополнительный MCK-компонент
XXXXX в Delphi6. Создаю package, добавляю модуль XXXXX.pas, пытаюсь
package установить, а в ответ получаю сообщение, что не найден модуль
Proxies.dcu. И где я только такой модуль не искал, не могу найти. Что
делать?
Это обычная ситуация для Delphi6. Добавьте в части
использования ссылку на DesignIDE.dcp. Не забудьте также указать в опциях
пакета 'Design time only' и 'Rebuild as needed' - это касается в том числе
любой другой версии Delphi (начиная с D3).
Вопрос : У меня в MirrorKOLPackageD6
(MirrorKOLPackageD7) уже имеется ссылка на designide.dcp, но проект не
компилируется: Delphi требует файл proxies.pas (dsgnintf.pas). Где взять
такой файл?
Ваш проект не является проектом MCK. Пожалуйста, прочитайте
внимательно инструкцию - "III. НАЧАЛО НОВОГО ЗЕРКАЛЬНОГО ПРОЕКТА". Или,
возможно, пропали какие-то файлы, содержащие важную информацию об опциях
проекта. Правильные опции можно посмотреть, создав новый проект в
соответствии с инструкцией, и открыв
Projects|Options|Directories\Conditions. Строка Conditional defines должна
содержать символ KOL_MCK, и в строке Unit aliases, обычное значение
"Classes=;mirror=". Установите такие же опции для вашего проекта.
Вопрос : Я использую замену sys*.dcu, но не могу
использовать Write и другие подобные функции для работы с текстовыми
файлами. Как мне заставить их работать?
Прочитать readme.txt :).
Вызвать процедуру UseInputOutput (один раз, например в
dpr-файле).
Вопрос : Я не использую замену sys*.dcu, но не могу
использовать try-except. Что нужно сделать, чтобы обработка исключительных
ситуации работала правильно?
Использовать в проекте модуль err.pas из пакета
kol_err.zip. Примечание: для правильной работы try-finally этот модуль не
требуется.
Вопрос : У меня установлен шрифт 125%. В VCL есть у
формы свойство Scaled. Достаточно поставить его в False, и надписи на
кнопках, метках и т.д. помещаются вне зависимости от разрешения экрана.
Как сделать то же самое в KOL?
В том-то и дело, что ничего делать не надо. Кроме того, что
прекратить использовать шрифт по умолчанию. Для этого достаточно
обратиться к свойству Font формы сразу после ее создания (в результате
происходит создание объекта TGraphicTool, реализующего шрифт, который в
последующем устанавливается текущим для окна). Или можно обратиться к
свойству Font окна приложения, родительского для всех форм. Например, так:
MyForm.Font; Или можно сразу же и изменить какое-либо свойство шрифта.
Например, установить новый стиль, цвет, размер. Учтите, что по умолчанию
шрифт получает значения, прописанные в глобальных переменных DefFontHeight
(20 пикселов), DefFontName ('MS Sans Serif') и т.д. В то же время, любые
дочерние визуальные контролы в момент создания унаследуют шрифт от
родительского окна (если шрифт установлен в родительском окне). Кроме
того, в настоящее время поддерживается свойство AutoSize для таких
визуальных объектов, как метка, кнопка, односточное поле ввода и т.п. В
сочетании с возможностью задавать выравнивание (Align) для любых
визуальных объектов это дает возможность обеспечить правильное отображение
форм независимо от текущих пользовательских установок.
Вопрос : Когда используется переменная Applet,
анимация при минимизации происходит не с позиции главной формы, а от
верхнего левого угла экрана. Как это поправить?
Использовать событие Applet.OnMessage:
function TSomeObject.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
beginif (Msg.message = WM_MOVE) or (Msg.message = WM_SIZE) then
Applet.BoundsRect := Form.BoundsRect;
Result := False;
end;
Или,
воспользоваться методом (в MCK - событием) MinimizeNormalAnimated.
Вопрос : Как сделать DLL, содержащую форму,
изготовленную в KOL, и правильно вызвать ее?
Создать форму как обычно и оттестировать ее в обычном
приложении, без DLL (форму можно создать визуально, используя MCK). Затем,
приготовить проект DLL, содержащий экспортируемую функцию:
function ExecuteKOLform( < some parameters > ): Integer; stdcall;
var MyKOLForm: PControl;
begin
Applet := NewApplet( '' );
MyKOLForm := NewForm( Applet, 'DllKolForm' );
... { здесь создать прочие элементы формы, проинициализировать, ... }
MyKOLForm.ShowModal;
... { здесь можно прочитать состояние некоторых
визуальных элементов, поскольку они все еще существуют }
Applet.Free;
end;
Вопрос : Как правильно оформить вызов модальной
формы?
Всего имеется два варианта. Более простой, когда модальная
форма создается непосредственно перед показом и разрушается сразу после
того, как модальный диалог завершен - проще. И не требует использования
отдельного объекта Applet (в MCK - не обязательно использовать компонент
TKOLApplet на главной форме).
// показ модального диалога с его созданием непосредственно перед
// началом диалога и с разрушением ? послеprocedure TForm1.Button1Click(Sender: PObj);
begin
NewForm2( Form2, Applet );
{ insert here any code to make changes before showing Form2 }
Form2.Form.ShowModal;
{ insert here any code to read some data from Form2 }
Form2.Form.Free; // нельзя использовать Close !
//ShowMessage( 'End of TForm1.Button1Click' );end;
// Для такого варианта достаточно определить вот такой обработчик
// какой?либо кнопки (но и он не требуется ? достаточно закрыть форму
// обычным образом, нажимая "крестик" в заголовке окна.procedure TForm2.Button1Click(Sender: PObj);
begin
Form.ModalResult := 1; // любое значение <> 0end;
Чуть
посложнее случай, когда форма существует (и обычно невидима), ее нужно
модально показать, но не уничтожать по завершении диалога, а просто
скрыть. В этом случае использование отдельного объекта Applet обязательно,
главная форма не может выполнять его роль. Для MCK-проекта это означает,
что на главную форму надо бросить компонент TKOLApplet.
// Показ диалога модально:procedure TForm1.Button1Click(Sender: PObj);
begin
Form2.Form.ShowModal;
Form2.Form.Hide;
end;
// Завершение диалога по кнопке:procedure TForm2.Button1Click(Sender: PObj);
begin
Form.ModalResult := 1;
end;
// Обязательно надо определить событие OnClose и предотвратить в нем
// закрытие формы:procedure TForm2.KOLForm1Close(Sender: PObj; var Accept: Boolean);
begin
Accept := FALSE; // предотвращаем закрытие формы
Form.ModalResult := ―1; // любое значение <> 0end;
Заметьте,
что в обоих случаях за финальные действия (Close или Hide) отвечает код,
инициирующий диалог, а не код, принадлежащий самой модальной форме.
Вопрос : Возможно ли разрабатывать DLL, содержащую
формы KOL визуально, используя MCK?
Конечно. Создайте проект MCK как обычно, и затем измените
слово program в dpr-file на library. Сделайте формы не автоматически
создаваемыми, и добавьте экспортируемые функции подобно тому, как это
показано в ответе на предыдущий вопрос. Чтобы предотвратить срабатывание
Run( Applet ), измените файл <ваш_проект>_1.inc. Например, допишите
туда:
Вопрос : Как рисовать прямо на рабочем столе,
используя объект канвы (PCanvas) ?
procedure TForm1.Toolbar1TB1Click(Sender: PControl; BtnID: Integer);
var
C: PCanvas;
D: HDC;
begin
D := GetDC( 0 );
C := NewCanvas( D );
C.LineTo( 400, 400 ); // используем здесь методы и свойства TCanvas
C.Free;
ReleaseDC( 0, D );
end;
Вопрос : Есть ли возможность в KOL работать с текстом
через буфер обмена ?
Да, есть такая возможность. Реализуется она с помощью
следующих функций: function Clipboard2Text: String; Возвращает из буфера
обмена текст. function Text2Clipboard( const S: String ): Boolean;
Помещает в буфер обмена текст.
Вопрос : В новостях написано вышла версия XYZ, а на
сайте (Кладова - оффициальном!) выложенна ABC ( XYZ>ABC ), че за
беспридел?
KOLnMCK весит уже 0.5МБ, и выкладывать весь архив при
каждом обновлении довольно накладно (да и скачивать), потому автор
выкладывает Update'ы, небольшие файлики - при помощи которых можно
"догнать" версию KOLnMCK до последней. Скачать Update'ы можно тут. Последний
Update еще тут.
Вопрос : Ну есть у меня XYZ.upd и что дальше, как
Update применять?
Для того чтобы применить Update необходима программа -
Updater 3.1 (последняя версия на момент написания FAQ - качать Updater).
Потом все просто:
Копируем XYZ.upd в папку с оригинальной версией KOLnMCK для которой
предназначен upd-файл.
Копируем туда же Updater.
Запускаем Updater.
Все!
О результатах вам доложат. Замечу что upd-файлы могут
применяться не только для KOLnMCK - они универсальны. Создаются при помощи
UpdateMaker, а патчится как уже упоминалось Updater'ом.
This is a FAQ (Frequently Asked Questions) document for the KOLnMCK library, which is a set of components and libraries for developing applications in Delphi. The document answers common questions about using KOLnMCK, including installation, usage, and tr
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.