Часто задаваемые вопросы о KOL и MCK
Ведущий раздела KOL и MCK: Анатолий aka XVeL
Автор: Борис Моренко
Список вопросов:
1. Как обрабатывать
произвольное сообщение WM_XXX?
2. Вот я свойства формы меняю,
у меня ничего не выходит, в чем дело?
3. Я задал форме событие
OnCreate - а она не реагирует?
4. А будет (есть ли уже) ли
KOL под Builder, Kylix, Lazarus, FreePascal и т.п.?
5. Я вот на KOL программу
написал, а если я ее на MCK перепишу, она сильно увеличиться в размере?
6. А где тут в KOL свойство
Name?
7. Я вот хочу RTTI пользовать,
пишу (MySuper as(is) TSmth) - а меня компилятор ругает - почему?
8. Как узнать handle у
kol-формы?
9. Мне нужен StatusBar - где я
могу найти этот компонент?
10. У меня в KOL, при (после)
присвоении (выполнения) события, просходят странные вещи - прога вылетает,
зависает или событие всегда приходит с пустыми параметрами - почему?
11. Как поменять иконку у
формы (Design-Time)?
12. Где StrToInt (и IntToStr)
в KOL ?
13. Что такое KOL? Что такое
MCK?
14. Зависит ли размер
программы, сделанной с помощью KOL, от версии Delphi?
15. Библиотека KOL
развивается, добавляются новые события, свойства, методы. Не опасаетесь ли
Вы, что ваша библиотека раздуется до таких же размеров, как VCL? (И в чем
тогда смысл изобретать велосипед...)
16. Я устанавливаю
дополнительный MCK-компонент XXXXX в Delphi6. Создаю package, добавляю
модуль XXXXX.pas, пытаюсь package установить, а в ответ получаю сообщение,
что не найден модуль Proxies.dcu. И где я только такой модуль не искал, не
могу найти. Что делать?
17. У меня в
MirrorKOLPackageD6 (MirrorKOLPackageD7) уже имеется ссылка на
designide.dcp, но проект не компилируется: Delphi требует файл proxies.pas
(dsgnintf.pas). Где взять такой файл?
18. Я использую замену
sys*.dcu, но не могу использовать Write и другие подобные функции для
работы с текстовыми файлами. Как мне заставить их работать?
19. Я не использую замену
sys*.dcu, но не могу использовать try-except. Что нужно сделать, чтобы
обработка исключительных ситуации работала правильно?
20. Как реализовать кнопку по
умолчанию, срабатывающую на нажатию клавиши Enter или Escape?
21. У меня установлен шрифт
125%. В VCL есть у формы свойство Scaled. Достаточно поставить его в
False, и надписи на кнопках, метках и т.д. помещаются вне зависимости от
разрешения экрана. Как сделать то же самое в KOL?
22. Когда используется
переменная Applet, анимация при минимизации происходит не с позиции
главной формы, а от верхнего левого угла экрана. Как это поправить?
23. Как сделать DLL,
содержащую форму, изготовленную в KOL, и правильно вызвать ее?
24. Как правильно оформить
вызов модальной формы?
25. Возможно ли разрабатывать
DLL, содержащую формы KOL визуально, используя MCK?
26. Я хочу перемещать кнопку
(или другой визуальный элемент) с помощью мыши. Как это сделать?
27. Как рисовать прямо на
рабочем столе, используя объект канвы (PCanvas) ?
28. Есть ли возможность в KOL
работать с текстом через буфер обмена ?
29. При генерации raise в
программе,запущенной в Delpi IDE, и прога и делфи виснут. Что делать и как
жить ?
30. Есть ли в KOL готовый
компонент-аналог TPageControl для VCL?
31. Где найти новые версии
KOLnMCK?
32. В новостях написано вышла
версия XYZ, а на сайте (Кладова - оффициальном!) выложенна ABC (
XYZ>ABC ), че за беспридел?
33. Ну есть у меня XYZ.upd и
что дальше, как Update применять? |
Ответы
Вопрос : Как обрабатывать произвольное сообщение
WM_XXX? |
Элементарно :) Надо использовать событие OnMessage, которое
есть у любого (практически, в разумных пределах) компонента. Делаем так:
function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result := False;
if Msg.message = WM_XXX then
begin
// тут идет работа с сообщением, делаем что хотим
// фактически 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 код
больше на одну строку, чем мог бы быть, во как! Правда, это обещали
устранить). Но повторюсь, что эти ситуации очень редки и увеличение код
очень незначительно, как что можно сказать (с большой долей вероятности) -
что размер не измениться вообще.
Наверх
|
Вопрос : А где тут в KOL свойство Name? |
Нигде. Его просто нет. Вообще ситуации, когда Name нужен
настолько редки, что вопрос о его введении в KOL даже не стоит. Нет,
небыло и не будет.
Наверх
|
Вопрос : Я вот хочу RTTI пользовать, пишу (MySuper
as(is) TSmth) - а меня компилятор ругает - почему? |
В KOL нет RTTI, поскольку используется "старая" ООП-модуль
(не class, а object). В итоге вместо MySuper as TSmth пишем
PSmth(MySuper), а вместо MySuper is TSmth пишем
TSmth.AncestorOfObject(MySuper)
Наверх
|
Вопрос : Как узнать handle у kol-формы? |
Form1.Form.Handle или просто Form.Handle.
Наверх
|
Вопрос : Мне нужен StatusBar - где я могу найти этот
компонент? |
Во превных есть "придаточный компонент"
Form1.Form.StatusCtl. Но пользоваться им не очень удобно. Для задания
одной строки ("протой") достаточно изменить свойство
KOLForm1.StatusSimpleText (MCK) или Form1.Form.SimpleStatusText (KOL).
Если же нужно нечто по мощнее можно использовать StatusText и
StatusPanelRightX. Например:
Form1.Form.StatusText[0] := 'first part';
Form1.Form.StatusText[1] := 'secord part';
Form1.Form.StatusPanelRightX[0] := 15; В
результате получите две сектиции, причем правая граница первой секции
будет 15 пикселов от начала StatusBar. Да учтите, что сами панели
создаются присвоением StatusText, потому важен поряд следования строк. И
правая граница всех секций отсчитывается от одного "нуля" (Т.е. это НЕ
ширина, а именно X-координата!).
Наверх
|
Вопрос : У меня в KOL, при (после) присвоении
(выполнения) события, просходят странные вещи - прога вылетает, зависает
или событие всегда приходит с пустыми параметрами - почему? |
Вопрос стал классическими граблями, потому я еще раз его
переделал, и даже малость переформулировал (чтобы привлечь дополнительное
внимание). Когда я вижу в форуме вопрос подобного характера у меня "разум
теряется", хочется крикнуть RTFM и нечто подобное, так что большая просьба
его не задавать. При возникновении схожих симптомов обязательно вспомнить
сей вопрос и ответ. Отмечу, что сие свойственно исключительно "чистым"
KOL-писателям, те, кто используют MCK, вряд ли встретят такое, но в любом
случаи это надо знать. Это была преамбула, теперь амбула... Ситуация
тривиальна, имеем объект (кнопка Button1) и хотим присвоить событие (для
OnClick, MyClick), это делается так:
Button1.OnClick := TOnEvent(MakeMethod(nil, @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 (если это процедура, но не метод
объекта!). Потому нам придется писать:
procedure MyClick( Dummy: Pointer; Sender: PObj );
begin
PControl(Sender).Caption := 'Dummy Is!';
end;
В
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 - и не надо, все работает.
Наверх
Вопрос : Как поменять иконку у формы (Design-Time)?
|
Есть два пути (может и больше, но я других незнаю :): I)
(Простой и только для одной формы - "Главной")
- Установиливаем KOLProject1.dprResource:=True
- Delphi-Menu->Project->Options->Application->Icon->Load
Icon (Выбираем нужную иконку)
II) (Сложный, но для любой формы)
- Создаем в Блокноте новый файл: ITISWILLBEICONNAME ICON
"MySuperIcon.ico"
- Сохраняем его как MyIconResoure.rc
- Берем нужную нам иконку и переименовываем в MySuperIcon.ico
- Ищем файл BRCC32.EXE (если есть Дельфи, есть и он)
- Перетаскиваем на него (на файл BRCC32.EXE) MyIconResoure.rc и
получаем MyIconResoure.Res
- Копируем MyIconResoure.Res в папку с проектом
- Пишем в программе код: {$R MyIconResoure.RES}
- Ставим KOLForm1 (Ту KOL-форму, у которой надо поменять иконку)
свойство Icon:= ITISWILLBEICONNAME
Последние пункты общие:
- Rebuild-им проект (В случаи I, Дельфи выдаст ошибку - "Can not find
resource file: *. Recreated.", все нормально, жмем OK)
- Долго радуемся
Наверх
|
Вопрос : Где StrToInt (и IntToStr) в KOL ?
|
Используй Str2Int (Int2Str).
Наверх
|
Вопрос : Что такое KOL? Что такое MCK? |
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 этот модуль не
требуется.
Наверх
|
Вопрос : Как реализовать кнопку по умолчанию,
срабатывающую на нажатию клавиши Enter или Escape? |
Использовать событие Applet.OnMessage (см. пример в
TestKOL4).
Наверх
|
Вопрос : У меня установлен шрифт 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;
begin
if (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;
См.
также соответствующий Demo-проект.
Наверх
|
Вопрос : Как правильно оформить вызов модальной
формы? |
Всего имеется два варианта. Более простой, когда модальная
форма создается непосредственно перед показом и разрушается сразу после
того, как модальный диалог завершен - проще. И не требует использования
отдельного объекта 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; // любое значение <> 0
end;
Чуть
посложнее случай, когда форма существует (и обычно невидима), ее нужно
модально показать, но не уничтожать по завершении диалога, а просто
скрыть. В этом случае использование отдельного объекта 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; // любое значение <> 0
end;
Заметьте,
что в обоих случаях за финальные действия (Close или Hide) отвечает код,
инициирующий диалог, а не код, принадлежащий самой модальной форме.
Наверх
|
Вопрос : Возможно ли разрабатывать DLL, содержащую
формы KOL визуально, используя MCK? |
Конечно. Создайте проект MCK как обычно, и затем измените
слово program в dpr-file на library. Сделайте формы не автоматически
создаваемыми, и добавьте экспортируемые функции подобно тому, как это
показано в ответе на предыдущий вопрос. Чтобы предотвратить срабатывание
Run( Applet ), измените файл <ваш_проект>_1.inc. Например, допишите
туда:
Наверх
|
Вопрос : Я хочу перемещать кнопку (или другой
визуальный элемент) с помощью мыши. Как это сделать? |
Следующий код работает для всех типов визуальных объектов,
включая кнопки:
procedure TForm1.BitBtn1MouseMove(Sender: PControl; var Mouse: TMouseEventData);
begin
if FBtn1Down then
BitBtn1.DragStartEx;
end;
procedure TForm1.BitBtn1MouseDown(Sender: PControl; var Mouse: TMouseEventData);
begin
if Mouse.Button = mbLeft then
FBtn1Down := TRUE;
end;
procedure TForm1.BitBtn1MouseUp(Sender: PControl; var Mouse: TMouseEventData);
begin
FBtn1Down := FALSE;
BitBtn1.DragStopEx;
end;
( переменная FBtn1Down: Boolean; должна быть объявлена в объекте TForm1 ). И,
для большинства типов визуальных объектов достаточен следующий код:
procedure TForm1.Panel1MouseDown(Sender: PControl; var Mouse: TMouseEventData);
begin
Panel1.DragStart;
end; Но
этот вариант не работает для кнопок, и обеспечивает перетаскивание только
при нажатой левой клавиши мыши.
Наверх
|
Вопрос : Как рисовать прямо на рабочем столе,
используя объект канвы (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;
Помещает в буфер обмена текст.
Наверх
|
Вопрос : При генерации raise в программе,запущенной в
Delpi IDE, и прога и делфи виснут. Что делать и как жить ? |
Приведенный ниже код работает даже при замене system.dcu.
Только в uses надо добавить ссылку на err.pas (из kol_err.zip), вот так:
{$IFDEF KOL_MCK}
uses Windows, Messages, ShellAPI, KOL {$IFNDEF KOL_MCK}, mirror, Classes,
Controls, mckCtrls, StdCtrls {$ENDIF}, err;
{$ELSE}
procedure TForm1.Button1Click(Sender: PObj);
begin
try
raise Exception.Create( e_Custom, 'raise' );
finally
//except //можно и эту строчку вместо finally выше
ShowMessage( 'finally' );
end;
end;
Наверх
|
Вопрос : Есть ли в KOL готовый компонент-аналог
TPageControl для VCL? |
TKOLTabControl.
Наверх
|
Вопрос : В новостях написано вышла версия 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'ом.
Наверх
|
|
|