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

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

Ребята из Казани

#76 Сообщение Николай Тарасов » Вс мар 06, 2011 9:26 pm

Читаю про MQL5 (MT5).
Оказывается его сделали и делают тоже нашенские ребята - из Казани!!!
Смотрите сами: http://www.metaquotes.net/ru/company/management

Вот это да! Молодцы, братья татары.
На уровне работают.

Надо будет и с ними пообщаться как-нибудь. :wink:

--

PS

На форуме http://www.mql5.com/
интересный Гугл-инструмент нашёл. "Тенденции" (тренды) называется. Он статискику разнообразных интернет-явлений составляет.
Видел такое лишь в программе про интернет-технологии на канале "РОССИЯ 24".

Странные результаты получаются у них.
Например, посмотрите вот на это:

1) http://www.google.com/trends?q=Forex+Te ... all&sort=0 - тенденции поиска 'Forex Tester, ForexTester, Forex Tester 2, ForexTester2'

2) http://www.google.com/trends?q=MQL4,+MT4,+MQL5,+MT5 - тенденции поиска 'MQL4, MT4, MQL5, MT5'
Я желаю всем счастья.

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

Как в скрипте узнать "текст/описание" объекта?

#77 Сообщение Николай Тарасов » Вт мар 08, 2011 1:03 am

Здравствуйте.
Подскажите, пожалуйста, как в скрипте узнать "значение текста/описания" у текстового объекта?

Для этого я попробовал извлечь параметр "OBJPROP_TEXT" с помощью функции ObjectGet() (см. скрипт 'ObjectsTest_Plus4').
Не вышло. Выдаётся ошибка:
[Ошибка] ObjectsTest_Plus4.dpr(175): Incompatible types: 'String' and 'Double'
[Ошибка] ObjectsTest_Plus4.dpr(176): Incompatible types: 'String' and 'Double'
[Ошибка] ObjectsTest_Plus4.dpr(177): Incompatible types: 'String' and 'Double'
[Ошибка] ObjectsTest_Plus4.dpr(178): Incompatible types: 'String' and 'Double'
[Ошибка] ObjectsTest_Plus4.dpr(179): Incompatible types: 'String' and 'Double'
[Ошибка] ObjectsTest_Plus4.dpr(180): Incompatible types: 'String' and 'Double'
[Ошибка] ObjectsTest_Plus4.dpr(181): Incompatible types: 'String' and 'Double'
Пробовал вместо текста записывать числа.
Но результат в буквальном и переносном смысле нулевой:
names[0]=0
names[1]=0
names[2]=0
names[3]=0
names[4]=0
names[5]=0
names[8]=0
Заранее благодарю за помощь.
Скрипт прилагается.


PS
Если есть какой-то другой рабочий вариант записи и считывания текста (не через текстовый объект), прошу сообщить. Не откажусь.
Вложения
ObjectsTest_Plus4.rar
(1.3 КБ) 1633 скачивания
Я желаю всем счастья.

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

#78 Сообщение Николай Тарасов » Вт мар 22, 2011 8:03 am

Здравствуйте.
На основе функции GetFTKey() соорудил функцию UserOptionGet() для считывания параметров из своих файлов.
Теперь вот пытаюсь сделать функцию для перезаписи параметров в этих файлах.
Но что-то у меня не получается - проблема с командой на удаление файла:
[Ошибка] UserSetting.dpr(616): Missing operator or semicolon
[Ошибка] UserSetting.dpr(616): Incompatible types: 'String' and 'PAnsiChar'
Помогите, пожалуйста, разобраться.

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

  
  function UserOptionSet(OptFile: string; Option: string; Value: string): Bool;
  // Функция для изменения опций в файлах пользователя.
  // Пример: UserOptionSet('\User\Options.dat', 'Option1', '1');
  // --
  // Прототипы:
  // 1) функции GetFTKey() и UserOptionGet();
  // 2) http://www.delphi.int.ru/articles/126/ (раздел "Хранение записей в файлах").
  // --
  var line:        string; // Строка
    OptionLength: Integer; // Длина имени опции
    FTFolderPath:  string; // FT-папка
    optDatPath1:   string; // Полное имя файла1 (Old)
    optDatPath2:   string; // Полное имя файла2 (New)
    handleOpt1:  TextFile; // Файловая переменная1 = Полное имя файла1
    handleOpt2:  TextFile; // Файловая переменная2 = Полное имя файла2
  begin
  result       :=                        false; // Предварительная установка
  FTFolderPath :=  ExtractFileDir(ParamStr(0)); // FT-папка: 'C:\ForexTester2'
  optDatPath1  :=    FTFolderPath +    OptFile; // Полное имя файла1 (Old)
  optDatPath2  :=    FTFolderPath + 'temp.dat'; // Полное имя файла2 (New)
  OptionLength :=               length(Option); // Длина имени опции
  if FileExists(optDatPath1) then
    begin
      AssignFile(handleOpt1, optDatPath1); // Привязка полн.имени1 файл.переменной1
      AssignFile(handleOpt2, optDatPath2); // Привязка полн.имени2 файл.переменной2
      Reset(     handleOpt1);              // Считывание файла1
      Rewrite(   handleOpt2);              // Перезапись файла2
      while not Eof(handleOpt1) do         // Пока не конец файла1
      begin
        // Читаем строку без перехода к следующей
        Read(handleOpt1, line);
        if (Copy(line, 0, OptionLength) = Option) then
          // В файл2 пишем новую строку с меткой переноса строки
          Writeln(handleOpt2, Option+'='+Value)
        else
          // В файл2 пишем старую строку как есть
          Write(handleOpt2, line);
      end;
      CloseFile(handleOpt1);
      CloseFile(handleOpt2);
    end;
 DeleteFile(optDatPath1);                                  // Строка 616 !!!!!
//  DeleteFile(FTFolderPath + OptFile);
//  DeleteFile(ExtractFileDir(ParamStr(0)) + OptFile);
///   DeleteFile('C:\ForexTester2\User\Options.dat');      // Строка 619 !!!!!
//
//  SetCurrentDir(optDatPath1);
//  SetCurrentDir(ExtractFileDir(ParamStr(0)) + OptFile);
//  DeleteFile('Options.dat');
  RenameFile(optDatPath2, optDatPath1);
  result := true;
  end;
Если же вместо строки 616 активировать строку 619, то проблема отстаётся:
[Ошибка] UserSetting.dpr(619): Missing operator or semicolon
* * *
Заранее благодарю.


PS

И ещё.

Скажите, пожалуйста, с помощью каких средств ФорексТестера пользователю можно (удобнее) вводить свои параметры долгосрочного действия?

Как я понимаю, диалоговое окно для внесения параметров открывается только у индикаторов.

Скрипты же, хоть и могут выдавать Settings-окно (через правую кнопку мышы), но фактически не меняют свои параметры.
По крайней мере, мне пока не удалось это сделать.
Последний раз редактировалось Николай Тарасов Пт май 20, 2011 12:14 pm, всего редактировалось 1 раз.
Я желаю всем счастья.

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

#79 Сообщение FT Support » Вт мар 22, 2011 7:58 pm

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

менять строки в файле options.dat бессмысленно, программа всё-равно перезапишет этот файл при закрытии.

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

чтобы победить ошибку Incompatible types: 'String' and 'PAnsiChar' нужно просто привести типы, например Pchar(ВашаСтрока) или наоборот.

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

Подскажите способ перезаписи параметров в файле

#80 Сообщение Николай Тарасов » Вт мар 22, 2011 11:44 pm

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

менять строки в файле options.dat бессмысленно, программа всё-равно перезапишет этот файл при закрытии.

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

чтобы победить ошибку Incompatible types: 'String' and 'PAnsiChar' нужно просто привести типы, например Pchar(ВашаСтрока) или наоборот.
Здравствуйте, Александр.

1. У меня была версия, что FT2 не разрешит перезапись файла.
Но, простите, я же не ваш файл 'C:\ForexTester2\options.dat' хочу менять, а свой собственный 'C:\ForexTester2\User\Options.dat'.
Неужели для этого нужно и корневую папку менять, выносить её куда-нибудь за пределы 'C:\ForexTester2\'?


2. Я, конечно же, могу менять содержимое своего dat-файла вручную. Но хотелось бы соорудить более удобный интерфейс для этого.
Александр, посоветуете, какие из средств FT2 можно использовать для этих целей?

Например, Settings-диалоговое окно для индикаторов вполне бы подошло. Там помимо всего есть ещё и параметры раскраски.

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


3. Александр, благодарю за ваш совет поменять типы в коде. Попробую ещё.


4. Александр, а может быть подскажите способ перезаписи параметров в файле? Я смотрю, ваш файл 'C:\ForexTester2\options.dat' не меняется (как файл) с момента установки FT. Значит, есть (да просто обязан быть!) некий метод перезаписи без создания файла-дублёра.

Понятно, что способов может быть масса.
Например, вставка через буфер.
Александр, задайте хотя бы направление для поиска, ссылку на приемлемое решение.
И, желательно, чтобы не очень было сложно для воспроизведения.
Что-нибудь в стиле вашей замечательной функции GetFTKey().
Уж, пожалуйста. Будьте столь любезны.

--
PS
Очень жаль, что на подобную, казалось бы, ерунду уходит так много времени. Надеюсь, что когда-нибудь FT будет наконец сопровождён подробными инструкциями с типовыми решениями пользовательских задач.
Я желаю всем счастья.

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

Делимся опытом

#81 Сообщение Николай Тарасов » Ср мар 30, 2011 12:24 pm

Здравствуйте.
Продолжаю делиться своими наработками по программированию для Форекстестера.

Итак, прошу любить и жаловать:
1. Функция для считывания параметра из файла с опциями пользователя.
2. Функция для изменения параметра в файле с опциями пользователя.
3. Стандартная и очень простая функция для проигрывания звуков.

Думаю, они понадобятся не только мне.
Последний раз редактировалось Николай Тарасов Ср мар 30, 2011 1:21 pm, всего редактировалось 1 раз.
Я желаю всем счастья.

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

Функция для считывания параметра из файла

#82 Сообщение Николай Тарасов » Ср мар 30, 2011 12:36 pm

1. Функция UserOptionGet()

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

  function UserOptionGet(OptFile: string; Option: string): string;
  // Функция для извлечения User-опций из файлов.
  // Пример: UserOptionGet('\UserToFT\Options.dat', 'History');
  // --
  // Переделал из: function GetFTKey().
  // Исходник: forextester.ru/forum/viewtopic.php?p=3689#3689 (см. GetFTKey).
  // --
  var OptionLength, lineLength: Integer; // Длина имени опции и длина строки
    x1, x2: Integer;                     // Номер первого символа и длинна опции
    FTFolderPath, optDatPath: string;    // FT-папка, полное имя файла и строка
    line: string;                        // Строка
    handleOpt: TextFile;                 // Файловая переменная=Полное имя файла
  begin
  result       :=                          ''; // Предварительная очистка
  FTFolderPath := ExtractFileDir(ParamStr(0)); // FT2-папка: 'C:\ForexTester2'
  optDatPath   :=      FTFolderPath + OptFile; // Полное имя файла
  OptionLength :=              length(Option); // Длина имени опции
  if FileExists(optDatPath) then
    begin
      AssignFile(handleOpt, optDatPath);       // Привязываем полное имя
                                               // файловой переменной
      Reset(handleOpt);                        // Запуск файла
      while not Eof(handleOpt) do              // Пока не конец файла
      begin
        Readln(handleOpt, line);               // Читаем файл по строкам
        lineLength:=length(line);              // Длина строки
        if (Copy(line, 0, OptionLength) = Option) then
        begin
          x1 := OptionLength+2;                // '+2' из-за '='.
          x2 := lineLength - (OptionLength+1); // '+1' из-за '='.
          result := Copy(line, x1, x2);
          break;
        end;
      end;
      CloseFile(handleOpt);
    end;
  end;
Последний раз редактировалось Николай Тарасов Пт май 20, 2011 12:15 pm, всего редактировалось 4 раза.
Я желаю всем счастья.

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

#83 Сообщение Николай Тарасов » Ср мар 30, 2011 12:42 pm

2. Функция UserOptionSet()

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

  function UserOptionSet(OptFile: string; Option: string; Value: string): Bool;
  // Функция для изменения опций в файлах пользователя.
  // Пример: UserOptionSet('\UserToFT\Options.dat', 'Option1', '1');
  // --
  // Прототипы:
  // 1) функции GetFTKey() и UserOptionGet();
  // 2) http://www.delphi.int.ru/articles/126/ (раздел "Хранение записей в файлах").
  // --
  var line:        string; // Строка
    OptionLength: Integer; // Длина имени опции
    FTFolderPath:  string; // FT-папка
    optDatPath1:   string; // Полное имя файла1 (Old)
    optDatPath2:   string; // Полное имя файла2 (New)
    handleOpt1:  TextFile; // Файловая переменная1 = Полное имя файла1
    handleOpt2:  TextFile; // Файловая переменная2 = Полное имя файла2
  begin
  result       :=                        false; // Предварительная установка
  FTFolderPath :=  ExtractFileDir(ParamStr(0)); // FT-папка: 'C:\ForexTester2'
  optDatPath1  :=    FTFolderPath +    OptFile; // Полное имя файла1 (Old)
  optDatPath2  :=    FTFolderPath + 'temp.dat'; // Полное имя файла2 (New)
  OptionLength :=               length(Option); // Длина имени опции
  if FileExists(optDatPath1) then
    begin
      AssignFile(handleOpt1, optDatPath1); // Привязка имени1 файл.переменной1
      AssignFile(handleOpt2, optDatPath2); // Привязка имени2 файл.переменной2
      Reset(     handleOpt1);              // Считывание файла1
      Rewrite(   handleOpt2);              // Перезапись файла2
      while not Eof(handleOpt1) do         // Пока не конец файла1
      begin
        Read(handleOpt1, line);            // Читаем строку без перехода к следующей
        if (Copy(line, 0, OptionLength) = Option) then
        begin
          Writeln(handleOpt2, Option+'='+  // В файл2 пишем новую строку
            Value);                        // с меткой переноса строки
          result := true;                  // Признак успешного изменения опции
        end
        else Write(handleOpt2, line);      // В файл2 пишем старую строку как есть
      end;
      CloseFile(handleOpt1);
      CloseFile(handleOpt2);
      DeleteFile(pchar(optDatPath1));
      RenameFile(optDatPath2, optDatPath1);
    end;
  end;
* * *
Благодарю Александра за помощь.
Исправить ранее возникавшую ошибку помогла функция pchar(), преобразующая 'String' в 'PAnsiChar'.
Последний раз редактировалось Николай Тарасов Ср мар 30, 2011 1:10 pm, всего редактировалось 2 раза.
Я желаю всем счастья.

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

#84 Сообщение Николай Тарасов » Ср мар 30, 2011 1:00 pm

3. Функция PlaySound()
Delphi урок - Воспроизводим звук в программе без MediaPlayer
Автор урока: Владимир Любаев
Источник: http://www.delphiexpert.ru/view_lesson.php?id=71
--
Парадокс, но я часто сталкиваюсь с тем, что многие не умеют воспроизводить звук
в программе без использования компонента MediaPlayer. В этом небольшом уроке
я хочу исправить это дело и показать вам, как проиграть у себя в программе
звуковой файл в формате Wav без использования MediaPlayer.

На самом деле делается это очень просто.
Достаточно всего лишь добавить в раздел uses модуль mmsystem

И далее в месте где вам нужно воспроизвести звук использовать функцию PlaySound

function PlaySound(pszSound:PChar; hmod:HINST; fdwSound:Cardinal):boolean;

Как всегда разберем это на конкретном примере.

Первым делом открываем Delphi, создаем новый проект и дописываем в раздел uses
модуль mmsystem.
Далее кидаем на форму кнопку (Button) с закладки Standard и создаем на ней
обработчик событий Onclick.
Между begin end пишем:

PlaySound('D:\1.wav', 0, SND_ASYNC);

Первый параметр в нашей функции это полный путь к звуковому файлу с указанием
его расширения, т.к. у меня файл называется 1.wav и находиться на диске
D:\ я написал тут 'D:\1.wav'.
Второй параметр используется в случае, когда звук берется из ресурса, поскольку
мы этого делать не будем, то можно этот параметр задавать равным 0 или nil.
Последний параметр определяет, как будет воспроизводиться звук
(режим воспроизведения). Существует несколько режимов воспроизведения
которые задаются соответствующими флагами, вот пример некоторых из них:

SND_ASYNC - Звук воспроизводится асинхронно и функция возвращается сразу же
после начала воспроизведения. Чтобы прекратить воспроизведение нужно вызвать
функцию PlaySound с параметром pszSound, равным 0.
SND_LOOP - воспроизведение звука постоянно повторяется, одновременно надо
установить флаг SND_ASYNC.
SND_NOSTOP - Если заданный звук не может быть воспроизведен из-за занятости
ресурсов, то функция немедленно вернет false (и звук не будет воспроизведен).
Если же данный флаг не указан, то функция попытается остановить воспроизведение
другого звука, чтобы освободить ресурсы.
SND_PURGE - Останавливает воспроизведение любых звуков, вызванных в данной задаче.
SND_SYNC - Синхронное воспроизведение звука события. Функция PlaySound
возвращается только после окончания воспроизведения.

т.е. Если мы хотим, чтобы звук воспроизводился асинхронно и постоянно повторялся
в нашей функции нужно использовать флаги SND_ASYNC и SND_LOOP.
Комбинировать флаги можно при помощи операции or.

Пример:

PlaySound('D:\1.wav', 0, SND_ASYNC or SND_LOOP);

Вот в принципе и все что я хотел рассказать вам в этом уроке. До встречи.

Владимир Любаев
--
Источник: http://www.delphiexpert.ru/view_lesson.php?id=71



PS
Вместо явного указания папки с wav-файлом:

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

  PlaySound('C:\ForexTester2\UserToFT\UserSounds\UserFile.wav', 0, SND_SYNC);
можно сделать немного иначе:

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

  PlaySound(pchar(ExtractFileDir(ParamStr(0))+     // FT-папка: 'C:\ForexTester2'
    '\UserToFT\UserSounds\UserFile.wav'), 0, SND_SYNC);
То есть адрес FT-папки определяется также как в функции GetFTKey - автоматически.
Последний раз редактировалось Николай Тарасов Ср апр 06, 2011 11:21 am, всего редактировалось 3 раза.
Я желаю всем счастья.

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

#85 Сообщение FT Support » Ср мар 30, 2011 1:17 pm

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

Спасибо за то что делитесь информацией!

Извините, не было времени Вам ответить, сейчас занимаемся новым релизом (2.7)

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

#86 Сообщение Николай Тарасов » Ср мар 30, 2011 1:54 pm

FT Support писал(а):... Извините, не было времени Вам ответить, сейчас занимаемся новым релизом (2.7)
Хорошо-хорошо. С нетерпением ждём публикации.

И всё же, Александр, надеюсь, вы сможете помочь мне с организацией ввода параметров через скрипт.
Хотя бы советом.

Возможно, для того, чтобы решить эту задачу мне нужно самостоятельно "состряпать" некую форму.
Подобную той, что у вас сделана для индикаторов.
И потом уже вызывать её из скрипта.

Но, может быть, вы включите эту задачу в свой план?
Я желаю всем счастья.

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

#87 Сообщение FT Support » Пт апр 01, 2011 8:50 am

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

Наверное я неправильно понимаю Ваш вопрос, но ответ по заданию параметров из скрипта очевиден - нужно просто использовать стандартную форму параметров скрипта (см скриншот)
Вложения
.png
(21.77 КБ) 4488 скачиваний

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

#88 Сообщение Николай Тарасов » Сб апр 02, 2011 3:36 am

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

Наверное я неправильно понимаю Ваш вопрос, но ответ по заданию параметров из скрипта очевиден - нужно просто использовать стандартную форму параметров скрипта (см скриншот)
Здравствуйте, Александр.

Вы думаете, Я так не пробовал? :wink:
Думал (расcчитывал), что будет как в MT4.
Там единый порядок ввода данных: в скриптах так же, как в индикаторах.
У Вас же совсем не то. Ну, совершенно!

Хотя, может, Я просто чего-то не допонял.
Свои проблемы с вводом параметров в скрипт опишу позже.
Надо подготовить примеры.

* * *
А пока, хочу рассказать о другом.
Занялся Я тут подготовкой многоязычного интерфейса.
Стал пробовать разные языки. В частности французский.
И столкнулся со сложностью адекватного отражения некоторых символов (см. рисунок). Надписи наносил с помощью текстовых меток.

Делал по-разному: из файла (верхняя надпись на рисунке) и вручную (нижняя надпись на рисунке).
Менял шрифты (Arial Unicode MS, Arial, WST_Fren). Менял тип файлов (dat, txt, xls, doc, ods) и их кодировку (ANSI, Юникод, Юникод Big Endian, UTF-8 ), из которых выводил текст.
Чтобы получить последний (один из наилучших) вариантов пришлось отказаться от dat-формата. Вместо него Я использовал txt-файл с кодировкой UTF-8 типа и разделителями табуляции.

Даже попробовал новую фишку Форекстестера (см. version 2.7.5 от 23.03.11).
/Кстати, поздравляю Вашу команду с очередной высотой!/
Установил французский язык. :wink:
Ничего не помогает.

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

--
Заранее благодарю за помощь.




PS
Вы спросите, чего это Я "Я"-кать и "Вы"-кать стал?
Всё просто - Я послушал мистера Фримана (Mr.Feeman):
http://vkontakte.ru/video93635988_159768620 - Mr.Feeman "Я - с большой буквы"
Всем рекомендую!

:wink:



PS2
Думаю, Мне надо попробовать ещё lng-файл соорудить, аналогичный вашему 'LngData.lng'.
А так же почитать про "Создание программ с многоязыковым интерфейсом".
Например, здесь:
http://www.insidepro.com/doc/004r.shtml




PS3
Но, сдаётся Мне, что все ниточки опять подводят к текстовым меткам.
Весьма вероятно, что это они некорректно работают.

Судите сами.
Когда Я вручную вставляю правильный французский текст в форму для текстовой метки, то после сохранения чёрточка над "è" пропадает как с изображения, так и из самой формы (это видно при повторном осмотре раздела "Текст" внутри формы).
Когда же Я проделываю то же самое с горизонтальной линией, то чёрточка пропадает лишь на изображении. Форма же сохраняет правильный текст.
Правильный текст сохраняют и другие объекты, имеющие текстовый комментарий: вертикальные, наклонные или полилинии, фибоуровни, углы, таймурони и андреевские вилы.
Проверьте сами (при французском интерфейсе Форекстестера).

* * *
Была у Меня ещё версия, что здесь та же "беда", что возникает при извлечении русских комментариев из Delphi-кода.
/Александр, спасибо, подсказали, что её можно побороть с помощью программки "TCode"./

Думаю, здесь не то. Ведь вставка содержимого буфера памяти с правильным текстом происходит правильно, без "потерь" и искажений (при французском интерфейсе Форекстестера).
Значит, проблема в неадекватном хранении и/или в неадекватном "прорисовывании" на графике цены отдельных текстовых символов. Это касается как текстовых меток, так и горизонтальных линий.

* * *
Слушайте, а может у Меня просто с настройками "Языка и региональных настроек что-то не то"?! :wink:
Никак не могу найти установочный диск с ОС, чтобы добавить некоторые французские шрифты.
Хотя клавиатура французская у меня работает вроде бы нормально.
Вложения
Error of French symbols.JPG
(147.95 КБ) 4475 скачиваний
Последний раз редактировалось Николай Тарасов Пт май 20, 2011 12:26 pm, всего редактировалось 8 раз.
Я желаю всем счастья.

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

Будь проще, и народ к тебе потянется

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

Посмотрел содержание файла LngData.lng (с помощью "Блокнота").

По ходу дела хочу поделиться с Вами своими наработками.

Михаил, Александр, рекомендую Вам добавить "универсальный" язык "User (Individual)".

Изначально текстовку для такого пользовательского языка (интерфейса) можно оставить английскую.
Пользователь потом сам переведёт на свой язык и манер.
Будь то Суахили (язык межэтнического общения в Восточной Африке),
язык "реальных пацаноф" или какой-то иной сленг (профессиональный или шутливый).

Думаю, такая фишка может хорошо поспособствовать раскрутке Форекстестера и снимет с Вас заботу о расширении числа языковых адаптаций.

Думаю, такое решение лучше, чем затирание пользователем, например, немецких или испанских титров.
У людей будет устойчивое ощущение, что Вы о них заботитесь.



PS
Вчера интерфейс сайта "ВКонтакте" поменялся как раз с шутливым оттенком в честь праздника.
Очень даже достойно и со вкусом это выглядит.

Хотя и очень непривычно.
Первое время никак не можешь найти привычные кнопки.
:wink:



PS2
Такую же опцию "User (Individual)" можно сделать и для пользовательской палитры (долгосрочно хранимой раскраски графика и FT-интерфейса),
которую каждый мог бы настраивать под свой вкус и настроение, а также сохранять и восстанавливать её самостоятельно.
* * *
Хм.
Написал про настроение, и стразу стало понятно, что одной опции не хватит. И если уж делать, то - несколько.

Это как с мобильниками - производители трубок сразу ставят несколько будильников. :wink:

Оптимально, думаю, стоит делать штук 7.
Подробнее об этом числе очень доходчиво написано в книжках "Учение о 7Я",
"Язык чувств" математика из Питера Татарова Николая Михайловича: http://tatarow.narod.ru/
Особо обращаю Ваше внимание на "Звезду Магов". :wink:

Минимум - 5 штук (по числу торговых дней в неделю, ну, или по числу стихий китайской философии).

Максимум - 9 штук.

* * *
Но может быть и не стоит ограничивать число пользовательских языков и палитр. Ведь для таймфреймов у вас нет лимита.
Я желаю всем счастья.

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

#90 Сообщение FT Support » Пн апр 04, 2011 2:28 pm

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

Для правильного отображения французских символов действительно нужно поменять системные настройки, в Win 7 настраивается как на скриншоте, в ХР не помню как.

Универсальный язык делать не будем, много смысла в этом не видим, если кому-то будет нужно локализовать программу "под себя", то пусть обращается к нам, мы поможем.
Вложения
Locale.png
(38.77 КБ) 4431 скачивание

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

#91 Сообщение Николай Тарасов » Пн апр 04, 2011 5:49 pm

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

Для правильного отображения французских символов действительно нужно поменять системные настройки, в Win 7 настраивается как на скриншоте, в ХР не помню как.

Универсальный язык делать не будем, много смысла в этом не видим, если кому-то будет нужно локализовать программу "под себя", то пусть обращается к нам, мы поможем.
Здравствуйте, Александр.
Ваш совет помог.
Но, к сожалению, только наполовину.

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

Что касается меток, выставляемых скриптом, то, всё осталось по прежнему (см. верхнюю надпись на рисунке "Ошибка с французскими символами").



PS
Ладно. Я понял, тема сложная.
Стара как Мир. Чего стоит хотя бы Вавилонский проект? :wink:

Та к что, не тратьте своё драгоценное время.
Пусть её ею занимается сам пользователь и/или его региональная техподдержка.

Я желаю всем счастья.

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

#92 Сообщение FT Support » Вт апр 05, 2011 8:17 pm

Есть ещё один вариант...

Какая у Вас версия Дельфи?
поддерживает ли она Unicode?

можно попробовать собрать скрипт другой версией Дельфи, которая поддерживает или не поддерживает Unicode

больше пока что мыслей нет.

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

#93 Сообщение Николай Тарасов » Ср апр 06, 2011 4:53 am

FT Support писал(а):Есть ещё один вариант...

Какая у Вас версия Дельфи?
поддерживает ли она Unicode?

можно попробовать собрать скрипт другой версией Дельфи, которая поддерживает или не поддерживает Unicode

больше пока что мыслей нет.
Спасибо за дельную мысль, Александр.

Была у меня мыслишка перейти на более свежую версию. В сети видел сборку то ли 2010, то ли 2011 года.

Пока что у меня:
- Delphi Enterprise, Version 7.0 (Build 4.453), Copyright 1983-2002;
- Windows XP Professional, версия 2002, компиляция 2600, Service Pack 3.

Может рекомендуемый Вами аналог Delphi из категории "Открытый софт" таких проблем не даёт?

Интересно, он русифицирован?
Знаете ли, гораздо удобней в работе приложения с интерфейсом на нашем с вами родимом языке.
Я желаю всем счастья.

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

#94 Сообщение Николай Тарасов » Ср апр 06, 2011 6:40 am

Стал искать название Лазруса (Lazarus).
Наткнулся на описание подобных проблем с Юникодом:
http://www.delphimaster.ru/cgi-bin/foru ... 21734&n=11

Но что интересно. В статье упоминается функция AnsiToUtf8().
Может мне ещё и её попробовать?
Последний раз редактировалось Николай Тарасов Ср апр 06, 2011 12:10 pm, всего редактировалось 2 раза.
Я желаю всем счастья.

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

#95 Сообщение Николай Тарасов » Ср апр 06, 2011 6:45 am

А здесь вот пишут, что в Юникод-программе (по Delphi 2009) не требуются функции Utf8ToAnsi и обратно: http://www.sql.ru/forum/actualthread.aspx?tid=675673
Я желаю всем счастья.

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

#96 Сообщение Николай Тарасов » Ср апр 06, 2011 8:55 am

Слушайте, Александр.
А может мне переделать функцию UserOptionGet (аналог вашей функции GetFTKey) так,
чтобы считывать записи из разноязычных файлов посимвольно?!
Причём использовать для этого переменные не AnsiChar, а WideChar-типа.
Я желаю всем счастья.

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

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

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

1. Пытаясь решить вопрос с ошибками с французскими текстовыми метками, установил Лазаря (Lazarus).
Совершенно свежая версия: Lazarus-0.9.30-FPC-2.4.2-win32.exe (76,2 MB) от 2011-03-22. Двухнедельной свежести.
Да, к тому же, изначально русифицированная! :wink:

Исходник взял здесь: http://sourceforge.net/projects/lazarus/files/

Описание проекта - здесь:
- http://www.youtube.com/watch?v=xnEAoecE ... r_embedded
- http://wiki.lazarus.freepascal.org/Main_Page/ru


2. Стал осваивать, повторяя видеоурок "LazarusSetup"
От: Terranin | 27.09.2009 | Просмотров: 552
Вот ссылка на урок: http://www.youtube.com/user/Terranin#p/u/30/kL7z8kG7WCw


3. Возникла проблема с компиляцией Алигатора.
Исходный файл 'Alligator.dpr' взял из папки с примерами для Delphi:
'C:\ForexTester2\Examples\Indicators\Delphi'.
Последнее изменение файла было почти четыре года назад - 26.05.2007 13:01.

Вот текст сохранённого в файл сообщения (в нём немного больше информации, чем в окне сообщений):
  • Hint: Start of reading config file C:\lazarus\fpc\2.4.2\bin\i386-win32\fpc.cfg
    Hint: End of reading config file C:\lazarus\fpc\2.4.2\bin\i386-win32\fpc.cfg
    Free Pascal Compiler version 2.4.2 [2011/03/08] for i386
    Copyright (c) 1993-2010 by Florian Klaempfl
    Target OS: Win32 for i386
    Compiling Alligator.dpr
    Compiling IndicatorInterfaceUnit.pas
    IndicatorInterfaceUnit.pas(1362,23) Hint: Variable "IntrfProcsRec" does not seem to be initialized
    IndicatorInterfaceUnit.pas(613,22) Hint: Local type "TSetPropertyProc" is not used
    IndicatorInterfaceUnit.pas(675,23) Hint: Local type "PInterfaceProcRec" is not used
    Compiling TechnicalFunctions.pas
    Linking project1.dll
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterCustomImageList
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterMenuItem
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterMenu
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterMainMenu
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterPopupMenu
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterDragImageList
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterControl
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterWinControl
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterGraphicControl
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterCustomControl
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterScrollingWinControl
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterScrollBox
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterCustomFrame
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterCustomForm
    Alligator.dpr(103,1) Error: Undefined symbol: WSRegisterHintWindow
    Alligator.dpr(103,1) Fatal: There were 15 errors compiling module, stopping
4. Александр, пожалуйста, подскажите, что здесь не так.
Заранее благодарю вас за помощь.
Я желаю всем счастья.

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

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

Вот здесь что-то подобное люди как-то решили: http://www.lazarus.freepascal.org/index ... 143.0.html
Leledumbo
Hero Member
Posts: 1981
Re: i can not solve this error
--
« Reply #1 on: July 31, 2009, 11:28:19 am »
Add Interfaces to your uses clause (before Forms). I'll try tweaking the tool so that it would add it automatically since this problem is very common.
Logged
А также:
Leledumbo
Hero Member
Posts: 1981
Re: i can not solve this error
--
« Reply #3 on: August 01, 2009, 06:45:28 am »
If next time you convert another one, do this to automatically insert Interfaces unit: Open components/codetools/stdcodetools.pas and go to line 3714. Insert this code:

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

if not AddUnitToMainUsesSection('Interfaces','',SourceChangeCache) then
begin
  debugln('ConvertUsedUnits Unable to add Interfaces to main uses section');
  exit;
end;
before:

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

if AddLRSCode then
  if not AddUnitToMainUsesSection('LResources','',SourceChangeCache) then
  begin
    debugln('ConvertUsedUnits Unable to add LResources to main uses section');
    exit;
  end;
and it's done.
* * *
Я внёс рекомендованные Леледумбой (Leledumbo) изменения в свой файл: 'C:\lazarus\components\codetools\stdcodetools.pas'
Но ошибка, к сожалению, не исчезла.
Последний раз редактировалось Николай Тарасов Ср апр 06, 2011 8:32 pm, всего редактировалось 3 раза.
Я желаю всем счастья.

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

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

Быстрая компиляция сообщает об успехе:
  • Alligator.dpr(4,1) Warning: Relocatable DLL or executable Alligator.dpr debug info does not work, disabled.
    Alligator.dpr(4,1) Warning: To allow debugging for win32 code you need to disable relocation with -WN option
    Проект "Alligator" успешно собран
Но dll-файл не создаёт.
Я желаю всем счастья.

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

#100 Сообщение FT Support » Чт апр 07, 2011 3:25 pm

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

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

Ответить