Как создать библиотеку dll

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Сообщение
Автор
Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#101 Сообщение Николай Тарасов » Чт апр 07, 2011 6:26 pm

FT Support писал(а):Здравствуйте, Николай,

Очень странные ошибки, насколько помню у нас ни в API ни в индикаторах не было ничего подобного WSRegisterCustomImageList
если дважды кликнуть на ошибку, то какой файл будет открыт?
1. Здравствуйте, Александр.


2. Очень жду вашей помощи!
Я на распутье. Не знаю, то ли повозиться ещё с Лазарем, то ли найти более свежую версию Delphi, по умолчанию обрабатывающую String-переменные, как WideString?
Если второй вариант, то какие модификации, на ваш взгляд, предпочтительнее?
Дайте толковый совет, пожалуйста.
С высоты вашего опыта, думаю, это не сложно.


3. Не очень понял, о каком таком файле вы спрашиваете.
Ведь там же написано: "Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterCustomImageList".

Попытаюсь ответить на ваш вопрос в меру своего понимания.

При кликании (двойной щелчок левой кнопки мыши) на эту ошибку в окне "Сообщения", указатель перескакивает на строку 103 закладки 'Alligator.dpr' (кроме того там ещё есть закладка 'IndicatorInterfaceUnit.pas') в окне "Редактор кода". Эта строка 103 - самая последняя запись кода: Туда же (на строку 103 закладки 'Alligator.dpr' в окне "Редактор кода") ссылаются ещё 14 ошибок, начинающихся на "Alligator.dpr(103,1) Error: Undefined symbol: WSRegister", а также сообщение: "Alligator.dpr(103,1) Fatal: There were 15 errors compiling module, stopping".


Первые три строчки окна "Сообщения" указывают на другую закладку в окне "Редактор кода" - а именно на закладку 'IndicatorInterfaceUnit.pas':

1) подсказка (намёк, совет) "IndicatorInterfaceUnit.pas(1362,23) Hint: Variable "IntrfProcsRec" does not seem to be initialized" приводит к строке 1362:

Код: Выделить всё

fillchar(IntrfProcsRec, sizeof(IntrfProcsRec), 0);
2) подсказка "IndicatorInterfaceUnit.pas(613,22) Hint: Local type "TSetPropertyProc" is not used" приводит к строке 613:

Код: Выделить всё

  TSetPropertyProc = procedure(PropertyID: integer; value: OLEVariant) of object; stdcall;
3) подсказка "IndicatorInterfaceUnit.pas(675,23) Hint: Local type "PInterfaceProcRec" is not used" does not seem to be initialized" приводит к строке 1362:

Код: Выделить всё

  PInterfaceProcRec = ^TInterfaceProcRec; 


PS
Пробовал компилировать другие индикаторы.
Та же проблема (совершенно идентичные ошибки).

В скриптах добавляются ещё некоторые придирки.
В основном к типам данных и некоторым компонентам (MPlayer, например).
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#102 Сообщение Николай Тарасов » Пт апр 08, 2011 6:40 pm

Здравствуйте.
Вопрос адресован Михаилу.

Михаил.
Попробовал я тут добавить на свою страничку "ВКонтакте" (http://vkontakte.ru/id93635988) ваше видео, что у вас на YouToube лежит(http://www.youtube.com/user/Terranin#p/u/2/vTlBqGP63JE).

Так у меня не вышло.

Мастер, добавляющий видео по ссылке с других сайтов, выдал:
  • Видеосервис не поддерживается либо ссылка является неправильной
Хотя подобная ссылка (тоже в Ютубе, но у другого пользователя) обработалась нормально:
http://www.youtube.com/watch?v=wcYp1QoB ... ideo_title

* * *
После этого я попробовал скачать ваше видео (чтобы потом залить его на свою страничку уже со своего компьютера) с помощью программы 'VKMusic 4' (http://vikim.ru/).

Видео с названием "Forex Tester Software" VKMusic находит (на YouToube), но не скачивает, сообщая: "Файл не найден".

Может у вас, Михаил, страничка излишне защищена подписками и паролями всякими?
Или может быть, код ссылки на ваше видео где-то ещё лежит, а я не заметил (кнопочка, там, какая-нибудь).
А может быть можно воспользоваться другими источниками для скачивания ваших уроков?




PS
1. Пишу здесь, поскольку опыт показал, что вы не отслеживаете мои сообщения в других разделах. Можете потом сами перенести его в более подходящее место форума.


2. Сегодня побывал на семинаре Dukascopy Bank'а (dukascopy.com) в Екатеринбурге.
Так вот, они недавно создали одноимённый клуб в социальной сети "ВКонтакте" (http://vkontakte.ru/club23152289).
Планируют и в ФэйсБуке прописаться.

Почему бы и вам, Михаил, что-нибудь эдакое не соорудить?!
А что? Есть, пить не просит.
Вложений (финансовых) - никаких, т.к. все материалы у вас готовы.
Будете потом лишь подливать новинки, да и всё.

А дальше, как в недавнем фильме "Ёлки" (2010) по принципу сарафанного радио, в чётком соответствии с правилом семи (или десяти, не помню) рукопожатий всё пойдёт. И Президент произнесёт в новогоднем обращении нужные слова (читай: "Продажи Форекстестера вырастут на 50%! Да чего там (на 50%)? Вдвое вырастут!!! Как минимум."). :wink:
Можете даже не сомневаться.

А то, на поверку получается, что все, кто был сегодня на семинаре, ни сном не духом, как говориться - никто про вас ничего не знает, и никогда не слышал такого словосочетания "Форекстестер".
Что участники семинара (человек сорок было), что организаторы.

* * *
По такому же принципу вам потом можно и другие социальные сети охватить своим вниманием.
Народ любит видеоматериалами обмениваться.
Это же не книжки читать - включил, да и слушай (смотри) себе.
Никакой нагрузки на мозг (шутка). :wink:



3. Кстати, Дукаскопи банк предоставляет тиковую историю за несколько лет совершенно бесплатно!!! Спешите скачивать (для своего платного софта)!

Вообще Дука (основатель банка Андрэ Дука или попросту Андрей Васильевич Дука, физик-теоретик, родом из Владивостока, примерно 1960 года рождения, доктор философии, автор Общей Теории Эволюции (ОТЭ) и метода анализа эволюционных процессов с одноимённым названием Дукаскопия) интересные условия предлагает и интересный софт.

Продвинутые клиенты банка свои инструменты (индикаторы, скрипты, стратегии) могут писать на языке Java.

* * *
Жаль только (конечно, для меня, а не для вас) ручного тестирования у них нет.
Но пообещали подумать над такой возможностью.
Они все там технари (в основном).
Думаю, что смогут сделать (если увидят целесообразность). :wink:




4. Ещё одну вещь интересную для себя я там услышал (на семинаре).
Оказывается они технически поддерживают (вернее, активно прорабатывают для группы клиентов из Омска и скоро начнут) своих клиентов, у которых есть стремление сдавать в аренду (продавать) свои технические инструменты (индикаторы, скрипты и стратегии) другим, заинтересованным клиентам.

Михаил, это же как раз то, о чём я спрашивал вас некоторое время назад!
Я спрашивал, как вы смотрите на то, чтобы выпускать расширенные версии Форекстестера с дополнительными опциями, являющимися плодом труда сторонних разработчиков?

Вы бы "прошивали" такие компоненты (индикаторы, скрипты, стратегии и т.п.) внутрь своей программы, тем самым защищая их от взлома своей сторожевой системой.

Дальнейшие действия могли бы быть, например, такими:

1) заинтересованный пользователь платит за доступ к нужным опциям их автору (доступ может быть как срочным, так и бессрочным);

2) автор сообщает пользователю первую часть пароля для доступа к опции и оплачивает вам комиссионные (размер комиссии - отдельная тема, пока речь идёт о механизме кооперации);

3) вы сообщаете пользователю вторую часть пароля для доступа с указанным опциям.

В идеале все участвующие стороны должны остаться довольными.

* * *
Возможно, я всё усложняю. Сейчас меня страшит сам вопрос защиты кода от взлома. Мне, пока не приходилось решать такую задачу.
А везде пишут, что взломать можно всё, что угодно.
Тем более индикатор (или скрипт).


5. Михаил. Вам бы помимо маркетингового отдела отдел продаж организовать. Всё-таки, каждый должен заниматься своим делом (в меру способностей, опыта и таланта).

* * *
Всё это так - мысли вслух.
Очень хотелось вам "один умный вещь сказать". :wink:
"Только вы не обижайтесь!"
Я желаю всем счастья.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#103 Сообщение FT Support » Сб апр 09, 2011 11:56 am

Здравствуйте, Николай!

Вообще-то рекомендую использовать Дельфи, он гораздо более надёжен и удобен чем лазарус, у меня вот версия "Embarcadero® Delphi® 2010" работает нормально, советую попробовать, если найдёте.

Попробуйте выложить вот это видео: http://www.youtube.com/watch?v=vTlBqGP63JE должно получиться, думаю что мешала ссылка на канал

по поводу защиты индикаторов для программы, Вы действительно всё усложняете, сначала продайте 10-100 штук, а потом уже делайте сильную защиту, а то так можно вечно бояться выйти на рынок. На первое время может подойти любая защита, сделанная "на коленке".
ФТ не может предоставить защиту индикаторам, так что наша система тут не поможет

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#104 Сообщение Николай Тарасов » Сб апр 09, 2011 1:40 pm

FT Support писал(а):Здравствуйте, Николай!

Вообще-то рекомендую использовать Дельфи, он гораздо более надёжен и удобен чем лазарус, у меня вот версия "Embarcadero® Delphi® 2010" работает нормально, советую попробовать, если найдёте.

Попробуйте выложить вот это видео: http://www.youtube.com/watch?v=vTlBqGP63JE должно получиться, думаю что мешала ссылка на канал

по поводу защиты индикаторов для программы, Вы действительно всё усложняете, сначала продайте 10-100 штук, а потом уже делайте сильную защиту, а то так можно вечно бояться выйти на рынок. На первое время может подойти любая защита, сделанная "на коленке".
ФТ не может предоставить защиту индикаторам, так что наша система тут не поможет
1. Спасибо, Александр:
1) за Делфи (буду откатываться с Линукса обратно);
2) за видео (нормально прикрепилось);
3) за совет не бояться (буду стараться, раз уж замахнулся);
4) и за 100 продаж (это уж, действительно, как пойдёт). :wink:
Весьма вам признателен!


2. Вообще-то странно, что у вас лично модификация 2010 года, а код Форекстестера (версии 2.7.5.398) скомпилирован на Delphi 2006/07 (так написано в файле 'C:\ForexTester2\bugreport.txt').

Вероятно, для финальной сборки своего продукта вы используете копию постарше.
Из чего я делаю вывод, что для моих целей вполне подойдут версии Delphi 2007-2010 гг. выпуска.
Правильно я понимаю?
* * *
Хотя, что это я прибедняюсь? Нашлась ваша "набережная в Сан-Франциско" (Эмбаркадеро). Уже качаю. :wink:


3. А другие платформы (маки, линуксы (с их 25% китайского технопарка), а также наладонники, планшетники и т.п.) вы не планируете охватить своим вниманием?
У Дукаскопии, например, это всё входит в линейку продуктов.
Андроид, кажется, только на подходе.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#105 Сообщение Николай Тарасов » Сб апр 09, 2011 6:23 pm

1. Установил себе 'Embarcadero (CodeGear) Delphi 2010 Architect Lite'.

Оказывается модельный ряд Delphi-продуктов выглядит так:
Delphi 5/6/7/2006/2007/2009/2010 (список из Delphi Distiller).

Вот о чём я спрашивал вас Александр, но не знал как. :wink:



2. Попробовал построить (скомпилировать) ваш Alligator (из папки C:\ForexTester2\Examples\Indicators\Delphi).
Ура!!! DLL-библиотека создана успешно!!!
Наконец-то!
:wink:

Но вот кое что D10 не понравилось:
Checking project dependencies...
Building Alligator.dproj (Debug configuration)
[DCC Warning] IndicatorInterfaceUnit.pas(877): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(890): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(896): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(902): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(902): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(908): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(914): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(920): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(926): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(978): W1058 Implicit string cast with potential data loss from 'Char' to 'AnsiString'
[DCC Warning] IndicatorInterfaceUnit.pas(996): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1002): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1008): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1014): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1020): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1026): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1032): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1129): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1138): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1148): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1155): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1164): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1173): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1182): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1211): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1211): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1212): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1256): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1265): W1044 Suspicious typecast of AnsiString to PWideChar
[DCC Warning] IndicatorInterfaceUnit.pas(1274): W1044 Suspicious typecast of AnsiString to PWideChar
Success
Elapsed time: 00:00:00.8
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#106 Сообщение Николай Тарасов » Сб апр 09, 2011 7:18 pm

Попытка проделать то же самое для скрипта ObjectsTest, к сожалению, не увенчалась успехом:

Код: Выделить всё

Checking project dependencies...
Building ObjectsTest.dproj (Debug configuration)
[DCC Warning] SysUtils.pas(6198): W1000 Symbol 'SInvalidInteger' is deprecated: 'Use SysConst.SInvalidInteger'
[DCC Warning] SysUtils.pas(6222): W1000 Symbol 'SInvalidInteger' is deprecated: 'Use SysConst.SInvalidInteger'
[DCC Warning] SysUtils.pas(15053): W1000 Symbol 'STimeEncodeError' is deprecated: 'Use SysConst.STimeEncodeError'
[DCC Warning] SysUtils.pas(15431): W1000 Symbol 'CharToByteLen' is deprecated: 'Use CharToElementLen.'
[DCC Warning] SysUtils.pas(15434): W1000 Symbol 'ByteToCharLen' is deprecated: 'Use ElementToCharLen.'
[DCC Warning] SysUtils.pas(15436): W1000 Symbol 'CharToByteIndex' is deprecated: 'Use CharToElementIndex.'
[DCC Warning] SysUtils.pas(15437): W1000 Symbol 'CharToByteLen' is deprecated: 'Use CharToElementLen.'
[DCC Warning] SysUtils.pas(15537): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(15538): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(15831): W1000 Symbol 'CharToByteLen' is deprecated: 'Use CharToElementLen.'
[DCC Warning] SysUtils.pas(15834): W1000 Symbol 'ByteToCharLen' is deprecated: 'Use ElementToCharLen.'
[DCC Warning] SysUtils.pas(15836): W1000 Symbol 'CharToByteIndex' is deprecated: 'Use CharToElementIndex.'
[DCC Warning] SysUtils.pas(15837): W1000 Symbol 'CharToByteLen' is deprecated: 'Use CharToElementLen.'
[DCC Warning] SysUtils.pas(15938): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(15939): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(16224): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(16288): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(16391): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(16482): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(16588): W1000 Symbol 'SInvalidDate' is deprecated: 'Use SysConst.SInvalidDate'
[DCC Warning] SysUtils.pas(16595): W1000 Symbol 'SInvalidDate' is deprecated: 'Use SysConst.SInvalidDate'
[DCC Warning] SysUtils.pas(16631): W1000 Symbol 'SInvalidTime' is deprecated: 'Use SysConst.SInvalidTime'
[DCC Warning] SysUtils.pas(16638): W1000 Symbol 'SInvalidTime' is deprecated: 'Use SysConst.SInvalidTime'
[DCC Warning] SysUtils.pas(16674): W1000 Symbol 'SInvalidDateTime' is deprecated: 'Use SysConst.SInvalidDateTime'
[DCC Warning] SysUtils.pas(16681): W1000 Symbol 'SInvalidDateTime' is deprecated: 'Use SysConst.SInvalidDateTime'
[DCC Hint] SysUtils.pas(16725): H2077 Value assigned to 'LastBlankPos' never used
[DCC Hint] SysUtils.pas(16817): H2077 Value assigned to 'LastBlankPos' never used
[DCC Warning] SysUtils.pas(16892): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(17136): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(17170): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(17644): W1000 Symbol 'EStackOverflow' is deprecated
[DCC Warning] SysUtils.pas(18669): W1000 Symbol 'ByteToCharIndex' is deprecated: 'Use ElementToCharIndex.'
[DCC Warning] SysUtils.pas(19584): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(19602): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(19610): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(19615): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(19619): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Warning] SysUtils.pas(19662): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Hint] SysUtils.pas(214): H2219 Private symbol 'Destroy@' declared but never used
[DCC Hint] SysUtils.pas(268): H2219 Private symbol 'Destroy@' declared but never used
[DCC Hint] SysUtils.pas(3514): H2219 Private symbol 'Destroy@' declared but never used
[DCC Fatal Error] graphics.pas(22): F2051 Unit Classes was compiled with a different version of SysUtils.TEncoding.GetBytes
Failed
Elapsed time: 00:00:01.0
Файл 'Graphics.pas' взял здесь: 'C:\Program Files\Embarcadero\RAD Studio\7.0\source\Win32\vcl'.
Файл 'SysUtils.pas' - здесь: 'C:\Program Files\Embarcadero\RAD Studio\7.0\source\Win32\rtl\sys'.

* * *
Александр, пожалуйста, помогите.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#107 Сообщение Николай Тарасов » Сб апр 09, 2011 7:50 pm

Попробовал заменить файлы 'SysUtils.pas' и 'Graphics.pas', входящие в стостав Delphi 2010 (из папки 'C:\Program Files\Embarcadero\RAD Studio\7.0') на старые (из папки 'C:\Program Files\Borland\Delphi7').
Результат тот же - неудачный.
Сообщения об ошибках только менялись.

Попробовал установить ассоциацию делфи-файлов с Delphi 2007 (в Delphi Destiller). Но эта опция вообще ни на что не повлияла. Ошибки те же самые.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#108 Сообщение Николай Тарасов » Вс апр 10, 2011 7:26 am

Здравствуйте, Александр.
Чтобы быть последовательным, я взял хорошо нам известную тройку - индикатор, стратегию и скрипт с одноимённым названием 'ObjectsTest'.
И проделал с ними в Delphi 2010 операцию Build (Shift+F9).
DDL-библиотека получилась только у индикатора.
* * *
- Земля, Земля! Базу вызывает Следопыт.
- Прошу помощи!
- Как поняли меня? Приём.
:wink:
--
Список проблем (сообщения об ошибках и успехах) прилагается.


PS
Слушайте, а может мне вместо 'Embarcadero (CodeGear) Delphi 2010 Architect Lite' попробовать установить расширенную версию 'Embarcadero (CodeGear) RAD Studio 2010 Architect + Delphi Prism 2010'?
Хотя знающие люди разницы между ними не замечают.

Или просто настроить программу надо нормально?
Но как? Подскажите, пожалуйста.
Вложения
Script Messages of Build (Sift+F9).rar
(823 байт) 1169 скачиваний
Strategy Messages of Build (Sift+F9).rar
(620 байт) 1131 скачивание
Indicator Messages of Build (Sift+F9).rar
(592 байт) 1030 скачиваний
Последний раз редактировалось Николай Тарасов Вс апр 10, 2011 6:52 pm, всего редактировалось 1 раз.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#109 Сообщение Николай Тарасов » Вс апр 10, 2011 6:51 pm

Здравствуйте.
Сейчас только определил (методом знаменитого "научного тыка"), что скомпилировать код можно не только через процедуру/кнопку Build (Sift+F9), но и через процедуру/кнопку Compile (Ctrl+F9).
Эта "мелочь" позволила мне успешно создать dll-библиотеки для своих индикаторов.
Уже хорошо!

Но вот со скриптами и стратегиями проблемы остались.
Сообщения после Компиляции (Ctrl+F9) (прилагаются) странно отличаются от тех, что после Строительства (Sift+F9) (см. в предыдущем сообщении).

У индикаторов они отличаются лишь частично.
У стратегий они идентичны.
А у скриптов они совершенно разные.

Вот некоторые подробности:
1. У индикатора 'ObjectsTest' ошибок Компиляции нет.

2. У стратегий главная ошибка Компиляции:
[DCC Error] StrategyInterfaceUnit.pas(894): E2250 There is no overloaded version of 'DateTimeToString' that can be called with these arguments
Она касается строки StrategyInterfaceUnit.pas(894):

Код: Выделить всё

  DateTimeToString(result, 'yyyy.mm.dd hh:nn', DateTime);
3. У скрипта 'ObjectsTest' главная ошибка Компиляции:
[DCC Error] ScriptInterfaceUnit.pas(795): E2250 There is no overloaded version of 'DateTimeToString' that can be called with these arguments
Она касается строки ScriptInterfaceUnit.pas(795):

Код: Выделить всё

  DateTimeToString(result, 'yyyy.mm.dd hh:nn', DateTime);
* * *
Как тут быть?
Что делать, что бы снова всё заработало?
Как сдвинуться с мёртвой точки?

Как-то не хочется в ваших базовых файлах 'StrategyInterfaceUnit' самостоятельной правкой заниматься.
Хотя это мысль!
Надо попробовать.
Вложения
Script Messages of Compile (Ctrl+F9).rar
(609 байт) 1112 скачиваний
Strategy Messages of Compile (Ctrl+F9).rar
(623 байт) 1101 скачивание
Indicator Messages of Compile (Ctrl+F9).rar
(441 байт) 1119 скачиваний
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

Спасение утопающих - дело рук самих утопающих?!

#110 Сообщение Николай Тарасов » Пн апр 11, 2011 7:08 am

Ну так и есть!
Проблема из-за конфликта индивидуальных (региональных) настроек даты в Windows и шаблоном в вашей функции StrTime.
Делал так.
1. Поменял свои настройки даты с 'dd.MM.yyyy' на 'yyyy.MM.dd'.
2. Перезагрузился (ОС).
3. Скомпилировал стратегию и скрипт. Проблемы остались.
4. Переписал вашу функцию StrTime в 'StrategyInterfaceUnit' и 'ScriptInterfaceUnit':

Код: Выделить всё

{-----Convert time to string-------------------------------------------------}
function StrTime(DateTime: TDateTime): AnsiString;
begin
//  DateTimeToString(result, 'yyyy.mm.dd hh:nn', DateTime);
  result := DateTimeToStr(DateTime);
end;
5. Компиляция удалась!
Даже к моим скриптам никаких претензий!

* * *
Ура, товарищи!
Мы спасены!

Так и просится наружу популярный лозунг времён моего детства:
"Спасение утопающих - дело рук самих утопающих!":wink:

* * *
Надо заметить, что я с этим (со сложностями конвертации дат) столкнулся ещё здесь: http://forextester.ru/forum/viewtopic.p ... c&start=45 (см. мой пост Добавлено: Ср Фев 09, 2011 11:45 pm Заголовок сообщения: Как определить год (year)?).

Александр, Михаил.
Во избежание дальнейших проблем у пользователей
рекомендую везде использовать пару взаимодополняющих друг друга функций DateTimeToStr и StrToDateTime!!!
В частности, в ваших базовых 'StrategyInterfaceUnit' и 'ScriptInterfaceUnit'.

* * *
Интересно, а почему с 'IndicatorInterfaceUnit' ничего подобного не проявилось?
...
А вот почему - функции StrTime там просто нет! :wink:


PS
Кстати говоря.
Так неудобно, что ваша одноимённая тройка 'TechnicalFunctions.pas' не имеет различительный префикс.

То ли дело - другая ваша тройка 'InterfaceUnit.pas'.
Сразу видно, "кто есть кто".
Хоть в одну папку складывай.

Думаю, подобному рестайлингу можно подвергнуть и ваш легендарный 'ObjectsTest.dpr'.
* * *
Так или иначе, решать, разумеется, вам,
"дорогие мои земляки".


PS2
Да, кстати. Чуть не забыл!
Теперь (с новыми 'StrategyInterfaceUnit' и 'ScriptInterfaceUnit') можно вернуть мои прежние настройки формата дат ('dd.MM.yyyy').
* * *
Всем спасибо!
Аплодисментов не надо. :wink:


PS3
Особую признательность хочу выразить Александру!
Александр, вы мне очень-очень помогли (в главном)!
Без вас я бы всё ещё с Лазарем маялся.
Спасибо большое!

Приятно иметь дело с такими вот людьми, как вы, Александр и Михаил!
Немногословными, но отзывчивыми.
Как в том добром мультике "И мама меня простит": http://www.youtube.com/user/Terranin#p/ ... cYp1QoBkAQ
Крепко вас всех обнимаю.
Вы очень хорошие люди.
* * *
Держитесь там!
Вы же для нас как космонавты!
С праздником Вас, дорогие!!!
http://www.youtube.com/watch?v=CGQ1ZAQJzY8
--
С уральским приветом - Николай Тарасов. :wink:

---
http://www.youtube.com/watch?v=tz76JwccA0A -
"Я-Земля!
Я своих провожаю питомцев,
Сыновей, дочерей.
Долетайте до самого Солнца.
И домой возвращайтесь скорей!"
Последний раз редактировалось Николай Тарасов Пн апр 11, 2011 10:41 am, всего редактировалось 2 раза.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#111 Сообщение Николай Тарасов » Пн апр 11, 2011 8:51 am

Да, пока не забыл.
Перепрыгивая с одного компилятора на другой, я одну маленькую деталь подметил.
Лазарь почему-то не работает с проектами, имя которых содержит точку.
Например, вот с таким: 'User.ObectsTest.dpr'.
Делфи же не допускает точки лишь в самом начале имени.
Например, вот такое: '.User.ObectsTest.dpr'.
Я желаю всем счастья.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#112 Сообщение FT Support » Вт апр 12, 2011 8:39 pm

Здравствуйте, Николай,

извините, все Ваши посты не осилил :) постараюсь прочитать позже, но по фразе "Ура, товарищи! Мы спасены!" понятно что всё решилось хорошо, если есть какие-то проблемы, которые ещё не решены - говорите.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#113 Сообщение Николай Тарасов » Ср апр 13, 2011 12:48 am

FT Support писал(а):Здравствуйте, Николай,

... если есть какие-то проблемы, которые ещё не решены - говорите.
Здравствуйте, Александр.

Так ведь и не получается у меня, решить проблему с французскими (арабскими, китайскими, испанский, армянскими и т.д.) текстовыми метками.

Делал так.

1. Поменял компилятор (перешёл с Delphi 7 на Delphi 2010).


2. Переписал функцию UserOptionGet так:

Код: Выделить всё

  function UserOptionGet(OptFile: string; Option: string): string; 
  // Функция для извлечения User-опций из файлов. 
...
///          result := Copy(line, x1, x2);   // Код для Delphi 7
          result := UTF8ToString(Copy(line, x1, x2)); // Код для Delphi 2010
...
Исходный код функции смотрите здесь: http://forextester.ru/forum/viewtopic.p ... c&start=75
До этой поправки (UTF8ToString) на печать выводился текст в UTF8-кодировке.


3. Далее вывел французскую текстовую метку на график (и в Журнал сообщений). В результате - ошибка обработки спецсимволов лишь видоизменилась (см. Приложение).


4. Для контроля (и проверки корректности обработки символов при печати) вывел на печать исходную строчку в явном виде (см. код ниже). Результат - ошибка осталась прежней.

Код: Выделить всё

var  
  no_tx: String;  
...
  // Печать текста из файла:
  no_tx := UserOptionGet('\UserToFT\User.Comments\User.French.dat', 'SuccessComment'); // 'SuccessComment=Réussi!' - это запись в файле.
  Print('no_tx=' + no_tx); // Печать строки, считанной из файла.
  // Непосредственная печать текста:
  Print('Control line: Réussi!'); // Печать строки, заданной в явном виде.
5. Попробовал вставлять исходный текст (строку) вручную прямо в текстовые метки на графике.
Результат - абсолютно та же ошибка при хранении и выводе спецсимволов на экран.

* * *
В сети пишут, что, не смотря на громкие заявления Embarcadero о том, что Delphi 2009, 2010 и XE полностью Юникодовые, опытные программисты испытывают затруднения с выводом на экран правильных сообщений не на английском языке.

Интересно, но вы же, Александр, справились как-то с этим.

Что же, в таком случае, мне можно ещё попробовать сделать?
Думается, что для достижения того же результата, мне нужна ещё ОС как у вас.

Александр, неужели это единственный вариант?!

Может ссылки на удачные примеры дадите?
Вложения
String Errors.rar
(4.28 КБ) 1021 скачивание
Последний раз редактировалось Николай Тарасов Пн апр 18, 2011 10:49 am, всего редактировалось 3 раза.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

Как написать несколько строк?

#114 Сообщение Николай Тарасов » Чт апр 14, 2011 10:59 am

Здравствуйте.
Продолжаю делиться опытом.

Сегодня у меня три темы:
1. Как разбить цвет на RGB-составляющие.
2. Как правильно получить цвет из числа.
3. Как написать несколько строк с помощью текстовой метки.
Последний раз редактировалось Николай Тарасов Чт апр 14, 2011 12:38 pm, всего редактировалось 3 раза.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#115 Сообщение Николай Тарасов » Чт апр 14, 2011 11:58 am

1. Как разбить цвет на RGB-составляющие
Когда нужно работать с цветами, то часто требуется знать составляющие
Красного цвета (Red), Зеленого (Green) и Синего (Blue).
Эти величины, конечно, можно вычислить математически.
Но в WinApi уже реализованы такие функции,
так что не стоит изобретать велосипед :).
Вот эти функции:
- GetRValue - красная составляющая;
- GetGValue - зеленая;
- GetBValue - синяя;
В качестве параметра этим функциям передается числовое представление цвета.
--
Описание: function GetRValue(RGBColor: Longint): Byte;
---
Источник: http://delphiblog.ru/delphi-faq/graphic/color-to-rgb/
Последний раз редактировалось Николай Тарасов Чт апр 14, 2011 12:16 pm, всего редактировалось 3 раза.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#116 Сообщение Николай Тарасов » Чт апр 14, 2011 11:58 am

2. Как правильно получить цвет из числа

Код: Выделить всё

ClNum := 16711680; //а) IntToHex(16711680) = #FF0000. 
                   //б) RGB($FF, $00, $00) = RGB(255, 0, 0) = clRed.
ObjCl:=RGB(GetBValue(ClNum),GetGValue(ClNum),GetRValue(ClNum)); //в) The Red (BGR)!!!
1) Обратите внимание, что при таком написании (см. последнюю строку кода) красный (R) и синий (B) цвета нужно переставлять местами!!!
Как здесь написано: http://pmg.org.ru/nehe/nehe35.htm, - это из-за того, что "в Windows данные RGB (в картинках) фактически хранятся наоборот (BGR)".
Очень странно, что записи RGB($FF, $00, $00) и RGB(255, 0, 0) (см. комментарий "б" к коду) не требуют такой же перестановки.

2) О том, как можно узнать код нужного цвета смотрите здесь (Добавлено: Пт Дек 31, 2010 6:39 am): http://forextester.ru/forum/viewtopic.p ... ight=#3538

3) Ещё "нeсколько полезных функций для работы с цветами":
http://delphiworld.narod.ru/base/work_with_colors.html
Последний раз редактировалось Николай Тарасов Пт апр 22, 2011 10:48 pm, всего редактировалось 26 раз.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#117 Сообщение Николай Тарасов » Чт апр 14, 2011 12:12 pm

3. Как написать несколько строк с помощью текстовой метки

Код: Выделить всё

  Text := 'Первая строка' + #13#10 + 'Вторая строка';
  ObjectCreate(TextName, obj_Text, 0, TextTime, TextPrice);
  ObjectSetText(TextName, Text, TextSize, TextFont, TextColor);
Источник: http://www.delphi.int.ru/articles/25/ - Что такое #13#10?
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#118 Сообщение Николай Тарасов » Вт апр 19, 2011 12:48 pm

Здравствуйте, Александр и Михаил.
Что-то нет от вас вестей.
Такое ощущение, что вы реагируете только на "хвостики" (самые крайние сообщения на форуме).
Причём - на "хвостики" только с заглавной страницы вашего форума: http://forextester.ru/forum/
Вот пишу вам сам. :wink:

Во-первых, хочу напомнить о себе и вопросах, заданных ранее (см. пост "Ср Апр 13, 2011 5:48 am").

Во-вторых, скажите, пожалуйста, как можно в скрипте узнать актуальный (на момент запроса) перечень, используемых пользователем таймфреймов?
Мне это понадобилось для точного определения (с точностью до минуты) time-координат экстремальных значений (High и Low) бара (свечки) на произвольном таймфрейме.
Пока что мне видится одна возможность - считывать эти сведения из файла с FT-опциями (наподобие тому, как это делает ваша функция GetFTKey).

Но какой из двух параметров брать?
emTimeframesList=1 5 15 30 60 240 1440 10080 43200
tmTimeframesList=1 5 15 30 60 240 1440 10080 43200
Разъясните, пожалуйста, какой для чего.

Заранее вас благодарю.
Последний раз редактировалось Николай Тарасов Ср апр 20, 2011 11:27 am, всего редактировалось 2 раза.
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#119 Сообщение Николай Тарасов » Ср апр 20, 2011 2:23 am

Здравствуйте.

Столкнулся с тем, что в скрипете неправильно работает функция Symbol.
Вместо 'EURUSD', она выдаёт '???'. :(

Поправьте, пожалуйста.
Я желаю всем счастья.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#120 Сообщение FT Support » Ср апр 20, 2011 8:38 am

Здравствуйте, Николай,

Список таймфеймов действительно лучше доставать из файла опций.

emTimeframesList - это список таймфреймов режима редактирования,
tmTimeframesList - список таймфреймов режима тестирования

т.е. предпочтительно брать tmTimeframesList

Функцию Symbol проверим.

С выводом юникод-символов на текстовые метки всё сложно... нам нужно переделать механизм создания текстовой метки, сделаем в следующих обновлениях.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

Правильный диагноз - половина успеха

#121 Сообщение Николай Тарасов » Ср апр 20, 2011 11:14 am

FT Support писал(а):Здравствуйте, Николай,

Список таймфеймов действительно лучше доставать из файла опций.
... предпочтительно брать tmTimeframesList
...
1. Спасибо, большое.

FT Support писал(а):...
Функцию Symbol проверим.
...
2. По поводу функции Symbol добавлю, что я делал так:
1) в скрипте отловил, что функция iBarShift

Код: Выделить всё

iBarShift(Symbol, 1, time, false);
выдаёт "-1" (то есть не находит существующий бар);
2) вывел на печать компоненты функции iBarShift

Код: Выделить всё

Print('Symbol='+Symbol;
и обнаружил во это:
"Symbol=???" (то есть причина ошибки - функция Symbol);

* * *
Александр, пока вы исправляете свою функцию Symbol, дайте, пожалуйста, рекомендации о том, как узнать (из какого файла считать) название валюты (а вместе с ним и другие параметры) текущего графика (палитру, стили и т.д.).
Я тут обнаружил у себя две пары одноимённых файлов: SymbolList.dat и desktop.dat. Но как ими пользоваться - непонятно.
FT Support писал(а):...
С выводом юникод-символов на текстовые метки всё сложно... нам нужно переделать механизм создания текстовой метки, сделаем в следующих обновлениях.
3. Ну, наконец-то, общими усилиями локализовали проблему!
Поздравляю!
Правильный диагноз - половина успеха.

* * *
Александр, про надписи в графических объектах:
- 'Horizontal line' (Text),
- 'Fibo retracement' (Level Text),
- 'Fibo time zones' (Level Text),
- 'Fibo fan' (Level Text), - не забудьте, пожалуйста.
Судя по всему, там аналогичный механизм в основе.

* * *
Кстати, говоря:
1) 'Fibo fan'-объекты по умолчанию имеют название и тип 'Fibo time zones' (только что заметил);
2) уровни в Fibo-объектах всех типов переименовать удаётся лишь вручную, но не программно (впрочем, я писал вам об этом).
Я желаю всем счастья.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#122 Сообщение FT Support » Чт апр 21, 2011 8:34 am

Здравствуйте, Николай,

Странно, но у нас функция Symbol в скриптах работает правильно...
возможно это зависит от региональных настроек или различий в компиляторах, пожалуйста скомпилируйте вот этот код и пришлите нам dll:

Код: Выделить всё

library TestScript;

uses
  SysUtils, ScriptInterfaceUnit;

procedure Init; stdcall;
begin
  ScriptShortName('TestScript');
  ScriptDescription('TestScript');
end;

procedure Done; stdcall;
begin

end;

procedure Execute; stdcall;
begin
Print(Symbol);
end;

exports

Init, Done, Execute;

begin

end.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

#123 Сообщение Николай Тарасов » Чт апр 21, 2011 10:56 am

FT Support писал(а):Здравствуйте, Николай,

Странно, но у нас функция Symbol в скриптах работает правильно...
возможно это зависит от региональных настроек или различий в компиляторах, пожалуйста скомпилируйте вот этот код и пришлите нам dll: ...[/code]
Здравствуйте, Александр.
Ваше задание выполнил.

И ещё:
1) мой компилятор называется "Embarcadero (CodeGear) Delphi 2010 Architect Lite." (см.рисунок и страницу с описанием).
2) источник: RuTracker.org (ex torrents.ru).
Вложения
TestScript.rar
(132.7 КБ) 1180 скачиваний
Embarcadero (CodeGear) Delphi 2010 Architect Lite RuTracker.org (ex torrents.ru).rar
(22.42 КБ) 1194 скачивания
Embarcadero(CodeGear) RAD Studio 2010 Architect Lite.JPG
(93.32 КБ) 4350 скачиваний
Я желаю всем счастья.

Аватара пользователя
Николай Тарасов
Сообщения: 144
Зарегистрирован: Чт авг 27, 2009 4:39 pm
Откуда: Екатеринбург
Контактная информация:

Пусть безобразно, но однообразно

#124 Сообщение Николай Тарасов » Пт апр 22, 2011 11:54 pm

Здравствуйте, Александр.

Только что заметил, что при наведении мышкой на текстовую метку во всплывающем окне подсказки у вас пишется содержание параметра "Text". То есть в окне дублируется то, что мы и так видим (читаем на графике). Имя же объекта остаётся неизвестным.

Но вот если проделать то же самое с другими вашими графическими объектами (с трендовыми, вертикальными или горизонтальными линиями, со всеми Фибо-объектами, с Андреевскими вилами, с прямоугольниками, треугольниками и эллипсами, кроме, полилинии и элементов волновой разметки), то во всплывающем возле них окне подсказки можно прочесть индивидуальное имя объекта.

Предлагаю ввести однообразие - то есть для всех объектов указывать имя во всплывающем окне подсказки.

Как гласит армейская мудрость: "Пусть безобразно, но однообразно".
Я желаю всем счастья.

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#125 Сообщение FT Support » Сб апр 23, 2011 6:24 am

По поводу текстовых меток вопрос спорный.

Мы выводим текст для того чтобы можно было увидеть текст даже если часть метки находится за пределами экрана или чем-то перекрыта. Это для программиста удобнее чтобы отображалось имя объекта, а для пользователя значение имеет только текст.

Ответить