Как создать библиотеку dll
-
- Сообщения: 1
- Зарегистрирован: Пт мар 19, 2010 11:20 am
Как создать библиотеку dll
Подскажите как создать библиотеку dll и прикрепить ее к FT на примере простого индикатора для Delphi7, интересен не код индикатора или советника, а порядок установки библиотеки.
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: Как создать библиотеку dll
После создания библиотеки заходите в тестере в меню Файл -> Установить новый индикатор/стратегию.Эдуард писал(а):Подскажите как создать библиотеку dll и прикрепить ее к FT на примере простого индикатора для Delphi7, интересен не код индикатора или советника, а порядок установки библиотеки.
Asta la vista
Mike
Mike
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Чёй-то я не допонял малёхо
Чёй-то я не допонял малёхо
1. Здравствуйте, Михаил (он же Terranin).
Подробности о вас нашёл здесь:
- http://blog.swrus.com/users/1340/
- http://www.youtube.com/user/Terranin#p/u
// Похоже, вы, Михаил, и впрямь из Канады.
То-то я смотрю, у вас такие достойные англоязычные сайты (www.forextester.com и www.fx-metropolis.com), видео-приложения, озвучка и всё такое. Хороший промоушен.
Надо будет изучить книжку, что вы рекомендовали создателям игр вот здесь: http://content.mail.ru/arch/11320/535165.html
Вообще было интересно узнать о вас больше, чем может дать фото. Так сказать познакомиться с вами поближе. //
2. Здравствуйте, Александр (он же FT Support). Простите, не нашёл о вас никаких сведений.
3. На днях купил таки ваш тестировщик. Целый год тянул с этим.
// Радуют значительные подвижки в возможностях вашей программы, произошедшие за это время. Отдельное: «СПАСИБО ВАМ ЗА ЭТО!» Надеюсь, что и впредь будет так.
Не сомневаюсь, у этого вашего проекта впечатляющие перспективы. Желаю вам и ему долгих лет процветания! //
4. Теперь о деле. Хочу прицепить к графикам свои индикаторы и скрипты (в перспективе – стратегии).
а) стал разбираться, как это у вас делается…
б) установил Delphi7…
в) за основу своего индикатора взял схожий индикатор из вашей копилки:
C:\ForexTester2\Examples\Indicators\Delphi\IndicatorsSrc\ PriceChannel.dpr.
// Так удобнее, когда ещё не знаком с языком. Думаю, все так делают. //
г) переименовал его, внёс лёгкие поправки в текст кода (в среде Delphi7, конечно).
д) хотел, было, создать dll-файл, чтобы прикрепить его к тестировщику (как это вами было описано выше). Но не тут-то было – создать dll-файл сходу у меня не получилось.
// Для чистоты эксперимента попытался проделать тоже самое с исходным (неизменённым) dpr-файлом. Результат прежний. Delphi7 раз за разом выдаёт ошибку… //
е) просмотрел форум, в надежде, что кто-то уже сталкивался с подобной проблемой, но не встретил подходящих рекомендаций. Многие юзеры либо в бессилии просто «опускают руки», либо как два известных генерала ищут «мужика-умельца», который решит все их проблемы, либо начинают «бычиться» и «гнать волну»…
ё) стал искать в сети, как создать библиотеку dll. Полистал несколько публикаций – всё не то, да и сложно как-то. И не мудрено – ведь обучают в основном тому, как написать программу с нуля…
А мне надо-то – лишь узнать/научиться, как из готового рабочего Delphi-проекта (взятого из вашей копилки) получить dll-файл. И всё (пока что).
5. Помогите, пожалуйста. Разъясните на пальцах, как, и что надо делать. Какие разделы меню открывать, и/или какие кнопки нажимать в этом самом Delphi7, чтобы из dpr-файла получился dll-файл?
Заранее благодарю.
1. Здравствуйте, Михаил (он же Terranin).
Подробности о вас нашёл здесь:
- http://blog.swrus.com/users/1340/
- http://www.youtube.com/user/Terranin#p/u
// Похоже, вы, Михаил, и впрямь из Канады.
То-то я смотрю, у вас такие достойные англоязычные сайты (www.forextester.com и www.fx-metropolis.com), видео-приложения, озвучка и всё такое. Хороший промоушен.
Надо будет изучить книжку, что вы рекомендовали создателям игр вот здесь: http://content.mail.ru/arch/11320/535165.html
Вообще было интересно узнать о вас больше, чем может дать фото. Так сказать познакомиться с вами поближе. //
2. Здравствуйте, Александр (он же FT Support). Простите, не нашёл о вас никаких сведений.
3. На днях купил таки ваш тестировщик. Целый год тянул с этим.
// Радуют значительные подвижки в возможностях вашей программы, произошедшие за это время. Отдельное: «СПАСИБО ВАМ ЗА ЭТО!» Надеюсь, что и впредь будет так.
Не сомневаюсь, у этого вашего проекта впечатляющие перспективы. Желаю вам и ему долгих лет процветания! //
4. Теперь о деле. Хочу прицепить к графикам свои индикаторы и скрипты (в перспективе – стратегии).
а) стал разбираться, как это у вас делается…
б) установил Delphi7…
в) за основу своего индикатора взял схожий индикатор из вашей копилки:
C:\ForexTester2\Examples\Indicators\Delphi\IndicatorsSrc\ PriceChannel.dpr.
// Так удобнее, когда ещё не знаком с языком. Думаю, все так делают. //
г) переименовал его, внёс лёгкие поправки в текст кода (в среде Delphi7, конечно).
д) хотел, было, создать dll-файл, чтобы прикрепить его к тестировщику (как это вами было описано выше). Но не тут-то было – создать dll-файл сходу у меня не получилось.
// Для чистоты эксперимента попытался проделать тоже самое с исходным (неизменённым) dpr-файлом. Результат прежний. Delphi7 раз за разом выдаёт ошибку… //
е) просмотрел форум, в надежде, что кто-то уже сталкивался с подобной проблемой, но не встретил подходящих рекомендаций. Многие юзеры либо в бессилии просто «опускают руки», либо как два известных генерала ищут «мужика-умельца», который решит все их проблемы, либо начинают «бычиться» и «гнать волну»…
ё) стал искать в сети, как создать библиотеку dll. Полистал несколько публикаций – всё не то, да и сложно как-то. И не мудрено – ведь обучают в основном тому, как написать программу с нуля…
А мне надо-то – лишь узнать/научиться, как из готового рабочего Delphi-проекта (взятого из вашей копилки) получить dll-файл. И всё (пока что).
5. Помогите, пожалуйста. Разъясните на пальцах, как, и что надо делать. Какие разделы меню открывать, и/или какие кнопки нажимать в этом самом Delphi7, чтобы из dpr-файла получился dll-файл?
Заранее благодарю.
Последний раз редактировалось Николай Тарасов Вт ноя 23, 2010 6:32 pm, всего редактировалось 1 раз.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
А ларчик просто открывался
«...А ларчик просто открывался.»
Из басни Крылова
(http://www.stihi-rus.ru/1/krylov/13.htm)
Ха!
1. Готовил предыдущий пост. Для конкретики решил процитировать текст ошибки:
«[Fatal Error] PriceChannel.dpr(9): File not found: 'IndicatorInterfaceUnit.dcu'»
Внимательно вчитался и понял, что файл 'IndicatorInterfaceUnit.dcu' уже видел. Стал искать. Оказалось, он был у меня под самым носом – в той же папке, где лежат исходники индикаторов!
2. Скопировал 'IndicatorInterfaceUnit.dcu' в папку со своим новым проектом. На всякий случай ещё и ‘TechnicalFunctions.dcu’ с ‘readme.txt’ туда же бросил.
3. Снова попробовал скомпилировать (в Delphi7 за это отвечает процедура «Build <my indicator>» из раздела меню «Project»): //См. рис. в конце. //
И («О, Чудо!») – всё получилось: столь долгожданный ‘<my indicator>.dll’ готов!
4. Скопировал ‘<my indicator>.dll’ в папку: «C:\ForexTester2\Indicators\». Запустил тестировщик. И сразу же (без специальной установки) прикрепил к графику свой новый индикатор, выбрав его из списка. Вот и всё.
5. Ура!!! Теперь я знаю, как это делается!
Оказывается, создать свой индикатор в Forex Tester 2 очень и очень просто! С помощью Delphi7 делается это легко и непринуждённо – в одно-два касание!
Не сложнее, чем в столь любимом публике MetaTrader4 (MT4)!
// Как тут не вспомнить Пушкина?!
«эMTэ, я думал о тебе!
эMTэ... как много в этом звуке
Для сердца русского слилось!
Как много в нем отозвалось!» //
Надеюсь, остальные задачи в FT2 будут решаться также легко.
4. Ну вот, на данный момент это, пожалуй, всё, чем я хотел поделиться со всеми.
Разрешите откланяться.
Спасибо всем.
Аплодисментов не надо…
Буду рад, если мой пока ещё небольшой опыт работы с Forex Tester’ом пригодится ещё кому-то.
«...А ларчик просто открывался.»
Из басни Крылова
(http://www.stihi-rus.ru/1/krylov/13.htm)
Ха!
1. Готовил предыдущий пост. Для конкретики решил процитировать текст ошибки:
«[Fatal Error] PriceChannel.dpr(9): File not found: 'IndicatorInterfaceUnit.dcu'»
Внимательно вчитался и понял, что файл 'IndicatorInterfaceUnit.dcu' уже видел. Стал искать. Оказалось, он был у меня под самым носом – в той же папке, где лежат исходники индикаторов!
2. Скопировал 'IndicatorInterfaceUnit.dcu' в папку со своим новым проектом. На всякий случай ещё и ‘TechnicalFunctions.dcu’ с ‘readme.txt’ туда же бросил.
3. Снова попробовал скомпилировать (в Delphi7 за это отвечает процедура «Build <my indicator>» из раздела меню «Project»): //См. рис. в конце. //
И («О, Чудо!») – всё получилось: столь долгожданный ‘<my indicator>.dll’ готов!
4. Скопировал ‘<my indicator>.dll’ в папку: «C:\ForexTester2\Indicators\». Запустил тестировщик. И сразу же (без специальной установки) прикрепил к графику свой новый индикатор, выбрав его из списка. Вот и всё.
5. Ура!!! Теперь я знаю, как это делается!
Оказывается, создать свой индикатор в Forex Tester 2 очень и очень просто! С помощью Delphi7 делается это легко и непринуждённо – в одно-два касание!
Не сложнее, чем в столь любимом публике MetaTrader4 (MT4)!
// Как тут не вспомнить Пушкина?!
«эMTэ, я думал о тебе!
эMTэ... как много в этом звуке
Для сердца русского слилось!
Как много в нем отозвалось!» //
Надеюсь, остальные задачи в FT2 будут решаться также легко.
4. Ну вот, на данный момент это, пожалуй, всё, чем я хотел поделиться со всеми.
Разрешите откланяться.
Спасибо всем.
Аплодисментов не надо…
Буду рад, если мой пока ещё небольшой опыт работы с Forex Tester’ом пригодится ещё кому-то.
- Вложения
-
- Build to PriceChannel+.JPG
- (131.13 КБ) 7800 скачиваний
Я желаю всем счастья.
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Глубоко копаете однако.
Для создания индикатора нужно рядом с ним положить файлики IndicatorInterfaceUnit.pas (и TechnicalFunctions.pas если нужно использовать дополнительные функции). При компилляции из них будут созданы *.dcu файлы и как результат *.dll файл библиотеки. (можно не класть их а держать в одном месте и просто добавлять в проект через Project -> Add to project , тогда дельфи будет знать где их искать).
После создании dll не рекомендуется вручную ее кидать в Indicators (для этого прийдется перезапускать тестер, кроме того копии этого файла могут остаться висеть на графиках и их прийдется удалять вручную). Вместо этого надо зайти в меню Файл -> Установить -> Индикатор (стратегию/скрипт). Эта процедура все сама сделает корректно и перезапускать программу не прийдется. Особенно это удобно когда в индикатор вносятся изменения и тут же тестируются в тестере.
Для создания индикатора нужно рядом с ним положить файлики IndicatorInterfaceUnit.pas (и TechnicalFunctions.pas если нужно использовать дополнительные функции). При компилляции из них будут созданы *.dcu файлы и как результат *.dll файл библиотеки. (можно не класть их а держать в одном месте и просто добавлять в проект через Project -> Add to project , тогда дельфи будет знать где их искать).
После создании dll не рекомендуется вручную ее кидать в Indicators (для этого прийдется перезапускать тестер, кроме того копии этого файла могут остаться висеть на графиках и их прийдется удалять вручную). Вместо этого надо зайти в меню Файл -> Установить -> Индикатор (стратегию/скрипт). Эта процедура все сама сделает корректно и перезапускать программу не прийдется. Особенно это удобно когда в индикатор вносятся изменения и тут же тестируются в тестере.
Asta la vista
Mike
Mike
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Не получается скрипт
Михаил, доброе утро.
1. У меня не получается «Установить новый скрипт».
FT2 ругается: ‘Can not install script, file will be deleted.’
// Сделал две попытки.
Один пробный скрипт переделал из индикатора ‘ObjectsTest.dpr’, другой – из одноимённой стратегии ‘ObjectsTest.dpr’.
Делал по-тупому – просто все слова ‘Indicator’ и ‘Strategy’ заменил на ‘Script’.
Проблем при создании dll-файлов не возникало. //
2. Опубликуйте, пожалуйста, хоть один образец скрипта.
Для наглядности желательно с тем же наполнением, что и индикатор/стратегия ‘ObjectsTest.dpr’.
Заранее благодарю.
Михаил, доброе утро.
1. У меня не получается «Установить новый скрипт».
FT2 ругается: ‘Can not install script, file will be deleted.’
// Сделал две попытки.
Один пробный скрипт переделал из индикатора ‘ObjectsTest.dpr’, другой – из одноимённой стратегии ‘ObjectsTest.dpr’.
Делал по-тупому – просто все слова ‘Indicator’ и ‘Strategy’ заменил на ‘Script’.
Проблем при создании dll-файлов не возникало. //
2. Опубликуйте, пожалуйста, хоть один образец скрипта.
Для наглядности желательно с тем же наполнением, что и индикатор/стратегия ‘ObjectsTest.dpr’.
Заранее благодарю.
Я желаю всем счастья.
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Скрипт из индикатора не получится. Структура скрипта:Николай Тарасов писал(а):Не получается скрипт
Михаил, доброе утро.
1. У меня не получается «Установить новый скрипт».
FT2 ругается: ‘Can not install script, file will be deleted.’
// Сделал две попытки.
Один пробный скрипт переделал из индикатора ‘ObjectsTest.dpr’, другой – из одноимённой стратегии ‘ObjectsTest.dpr’.
Делал по-тупому – просто все слова ‘Indicator’ и ‘Strategy’ заменил на ‘Script’.
Проблем при создании dll-файлов не возникало. //
2. Опубликуйте, пожалуйста, хоть один образец скрипта.
Для наглядности желательно с тем же наполнением, что и индикатор/стратегия ‘ObjectsTest.dpr’.
Заранее благодарю.
Код: Выделить всё
library <Script name>;
uses
// интерфейсный модуль
ScriptInterfaceUnit;
var
// внешние параметры
...
// внутренние переменные
...
//-------------------------------------------
// процедура инициализации
//-------------------------------------------
procedure Init; stdcall;
begin
// определяем внешние параметры и внутренние переменные
// тоже самое что и в стратегии/индикаторе
...
end;
//-------------------------------------------
// процедура деинициализации
//-------------------------------------------
procedure Done; stdcall;
begin
// освобождаем память если ее занимали для некоторых переменных
...
end;
//-------------------------------------------
// Выполнить скрипт
//-------------------------------------------
procedure Execute; stdcall;
begin
// что-то делаем
...
end;
exports
Init, Done, Execute;
end.
Я еще не успел написать примеры скриптов, будут попозже.
Asta la vista
Mike
Mike
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Вопрс 1.
Вопрос 2.
Странно. Неужели скрипт не сможет один раз нарисовать несколько объектов, как это делают ваши индикатор ObjectsTest и стратегия ObjectsTest?Terranin писал(а): Скрипт из индикатора не получится.
Вопрос 2.
А что, разве в FT2 скриптом нельзя "капнуть" на график? В МТ4 эту функцию очень удобно использовать - ведь снимается информация о баре, на который "упала капля" (технология "drag and drop"). И уже потом, опираясь на этот опорный бар, можно делать всё что пожелаешь.Terranin писал(а): ... скрипты вызывается по комбинации клавиш.
Я желаю всем счастья.
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
1. Сможет, я имел ввиду что он работает как стратегия (можно использовать все теже функции что и в стратегии кроме создания индикаторов) но не как индикатор.Николай Тарасов писал(а):Вопрс 1.Странно. Неужели скрипт не сможет один раз нарисовать несколько объектов, как это делают ваши индикатор ObjectsTest и стратегия ObjectsTest?Terranin писал(а): Скрипт из индикатора не получится.
Вопрос 2.А что, разве в FT2 скриптом нельзя "капнуть" на график? В МТ4 эту функцию очень удобно использовать - ведь снимается информация о баре, на который "упала капля" (технология "drag and drop"). И уже потом, опираясь на этот опорный бар, можно делать всё что пожелаешь.Terranin писал(а): ... скрипты вызывается по комбинации клавиш.
2. Капнуть на график нельзя, скрипт исполняется по горячей клавиши или двойному щелчку мыши на скрипте. При этом в скрипте будет установлен контекст текущего графика (т.е. Symbol, bid, ask и т.д. по выделенному графику).
Asta la vista
Mike
Mike
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
А жаль!Terranin писал(а): Капнуть на график нельзя...
Теперь придётся как-то изворачиваться...
// Ну да ничего, что-нибудь придумаю...
"Что не делается - к лучшему", - говорят. //
И всё-таки, Михаил, может быть, в дальнейшем добавите технологию "капли"?
У вас, вроде, всё для этого готово. Я тут просматривал файл 'IndicatorInterfaceUnit.pas' и в перечне новшеств версии 1.10 увидел шесть функций для работы с экранными координатами X-Y? Это же очень близкие вещи. Почти одно и тоже…
// Хотя, что тут говорить – в любом случае вам решать. Хозяин, как известно – он же барин. //
PS
Решил узнать, что же на самом деле означает ваша подпись...
// Подробности об этой легендарной фразе см. здесь: http://forum.lingvo.ru/actualthread.aspx?tid=4037 //
Всё просто: "До встречи. Михаил".
Выходит, никакой "Амерки" я не открыл, "глубоко копАя".
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Образец скрипта
Здравствуйте, Михаил.
Вот то, о чём я вас недавно просил (см. код ниже).
Это скрипт по имени ObjectsTest. Делает то же самое, что и ваши одноимённые индикатор и стратегия, потому как сделан на их основе.
Привожу код для того, чтобы у пользователей FT2 появился хоть один живой обрзец скрипта.
Обратите ВНИМАНИЕ!
Скрипт ObjectsTest начинает рисовать объекты только лишь, когда отрисовано хотя бы 80 баров (в режиме "Тестирование")!!!
Здравствуйте, Михаил.
Вот то, о чём я вас недавно просил (см. код ниже).
Это скрипт по имени ObjectsTest. Делает то же самое, что и ваши одноимённые индикатор и стратегия, потому как сделан на их основе.
Код: Выделить всё
//--------------------------------------------------------------------------
// Objects test - Example how to work with objects from Script
//--------------------------------------------------------------------------
library ObjectsTest;
uses
ScriptInterfaceUnit;
//-------------------------------------------
// Initialize Script
//-------------------------------------------
procedure Init; stdcall;
begin
ScriptShortName('ObjectsTest');
ScriptDescription('Objects'' interface test');
end;
//-------------------------------------------
// Deinitialize Script
//-------------------------------------------
procedure Done; stdcall;
begin
end;
//-------------------------------------------
// Execute Script
//-------------------------------------------
procedure Execute; stdcall;
var
i: integer;
const
names: array[0..8] of string = ('Line0', 'Line1', 'Line2', 'Line3', 'Fibo1',
'Fibo2', 'Fibo3', 'Fibo4', 'Text1');
begin
if Bars < 80 then
exit;
// create vertical line
if not(ObjectExists(names[0])) then
begin
ObjectCreate(names[0], obj_VLine, 0, Time(0), 0);
/// ObjectSet(names[0], OBJPROP_STYLE, integer(psDot));
/// ObjectSet(names[0], OBJPROP_COLOR, clYellow);
ObjectSet(names[0], OBJPROP_WIDTH, 1);
end;
// create horizontal line
if not(ObjectExists(names[1])) then
ObjectCreate(names[1], obj_HLine, 0, 0, Close(0));
// create trend line
if not(ObjectExists(names[2])) then
ObjectCreate(names[2], obj_TrendLine, 0, Time(10), Close(10),
Time(0), Close(0));
// create ray
if not(ObjectExists(names[3])) then
ObjectCreate(names[3], obj_Ray, 0, Time(10), Open(10),
Time(0), Open(0));
// create fibo retracement
if not(ObjectExists(names[4])) then
begin
ObjectCreate(names[4], obj_FiboRetracement, 0, Time(40), Close(40),
Time(10), Close(10));
ObjectSet(names[4], OBJPROP_FIBOCLOSEDENDS, 1);
ObjectSet(names[4], OBJPROP_FIBOSHOWPRICE, 0);
ObjectSet(names[4], OBJPROP_FIBOENDWIDTH, 40);
// define 3 levels
ObjectSet(names[4], OBJPROP_FIBOLEVELS, 3);
for i:=0 to 2 do
begin
ObjectSet(names[4], OBJPROP_FIBOLEVELN, i);
ObjectSet(names[4], OBJPROP_LEVELVALUE, i*50);
/// ObjectSet(names[4], OBJPROP_LEVELCOLOR, clBlue);
/// ObjectSet(names[4], OBJPROP_LEVELSTYLE, integer(psDot));
ObjectSet(names[4], OBJPROP_LEVELWIDTH, 1);
end;
end;
// create fibo fan
if not(ObjectExists(names[5])) then
begin
ObjectCreate(names[5], obj_FiboFan, 0, Time(80), Close(80),
Time(50), Close(50));
// define 3 levels
ObjectSet(names[5], OBJPROP_FIBOLEVELS, 3);
for i:=0 to 2 do
begin
ObjectSet(names[5], OBJPROP_FIBOLEVELN, i);
ObjectSet(names[5], OBJPROP_LEVELVALUE, i*30);
/// ObjectSet(names[5], OBJPROP_LEVELCOLOR, clGreen);
/// ObjectSet(names[5], OBJPROP_LEVELSTYLE, integer(psSolid));
ObjectSet(names[5], OBJPROP_LEVELWIDTH, 1);
end;
end;
// create text
if not(ObjectExists(names[8])) then
begin
ObjectCreate(names[8], obj_Text, 0, Time(10), Close(0));
/// ObjectSetText(names[8], 'Test text', 12, 'Arial', clYellow);
ObjectSet(names[8], OBJPROP_VALIGNMENT, tlBottom);
ObjectSet(names[8], OBJPROP_HALIGNMENT, taLeftJustify);
end;
// set vertical line props
ObjectSet(names[0], OBJPROP_TIME1, Time(0));
// set horizontal line props
ObjectSet(names[1], OBJPROP_PRICE1, Close(0));
// set trend line props
ObjectSet(names[2], OBJPROP_TIME1, Time(10));
ObjectSet(names[2], OBJPROP_PRICE1, Close(10));
ObjectSet(names[2], OBJPROP_TIME2, Time(0));
ObjectSet(names[2], OBJPROP_PRICE2, Close(0));
// set ray props
ObjectSet(names[3], OBJPROP_TIME1, Time(10));
ObjectSet(names[3], OBJPROP_PRICE1, Open(10));
ObjectSet(names[3], OBJPROP_TIME2, Time(0));
ObjectSet(names[3], OBJPROP_PRICE2, Open(0));
// set fibo retracement props
ObjectSet(names[4], OBJPROP_TIME1, Time(40));
ObjectSet(names[4], OBJPROP_PRICE1, Close(40));
ObjectSet(names[4], OBJPROP_TIME2, Time(10));
ObjectSet(names[4], OBJPROP_PRICE2, Close(10));
// set fibo fan props
ObjectSet(names[5], OBJPROP_TIME1, Time(80));
ObjectSet(names[5], OBJPROP_PRICE1, Close(80));
ObjectSet(names[5], OBJPROP_TIME2, Time(50));
ObjectSet(names[5], OBJPROP_PRICE2, Close(50));
// set text props
ObjectSet(names[8], OBJPROP_TIME1, Time(10));
ObjectSet(names[8], OBJPROP_PRICE1, Close(0));
end;
exports
Init, Done, Execute;
end.
Обратите ВНИМАНИЕ!
Скрипт ObjectsTest начинает рисовать объекты только лишь, когда отрисовано хотя бы 80 баров (в режиме "Тестирование")!!!
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Да, чуть не забыл.
Семь строчек кода (см. строчки с тройными наклонными разделителями в начале строки), устанавливающие некоторые свойства объектов, пришлось исключить, чтобы компилятор не ругался.
Вот сообщение об ошибках:
[Error] ObjectsTest.dpr(45): Undeclared identifier: 'psDot'
[Error] ObjectsTest.dpr(46): Undeclared identifier: 'clYellow'
[Error] ObjectsTest.dpr(79): Undeclared identifier: 'clBlue'
[Error] ObjectsTest.dpr(97): Undeclared identifier: 'clGreen'
[Error] ObjectsTest.dpr(98 ): Undeclared identifier: 'psSolid'
В целом это мелочи. Но всё-таки, в чём тут дело? Что я делал не так?
Семь строчек кода (см. строчки с тройными наклонными разделителями в начале строки), устанавливающие некоторые свойства объектов, пришлось исключить, чтобы компилятор не ругался.
Вот сообщение об ошибках:
[Error] ObjectsTest.dpr(45): Undeclared identifier: 'psDot'
[Error] ObjectsTest.dpr(46): Undeclared identifier: 'clYellow'
[Error] ObjectsTest.dpr(79): Undeclared identifier: 'clBlue'
[Error] ObjectsTest.dpr(97): Undeclared identifier: 'clGreen'
[Error] ObjectsTest.dpr(98 ): Undeclared identifier: 'psSolid'
В целом это мелочи. Но всё-таки, в чём тут дело? Что я делал не так?
Я желаю всем счастья.
-
- Сообщения: 329
- Зарегистрирован: Сб июл 11, 2009 3:59 pm
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Здравствуйте, Александр.
Из скрипта не могу сменить стиль, толщину и цвет у объекта ‘TrendLine’ (как, впрочем, и цвет у объекта ‘Text’). В том числе - через явное указание числового значения стиля, толщины и цвета.
Скажите, пожалуйста, как можно ещё, числами например, задать параметры объектов? Можно ли ознакомиться с таблицей явной кодировки цветов, стилей и толщин объектов?
Подключение библиотеки 'TechnicalFunctions' не помогло. Ошибки компиляции не исчезли.
Из скрипта не могу сменить стиль, толщину и цвет у объекта ‘TrendLine’ (как, впрочем, и цвет у объекта ‘Text’). В том числе - через явное указание числового значения стиля, толщины и цвета.
Код: Выделить всё
// create trend
if not(ObjectExists(name[0])) then
begin
ObjectCreate(name[0], obj_TrendLine, 0,
time1, price1,
time2, price2);
// ObjectSet(name[0], OBJPROP_LEVELCOLOR, clGreen);
// ObjectSet(name[0], OBJPROP_LEVELCOLOR, 'clGreen');
// ObjectSet(name[0], OBJPROP_LEVELCOLOR, 'Green');
// ObjectSet(name[0], OBJPROP_LEVELCOLOR, clGreen);
// ObjectSet(name[0], OBJPROP_LEVELCOLOR, integer(clGreen));
// ObjectSet(name[0], OBJPROP_LEVELCOLOR, 64);
ObjectSet(name[0], OBJPROP_LEVELCOLOR, $01000000);
// ObjectSet(name[0], OBJPROP_LEVELSTYLE, integer(psDot));
ObjectSet(name[0], OBJPROP_LEVELSTYLE, 4);
ObjectSet(name[0], OBJPROP_LEVELWIDTH, 4);
end;
Подключение библиотеки 'TechnicalFunctions' не помогло. Ошибки компиляции не исчезли.
Последний раз редактировалось Николай Тарасов Ср дек 01, 2010 1:38 am, всего редактировалось 2 раза.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Да, вот ещё что.
1. У объекта 'Text' я не смог поменять/установить только лишь цвет.
Остальные параметры (в том числе размер шрифта) регулируются. Но для этого мне пришлось в функции установки отбросить непослушный параметр "Цвет":
2. При любых параметрах (цвет, стиль и толщина) вышеуказанного объекта 'TrendLine' он рисуется сплошной красной линией минимальной толщины...
Как-то это всё странно. Может быть, вы проверите у себя тестовый скрипт?
1. У объекта 'Text' я не смог поменять/установить только лишь цвет.
Остальные параметры (в том числе размер шрифта) регулируются. Но для этого мне пришлось в функции установки отбросить непослушный параметр "Цвет":
Код: Выделить всё
ObjectCreate(name[0], obj_Text, 0, Time(40), Close(40));
/// ObjectSetText(names[0], 'Text1', 10, 'Arial', clYellow);
ObjectSetText(names[0], 'Text1', 10, 'Arial');
Как-то это всё странно. Может быть, вы проверите у себя тестовый скрипт?
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Как присвоить текстовой надписи цифровое значение?
Понимаю, что мимо главной темы, но всё же спрошу.
В файле 'TechnicalFunctions' (для скриптов) нашёл функцию 'StrPriceType'. Решил применить:
Но столкнулся с теми же проблемами, что описаны выше - компилятор ругается:
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'Double'
Здесь-то что не так?
PS
Впору переносить эту ветку в отдельную тему "Вопросы по скрипту" или что-то в этом роде.
Понимаю, что мимо главной темы, но всё же спрошу.
В файле 'TechnicalFunctions' (для скриптов) нашёл функцию 'StrPriceType'. Решил применить:
Код: Выделить всё
ObjectSetText(name[0], StrPriceType(Time(40)), 10, 'Arial');
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'Double'
Здесь-то что не так?
PS
Впору переносить эту ветку в отдельную тему "Вопросы по скрипту" или что-то в этом роде.
Я желаю всем счастья.
-
- Сообщения: 329
- Зарегистрирован: Сб июл 11, 2009 3:59 pm
Здравствуйте, Николай, скрипт у себя проверили, оказывается нужно просто добавить библиотеку graphics и всё будет работать.
Кстати обратите внимание на то, что пунктирные линии будут рисоваться только при толщине 1, если сделать линию толще, то она будет сплошной, это ограничения Windows, в МетаТрейдере например та же ситуация.
Кстати обратите внимание на то, что пунктирные линии будут рисоваться только при толщине 1, если сделать линию толще, то она будет сплошной, это ограничения Windows, в МетаТрейдере например та же ситуация.
-
- Сообщения: 329
- Зарегистрирован: Сб июл 11, 2009 3:59 pm
По поводу ошибки с вот этим кодом:
Код неверный потому что функция StrPriceType принимает тип цены, а Вы передаёте туда дату/время, и вот несоответствие типов.
Пример использования функции StrPriceType такой:
Чтобы присвоить текстовому объекту числовое значение нужно использовать стандартные функции дельфи например IntToStr чтобы перевести число в строку
Код: Выделить всё
ObjectSetText(name[0], StrPriceType(Time(40)), 10, 'Arial');
Пример использования функции StrPriceType такой:
Код: Выделить всё
Print(StrPriceType(pt_Close));
// в этом случае функция вернёт "Close"
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Как добавить библиотеку 'graphics'
А я, уж было, свой Delphi7 начал подозревать.
Вот бы ещё узнать, как это делается...
Александр, если вас не затруднит, опишите, пожалуйста, как добавить библиотеку 'graphics'.
А то я, пока что в Delphi7 "не ухо не рыло". Боюсь, как бы ни навредить. А вы в этом деле, не сомневаюсь, уж не одну "собаку съели".
Как водится - заранее благодарю вас за помощь.
Замечательно!FT Support писал(а):Здравствуйте, Николай, скрипт у себя проверили, оказывается нужно просто добавить библиотеку graphics и всё будет работать...
А я, уж было, свой Delphi7 начал подозревать.
Вот бы ещё узнать, как это делается...
Александр, если вас не затруднит, опишите, пожалуйста, как добавить библиотеку 'graphics'.
А то я, пока что в Delphi7 "не ухо не рыло". Боюсь, как бы ни навредить. А вы в этом деле, не сомневаюсь, уж не одну "собаку съели".
Как водится - заранее благодарю вас за помощь.
Да, да. Это нам, скромным любителям МТ4, известно.FT Support писал(а):... Кстати обратите внимание на то, что пунктирные линии будут рисоваться только при толщине 1, если сделать линию толще, то она будет сплошной, это ограничения Windows, в МетаТрейдере например та же ситуация.
Я желаю всем счастья.
-
- Сообщения: 329
- Зарегистрирован: Сб июл 11, 2009 3:59 pm
добавить библиотеку очень просто, нужно дописать её в блок uses, например вот так:
Код: Выделить всё
uses
ScriptInterfaceUnit, TechnicalFunctions, graphics;
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
1. Простите - я допустил опечатку
Дело было так:
1) Сначала я действительно написал код с явной ошибкой в типе данных ('time' вместо 'double'):
Но после того, как компилятор выдал:
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'TDateTime'
2) Я исправился:
Но компилятор по-прежнему не хотел воспринимать данную функцию, вернее - тип параметра ему не нравился:
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'Double'
Резюме: В моём вопросе середина пропала, а остался первый вариант кода и сообщение об ошибке на второй вариант кода. Извините за неточность.
2. Как подписать цену прямо на графике?
Хотя, знаю, процедура Print для отображения сообщений пользователя в журнале тестировщика. Мне же нужно подписать цену прямо на графике.
Результат прежний:
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'Double'
3. Надо будет попробовать
Была у меня такая версия, что программу (скрипт) можно/нужно писать некими стандартными средствами.
А то ваш арсенал довольно скуден для самовыражения.
Надо будет попробовать.
Ох, простите, в своём вопросе я допустил опечатку.FT Support писал(а):По поводу ошибки с вот этим кодом:Код неверный потому что функция StrPriceType принимает тип цены, а Вы передаёте туда дату/время, и вот несоответствие типов...Код: Выделить всё
ObjectSetText(name[0], StrPriceType(Time(40)), 10, 'Arial');
Дело было так:
1) Сначала я действительно написал код с явной ошибкой в типе данных ('time' вместо 'double'):
Код: Выделить всё
ObjectSetText(PointName[0], StrPriceType(Time(40)), 10, 'Arial');
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'TDateTime'
2) Я исправился:
Код: Выделить всё
ObjectSetText(PointName[0], StrPriceType(Close(40)), 10, 'Arial');
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'Double'
Резюме: В моём вопросе середина пропала, а остался первый вариант кода и сообщение об ошибке на второй вариант кода. Извините за неточность.
2. Как подписать цену прямо на графике?
После вашего первого совета я попробовал сделать так:FT Support писал(а):...Пример использования функции StrPriceType такой:Код: Выделить всё
Print(StrPriceType(pt_Close)); // в этом случае функция вернёт "Close"
Код: Выделить всё
ObjectSetText(PointName[0], Print(StrPriceType(Close(40))), 12, 'Arial');
Результат прежний:
[Error] ScriptName.dpr(49): Incompatible types: 'TPriceType' and 'Double'
3. Надо будет попробовать
Вот. Это уже кое-что.FT Support писал(а):...Чтобы присвоить текстовому объекту числовое значение нужно использовать стандартные функции дельфи например IntToStr чтобы перевести число в строку
Была у меня такая версия, что программу (скрипт) можно/нужно писать некими стандартными средствами.
А то ваш арсенал довольно скуден для самовыражения.
Надо будет попробовать.
Я желаю всем счастья.
-
- Сообщения: 329
- Зарегистрирован: Сб июл 11, 2009 3:59 pm
С точки зрения программирования конвертация типов это очень даже стандартные средства.
В Вашем случае следует сделать примерно так:
1) Добавить библиотеку SysUtils
2) Использовать функцию FloatToStr из этой библиотеки:
3) Если компилятор будет выдавать ошибки вида:
[Pascal Error] TestScript.dpr(58 ): E2034 Too many actual parameters
на строки, где используется вызов функции Time(0), то заменить этот вызов таким образом: ScriptInterfaceUnit.Time(0)
В Вашем случае следует сделать примерно так:
1) Добавить библиотеку SysUtils
Код: Выделить всё
uses
ScriptInterfaceUnit, TechnicalFunctions, graphics, SysUtils;
Код: Выделить всё
ObjectSetText(name[0], FloatToStr(Close(40)), 10, 'Arial');
[Pascal Error] TestScript.dpr(58 ): E2034 Too many actual parameters
на строки, где используется вызов функции Time(0), то заменить этот вызов таким образом: ScriptInterfaceUnit.Time(0)
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Благодарю за помощь.FT Support писал(а):... Если компилятор будет выдавать ошибки вида:
[Pascal Error] TestScript.dpr(58 ): E2034 Too many actual parameters
на строки, где используется вызов функции Time(0), то заменить этот вызов таким образом: ScriptInterfaceUnit.Time(0)
Вот полностью работающая версия скрипта ObjectsTest:
Код: Выделить всё
//--------------------------------------------------------------------------
// Objects test - Example how to work with objects from Script
//--------------------------------------------------------------------------
library ObjectsTest;
//-------------------------------------------
// Initialize Script
//-------------------------------------------
uses
ScriptInterfaceUnit,
TechnicalFunctions,
graphics;
procedure Init; stdcall;
begin
ScriptShortName('ObjectsTest');
ScriptDescription('Objects'' interface test');
end;
//-------------------------------------------
// Deinitialize Script
//-------------------------------------------
procedure Done; stdcall;
begin
end;
//-------------------------------------------
// Execute Script
//-------------------------------------------
procedure Execute; stdcall;
var
i: integer;
const
names: array[0..8] of string = ('Line0', 'Line1', 'Line2', 'Line3', 'Fibo1',
'Fibo2', 'Fibo3', 'Fibo4', 'Text1');
begin
if Bars < 80 then
exit;
// create vertical line
if not(ObjectExists(names[0])) then
begin
ObjectCreate(names[0], obj_VLine, 0,
ScriptInterfaceUnit.Time(0), 0);
ObjectSet(names[0], OBJPROP_STYLE, integer(psDot));
ObjectSet(names[0], OBJPROP_COLOR, clYellow);
ObjectSet(names[0], OBJPROP_WIDTH, 1);
end;
// create horizontal line
if not(ObjectExists(names[1])) then
ObjectCreate(names[1], obj_HLine, 0, 0, Close(0));
// create trend line
if not(ObjectExists(names[2])) then
ObjectCreate(names[2], obj_TrendLine, 0,
ScriptInterfaceUnit.Time(10), Close(10),
ScriptInterfaceUnit.Time(0), Close(0));
// create ray
if not(ObjectExists(names[3])) then
ObjectCreate(names[3], obj_Ray, 0,
ScriptInterfaceUnit.Time(10), Open(10),
ScriptInterfaceUnit.Time(0), Open(0));
// create fibo retracement
if not(ObjectExists(names[4])) then
begin
ObjectCreate(names[4], obj_FiboRetracement, 0,
ScriptInterfaceUnit.Time(40), Close(40),
ScriptInterfaceUnit.Time(10), Close(10));
ObjectSet(names[4], OBJPROP_FIBOCLOSEDENDS, 1);
ObjectSet(names[4], OBJPROP_FIBOSHOWPRICE, 0);
ObjectSet(names[4], OBJPROP_FIBOENDWIDTH, 40);
// define 3 levels
ObjectSet(names[4], OBJPROP_FIBOLEVELS, 3);
for i:=0 to 2 do
begin
ObjectSet(names[4], OBJPROP_FIBOLEVELN, i);
ObjectSet(names[4], OBJPROP_LEVELVALUE, i*50);
ObjectSet(names[4], OBJPROP_LEVELCOLOR, clBlue);
ObjectSet(names[4], OBJPROP_LEVELSTYLE, integer(psDot));
ObjectSet(names[4], OBJPROP_LEVELWIDTH, 1);
end;
end;
// create fibo fan
if not(ObjectExists(names[5])) then
begin
ObjectCreate(names[5], obj_FiboFan, 0,
ScriptInterfaceUnit.Time(80), Close(80),
ScriptInterfaceUnit.Time(50), Close(50));
// define 3 levels
ObjectSet(names[5], OBJPROP_FIBOLEVELS, 3);
for i:=0 to 2 do
begin
ObjectSet(names[5], OBJPROP_FIBOLEVELN, i);
ObjectSet(names[5], OBJPROP_LEVELVALUE, i*30);
ObjectSet(names[5], OBJPROP_LEVELCOLOR, clGreen);
ObjectSet(names[5], OBJPROP_LEVELSTYLE, integer(psSolid));
ObjectSet(names[5], OBJPROP_LEVELWIDTH, 1);
end;
end;
// create text
if not(ObjectExists(names[8])) then
begin
ObjectCreate(names[8], obj_Text, 0,
ScriptInterfaceUnit.Time(10), Close(0));
ObjectSetText(names[8], 'Test text', 12, 'Arial', clYellow);
ObjectSet(names[8], OBJPROP_VALIGNMENT, tlBottom);
ObjectSet(names[8], OBJPROP_HALIGNMENT,
ScriptInterfaceUnit.taLeftJustify);
end;
// set vertical line props
ObjectSet(names[0], OBJPROP_TIME1, ScriptInterfaceUnit.Time(0));
// set horizontal line props
ObjectSet(names[1], OBJPROP_PRICE1, Close(0));
// set trend line props
ObjectSet(names[2], OBJPROP_TIME1, ScriptInterfaceUnit.Time(10));
ObjectSet(names[2], OBJPROP_PRICE1, Close(10));
ObjectSet(names[2], OBJPROP_TIME2, ScriptInterfaceUnit.Time(0));
ObjectSet(names[2], OBJPROP_PRICE2, Close(0));
// set ray props
ObjectSet(names[3], OBJPROP_TIME1, ScriptInterfaceUnit.Time(10));
ObjectSet(names[3], OBJPROP_PRICE1, Open(10));
ObjectSet(names[3], OBJPROP_TIME2, ScriptInterfaceUnit.Time(0));
ObjectSet(names[3], OBJPROP_PRICE2, Open(0));
// set fibo retracement props
ObjectSet(names[4], OBJPROP_TIME1, ScriptInterfaceUnit.Time(40));
ObjectSet(names[4], OBJPROP_PRICE1, Close(40));
ObjectSet(names[4], OBJPROP_TIME2, ScriptInterfaceUnit.Time(10));
ObjectSet(names[4], OBJPROP_PRICE2, Close(10));
// set fibo fan props
ObjectSet(names[5], OBJPROP_TIME1, ScriptInterfaceUnit.Time(80));
ObjectSet(names[5], OBJPROP_PRICE1, Close(80));
ObjectSet(names[5], OBJPROP_TIME2, ScriptInterfaceUnit.Time(50));
ObjectSet(names[5], OBJPROP_PRICE2, Close(50));
// set text props
ObjectSet(names[8], OBJPROP_TIME1, ScriptInterfaceUnit.Time(10));
ObjectSet(names[8], OBJPROP_PRICE1, Close(0));
end;
exports
Init,
Done,
Execute;
end.
Например, вместо "clYellow" запишите "graphics.clYellow".
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Подписать цену на графике можно так:FT Support писал(а):С точки зрения программирования конвертация типов это очень даже стандартные средства.
В Вашем случае следует сделать примерно так:
1) Добавить библиотеку SysUtils2) Использовать функцию FloatToStr из этой библиотеки:Код: Выделить всё
uses ScriptInterfaceUnit, TechnicalFunctions, graphics, SysUtils;
3) Если компилятор будет выдавать ошибки вида:Код: Выделить всё
ObjectSetText(name[0], FloatToStr(Close(40)), 10, 'Arial');
[Pascal Error] TestScript.dpr(58 ): E2034 Too many actual parameters
на строки, где используется вызов функции Time(0), то заменить этот вызов таким образом: ScriptInterfaceUnit.Time(0)
Код: Выделить всё
// create point1
if not(ObjectExists(name[0])) then
ObjectCreate(name[0], obj_Text, 0, ScriptInterfaceUnit.Time(40), Close(40));
// set point1 props
ObjectSet(name[0], OBJPROP_TIME1, ScriptInterfaceUnit.Time(40));
ObjectSet(name[0], OBJPROP_PRICE1, Close(40));
ObjectSetText(Name[0], '<1: '+FloatToStrF(Close(40),ffFixed,Digits+1,Digits),
12, 'Arial', graphics.clOrangeRed);
ObjectSet(name[0], OBJPROP_VALIGNMENT, tlCenter);
ObjectSet(name[0], ScriptInterfaceUnit.OBJPROP_HALIGNMENT,
ScriptInterfaceUnit.taLeftJustify);
Последний раз редактировалось Николай Тарасов Ср фев 02, 2011 12:20 am, всего редактировалось 1 раз.
Я желаю всем счастья.
- Николай Тарасов
- Сообщения: 144
- Зарегистрирован: Чт авг 27, 2009 4:39 pm
- Откуда: Екатеринбург
- Контактная информация:
Как задать нужный цвет
Кстати говоря, научился задавать цвет с помощью трёхбитовой функции RGB($RR: byte, $GG: byte, $BB: byte). Выглядит это вот так:
Таблицу "Цвета HTML" смотрите здесь: http://ru.wikipedia.org/wiki/Цвета_в_Web
PS
Шестнадцатеричные числа $RR, $GG и $BB, лежащие в диапазоне 0...255 легко получить, например, с помощью встроенного в компьютер калькулятора. Надо лишь переставлять флажок с "Hex" на "Dec" и обратно.
Так можно получить любой цвет и оттенок.
Кстати говоря, научился задавать цвет с помощью трёхбитовой функции RGB($RR: byte, $GG: byte, $BB: byte). Выглядит это вот так:
Код: Выделить всё
color1 := RGB($FF, $45, $00); // OrangeRed
color2 := RGB($32, $CD, $32); // LimeGreen
color3 := RGB($00, $BF, $FF); // DeepSkyBlue
color4 := RGB($1E, $90, $FF); // DodgerBlue
color5 := RGB($BA, $55, $D3); // MediumOrchid
PS
Шестнадцатеричные числа $RR, $GG и $BB, лежащие в диапазоне 0...255 легко получить, например, с помощью встроенного в компьютер калькулятора. Надо лишь переставлять флажок с "Hex" на "Dec" и обратно.
Так можно получить любой цвет и оттенок.
Я желаю всем счастья.