На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> использование tom.dll , как?
    Цитата Romkin @
    CallTomFunc:
    в 80й строке ошибка, PAnsiChar нужен вместо PChar.
    А во-вторых, смысла особого не имеет подавать юникод, лучше просто оформить все в ansi. Оно все равно преобразуется в него при вызове.
    [DCC Warning] UTom.pas(78): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
    [DCC Warning] UTom.pas(81): W1057 Implicit string cast from 'AnsiString' to 'string'

    Исправил, спасибо.

    А по поводу того, в чем подавать не совсем согласен. Ведь все равно где оно будет преобразовано: перед вызовом или внутри него :unsure: Поэтому это дело предпочтений. Для себя бы я оставил string, потому как для моего восприятия это выглядит опрятнее: ориентация на размер символов соответственно версии Делфи, а конкретика tom'a скрыта внутри метода.
      Цитата arj99 @
      Ведь все равно где оно будет преобразовано: перед вызовом или внутри него

      Не все равно. Преобразование может пойти с потерями. Если ты объявил строку на входе - пользователь будет предполагать юникод. И подаст японский (да французского уже достаточно, если на русском компилировал). В результате ты заколдобишься.
      Можно преобразовать в UTF8, объявив UTF8String внутри, тогда заколдобится ASBer ;)
      А можно объявить, что принимаешь только ASCII, но это уже в юникодных версиях надо делать.
        Цитата Romkin @
        Цитата arj99 @
        Ведь все равно где оно будет преобразовано: перед вызовом или внутри него

        Не все равно. Преобразование может пойти с потерями. Если ты объявил строку на входе - пользователь будет предполагать юникод. И подаст японский (да французского уже достаточно, если на русском компилировал). В результате ты заколдобишься.
        Можно преобразовать в UTF8, объявив UTF8String внутри, тогда заколдобится ASBer ;)
        А можно объявить, что принимаешь только ASCII, но это уже в юникодных версиях надо делать.

        Это в принципе принимаю и признаю, но...
        Каждый сходит с ума по своему, все равно не нравится мне такой путь.
        А что если так:
        ExpandedWrap disabled
          const
            TomDesignatedForCodePage = 1251;
           
          resourcestring
            ...
          {$IFDEF UNICODE}
            SErrorInvalidString = 'Библиотека не может корректно обработать строку:'#13#10'"%s"';
          {$ENDIF}
          //------------------------------------------------------------------------------
          function IsConvertable(const U: UnicodeString; ToCodePage: Integer): Boolean;
          var
            DefCharUsed: Windows.BOOL;
          begin
            Result := (WideCharToMultiByte(ToCodePage, 0, PWideChar(U), Length(U), nil, 0,
                nil, @DefCharUsed) > 0) and (not DefCharUsed);
          end;
           
          function StrLimit(const S: string; Limit: Integer): string;
          var
            L: Integer;
          begin
            L := Length(S);
            if (L <= Limit) then
              Result := S
            else
              Result := Copy(S, 1, Limit - 3) + '...';
          end;
           
          { TTomWrapper }
           
          function TTomWrapper.CallTomFunc(Func: TTomFunc; const Input: string): string;
          const
            StrPartToShowOnEmergency = 128;
          var
            AnsiStr: AnsiString;
          begin
            Result := '';
            if (@Func <> nil) then
            begin
          {$IFDEF UNICODE}
              if (not IsConvertable(Input, TomDesignatedForCodePage)) then
                raise ETomWrapperError.CreateFmt(SErrorInvalidString, [StrLimit(Input, StrPartToShowOnEmergency)]);
          {$ENDIF}
              AnsiStr := AnsiString(Input);
              UniqueString(AnsiStr);
              AnsiStr := Func(PAnsiChar(AnsiStr));
              Result := string(AnsiStr);
            end;
          end;

        ? :unsure:

        Добавлено
        Ну да, пожалуй косяк: проверка на переводимость в конкретную TomDesignatedForCodePage, а перевод в системную. Но смысл понятен...

        Добавлено
        Кстати, интересно было бы увидеть саму dll и описание предназначения и использования функций.
          Цитата arj99 @
          Кстати, интересно было бы увидеть саму dll и описание предназначения и использования функций.

          tom.userforum.ru - форум платформы ТОМ.
          Еще есть страничка на ifwiki.ru с описанием платформы.
          Там же можно скачать игры, tom.dll входит в их состав.

          TOM API
          Приложение, основанное на ИФ-движке ТОМ, состоит из 2х частей:

          1. Ядро - реализовано в виде динамической библиотеки tom.dll

          2. Интерфейсная оболочка (Front-end)

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

          Назначение функций:

          char* RunFile(char*FileName)
          Выполняет скрипт из указанного файла.
          Возвращает текст, сгенерированный при выполненнии скрипта.
          char* RunText(char*Statement)
          Вычисляет выражение или выполняет скрипт переданный в строке.
          Возвращает результат вычисления. Текст сгенерированный при выполненнии скрипта пишется в лог.
          char* Command(char*Input)
          Выполняет команды на русском языке.
          Возвращает текст, сгенерированный при выполненнии команды.
          Сообщение отредактировано: ASBer -
            ASBer, а почему не написал про Normtext?

            блин, я собирался ставить галочку _после_ того, как создам простейшую работающую оболочку. спасибо to Romkin огромное, он разжевал мне всё, и даже дал прогу прямым текстом.

            теперь вопрос к ASBer:
            я так представлял, что одной из функций передаю текст текстовой игры на скриптовом языке(ТОМ). затем, в другую функцию передаю ввод пользователя, и получаю результат. а у тебя получается почему-то целых три(даже четыре) функции.

            не мог бы ты пояснить, как пользоваться этими функциями, чтобы проиграть какой-нибудь любой(простой) чисто парсерный пример.
              Цитата ya2500 @
              не мог бы ты пояснить, как пользоваться этими функциями, чтобы проиграть какой-нибудь любой(простой) чисто парсерный пример.

              Для простого парсерного примера достаточно одной функции - Command(char*Input)
              Остальные функции вспомогательные и декоративные.

              Берешь текст из командной строки, передаешь его в Command();
              Текст полученный из Command() показываешь пользователю.
              И так далее в бесконечном цикле.
              Если Command() вместо строки вернул NULL, значит игра окончена - выходишь из цикла, закрываешь программу.

              RunFile(char*FileName) нужна для открытия и запуска игры из файла.
              char*FileName может быть передан при старте программы как аргумен командной строки.
              Или программа может проигрывать заранее заданный файл.
              Можно не использовать RunFile(), но тогда пользователю всегда прийдется запускать файлы вручную через команду run.

              RunText(char*Statement) чисто декоративная функция, позволяет вытаскивать в интерфейс различные значения из игры .
              Если нужно в отдельном элементе интерфейса показать имя протагониста - вызови RunText("pers.title");
              Если в заголовке программы нужно название текущей локации - вызови RunText("pers.loc.title");
              Можно использовать как калькулятор - RunText("2+2") вернет "4".

              Цитата ya2500 @
              ASBer, а почему не написал про Normtext?

              NormText(char*Text) приводит текст к читабельному виду - расставляет необходимые пробелы, убирает лишние знаки препинания, ставит заглавные буквы в начале строк и после точки.
              Результаты RunText() будут выглядеть белее цивильно, если их пропустить через NormText():
              NormText(RunText("pers.title"));
              NormText(RunText("pers.loc.title"));
              Сообщение отредактировано: ASBer -
                Цитата ASBer @
                Для простого парсерного примера достаточно одной функции - Command(char*Input)
                Остальные функции вспомогательные и декоративные.

                Берешь текст из командной строки, передаешь его в Command();
                Текст полученный из Command() показываешь пользователю.
                И так далее в бесконечном цикле.
                Если Command() вместо строки вернул NULL, значит игра окончена - выходишь из цикла, закрываешь программу.

                Цитата ASBer @
                Можно не использовать RunFile(), но тогда пользователю всегда прийдется запускать файлы вручную через команду run.

                всё, теперь совсем понял.

                значит, в простейшем случае, пользуюсь тока Command. игрок вводит в мой edit команду run, и(благодаря работе dll)- открывается окошко выбора файла. открываем файл игры. затем пользователь продолжает вводить в edit команды, типа 'осмотрись','иди на север','возьми динамит','зажги лампу', и прочая.

                !от оболочки всего-то требуется передавать входную строку на обработку функции Command, а возвращаемый функцией текст- выводить в окно.

                ---
                на меня щазз дела поднавалились НО, думаю, за пару дней смогу всё досконально проверить, и поставить галочку.
                  Цитата ya2500 @
                  возвращаемый функцией текст- выводить в окно.

                  Только не забудь про обработку тэгов.
                  В простейшем случае все тэги можно просто игнорировать, но пользователь их видеть не должен!
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0378 ]   [ 16 queries used ]   [ Generated: 2.05.24, 16:25 GMT ]