Ответы пользователя по тегу Delphi
  • Почему в буфер вставляется только первый символ?

    OCTAGRAM
    @OCTAGRAM
    Описание CF_TEXT (1):

    Text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. Use this format for ANSI text.


    В Юникодных версиях Delphi обычный тип string = UnicodeString. А PChar = PWideChar. В этом формате символы кодируются двухбайтовыми числами. Все платформы, поддерживаемые Delphi, little endian, и это значит, что если число состоит из двух байт, то сначала идёт младший, а потом старший. У латинских букв и простых символов пунктуации номера маленькие, в диапазоне 32-126, для них хватает 7 бит. Так что номер буквы h в двухбайтовом представлении состоит из одного младшего байта с номером буквы h и неиспользуемым нулевым старшим байтом. По формату CF_TEXT нулевой байт значит конец строки.

    В юникодных Delphi вам нужен формат CF_UNICODETEXT. А под память нужно выделять и копировать (2 * Length(Value) + 2) байт.
    Ответ написан
    1 комментарий
  • Почему Delphi выдаёт эту ошибку?

    OCTAGRAM
    @OCTAGRAM
    Список, у которого можно выйти за границу, я в коде вижу только один, chart1.SeriesList. Если это так, надо в дизайнере форм настроить chart1, чтоб было не меньше двух семейств точек
    Ответ написан
    1 комментарий
  • Dependency Injection и Spring4d?

    OCTAGRAM
    @OCTAGRAM
    Смущает конструкция

    aContainer.RegisterFactory<TCoffeeMakerFactory>;

    Здесь ведь даже не передана никакая реализация функции конструктором.

    И от фабрики я бы ожидал, что у неё просто нет параметров, которые движок DI не мог бы подставить. То есть,

    TFunc<ICofeeMaker>

    А если параметры всё же есть, то либо движок DI должен поискать у себя фабрику строки и целого цисла, либо эти параметры задаются RTTI атрибутами. Или задаются при регистрации какой-то из фабрик, ICoffeeMaker или IKitchen.
    Ответ написан
  • Android пишет "Приложение не установлено". Как побороть?

    OCTAGRAM
    @OCTAGRAM
    Я бы посмотрел в сторону, какие ключи подписи apk стоят. Может быть, телефону не нравится, когда для одного id приложения то один ключ подписи, то другой
    Ответ написан
    2 комментария
  • Как компилировать через make?

    OCTAGRAM
    @OCTAGRAM
    На снимке упомянуты чужеродные для экосистемы Delphi утилиты cl.exe и rc.exe. cl.exe — это чужеродный транслятор C/C++, из бедной экосистемы, в которой нет ни одного виртовского языка программирования. rc.exe — это транслятор ресурсов, взятый из этой же не блистающей мастерством выбора поддерживаемых языков программирования экосистемы.

    Обновление: поизучал код, и по результатам чтения, похоже, нужен вариант 3.

    Вариант 1. Программист, пишущий на Delphi, когда по какой-то причине пришло время писать на C или C++, скорее взял бы bcc32.exe. По этой ссылке вы можете скачать комплементарный Delphi транслятор C или C++:

    https://www.embarcadero.com/free-tools/ccompiler

    Что касается rc.exe, то его заменой может послужить https://docwiki.embarcadero.com/RADStudio/Alexandr... , который есть в Delphi, и в бесплатный пакет Embarcadero C++ его тоже кладут.

    В батнике нужно заменить все cl.exe на bcc32.exe, а все rc.exe на brcc32.exe.

    Вариант 2. Ещё можно такой эксперимент провести с транслятором отсюда, не забывая выбрать разрядность, соответств.... Вместо cl.exe использовать g++.exe, а вместо rc.exe — windres.exe

    В каждой экосистеме свои имена утилит.

    Вариант 3. Мне доводилось разные библиотеки собирать, и прямыми руками написанный код более-менее везде одинаково собирается. К сожалению, есть те, кого нельзя допускать до C++, и вот они-то до C++ добираются и свинячат. Конкретно этот разработчик не смог придумать ничего лучше, чем подключить MFC, проприетарную непереносимую библиотеку. MFC поддерживается в экосистеме Digital Mars C++.

    Нужно взять:

    * ftp.digitalmars.com/Digital_Mars_C++/MS/4.21/MFC4.... версия MFC для Digital Mars C++
    * https://digitalmars.com/download/freecompiler.html отсюда Digital Mars C/C++ Compiler, это вторая ссылка после IDE
    * по той же ссылке Basic Utilities, там есть заглушка для cl.exe, конвертирующая аргументы командной строки в вызов Digital Mars C++
    Ответ написан
    1 комментарий
  • Каким образом запросить новый ключ на Delphi 10.3 Community Edition?

    OCTAGRAM
    @OCTAGRAM
    У вас не будет бесплатного ключа на 10.3. Бесплатные пользователи также являются и бесплатными тестерами, и тестируют они всегда более-менее последнюю версию. Сейчас версия Community Edition 10.4.2. Скачайте и получите ключ на неё тем же способом, что и раньше. Новый бесплатный ключ будет действовать год, а потом снова будет нужно обновиться.
    Ответ написан
    Комментировать
  • RC4 почему не полный результат?

    OCTAGRAM
    @OCTAGRAM
    Вместо Chr, который возвращает не понятно, что, для аналогии нужен Char. Или это какая версия Delphi? В старых (2007 и старше) для аналогии это WideChar.

    Посмотрел, а на чём прерывается версия Delphi. В JavaScript это \u0000. Напрашивается мнение, что Delphi отработала как надо, а проблема в системе отображения, которая закодирована на устаревшем языке программирования с устаревшей системой кодирования длины строки встроенным в конец строки нулевым символом. Поменяйте тот кусок, где режется, и строка сохранится во всей полноте.
    Ответ написан
    6 комментариев
  • Как скопировать данные с ексель?

    OCTAGRAM
    @OCTAGRAM
    Можно средствами OLE сохранить весь документ или его часть в формат CSV, а его уже читать быстро
    Ответ написан
    Комментировать
  • Правильный ли цикл для точек в области?

    OCTAGRAM
    @OCTAGRAM
    С точки зрения математика подобный цикл делается так: берём массив точек и идём по нему циклом, перебирая все рёбра. Аккумулятор угла инициализируем нулём. В каждой итерации цикла добавляем в аккумулятор арксинус угла между лучами из выбранной точки в вершины рёбер, знак которого зависит от направления поворота. По окончании цикла, если выяснилось, что в аккумуляторе ±2π, значит, точка внутри фигуры. Также, если одна из вершин точно совпала с точкой или если во время аккумуляции был скачок ±π (арксинус минус единицы), это значит, что точка на границе. Если точка снаружи, то аккумулятор как накопится, так и разрядится поворотами в противоположную сторону, и минус с плюсом уравновесятся.

    С точки зрения программиста такую математику воплощать как есть рискованно. Вместо натурального логарифма программист по возможности возьмёт двоичный логарифм. И вместо проблемного арксинуса хочется взять что-то такое же по смыслу, но с меньшим накоплением ошибок. Я бы назвал это квадратный арксинус. Замеряет прогресс не по единичной окружности вокруг точки, а по единичному квадрату. На вход получает две пары координат, на выходе даёт число, которое в случае полного оборота накапливается не в ±2π, а в ±8.

    Но для квадратичного арксинуса нужно выполнять снижающее точность деление, и накапливать продукты этого деления. Кажется, можно это оптимизировать ещё дальше, заменив вещественные числа дискретным номером октанта. В книгах по аналитической геометрии, наверное, лучше напишут.

    Если требуют цикл, придётся разобраться хотя бы с арксинусами. А если нет, то условие принадлежности к границе в общем виде выглядит так:

    if ((? = ?) and // строгое равенство для проверки принадлежности линии
        (? <= ?) and (? >= ?)) or // два неравенства, чтоб линию обрезать с двух сторон и превратить в отрезок
    
       // второй отрезок
       ((? = ?) and // строгое равенство для проверки принадлежности  линии
        (? <= ?) and (? >= ?)) or // два неравенства, чтоб линию обрезать с двух сторон и превратить в отрезок
    
       // третий отрезок
       // …
    then
    begin
      // сообщить о том, что на границе
      // …
      Exit;  
    end; // if


    Удобно сначала проверить принадлежность границе и выйти по Exit, а только потом проверять принадлежность толще.

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

    Принадлежность точки выпуклому многоугольнику определяется конъюнкцией неравенств для каждого ребра. Для выпуклого четырёхугольника:

    (? <= ?) and (? <= ?) and (? <= ?) and (? <= ?)

    Для треугольника:

    (? <= ?) and (? <= ?) and (? <= ?)

    Соединяем то и другое через or и получаем результат. Можно пойти и в другом направлении, не объединять множества точек, а вычитать. Глядя на рисунок, можно разглядеть объемлющий прямоугольник, из которого вычтена внутренность угла 135°. Внутренность угла можно задать двумя неравенствами

    (? <= ?) and (? <= ?)

    И объединить через and not:
    (… внутри прямоугольника …) and not (… внутри угла …)
    Ответ написан
    Комментировать
  • Как правильно закрыть программу?

    OCTAGRAM
    @OCTAGRAM
    Во-первых, безопаснее и переносимее вместо прямого вызова Free делать FreeAndNil. Во-вторых, убирайте немедленно

    Self.Free;
    Ответ написан
    Комментировать
  • Как исправить ошибку E2066?

    OCTAGRAM
    @OCTAGRAM
    TSet = (Sorted, Reversed, Random);

    Это объявление сделало Random константой с более высоким приоритетом видимости, чем System.Random.

    Варианты решения:

    В новых Delphi можно написать (в начале кода)

    {$SCOPEDENUMS ON}

    и заменить

    if ArrType = TSet.Sorted then
    // …
    else if ArrType = TSet.Reversed then


    Тогда TSet.Random не сможет пересекаться с System.Random

    Можно, наоборот, при использовании System.Random указывать полностью квалифицированный идентификатор:

    ArrI[i] := System.Random(Row);

    Либо можно просто переименовать TSet.Random во что-то, что не в точности Random
    Ответ написан
    Комментировать
  • Компонент для изменения мета данных в JPG для Delphi 7?

    OCTAGRAM
    @OCTAGRAM
    Компилируем в новой версии Delphi DLL, подключаем к старой, используя интерфейс, выраженный через WideString и safecall
    Ответ написан
    Комментировать
  • Как создать OLE объект для интеграции perco S-20 с внешним ПО?

    OCTAGRAM
    @OCTAGRAM
    Это функция в модуле System.Win.ComObj. Добавляете его в uses и вызываете. Результатом его является объект с интерфейсом IDispatch. Чтобы вызывать у него нетипизированные методы, значение ссылки на IDispatch можно привести к типу OleVariant. У переменной типа OleVariant, если написать точку, Delphi не покажет список подсказок, но вызов скомпилируется. Конечно, если в названии метода опечатка или типы значений не подходящие, то при исполнении будет ошибка.

    Чтобы получать подсказки и вообще работать типизированно, нужно генерить модуль импорта COM. В таком модуле Delphi создаст псевдокласс, у которого вместо конструктора Create будет классовая функция Create, и синтаксически похоже: НазваниеCOMКласса.Create. Также можно создавать самостоятельно типизированные ссылки: CreateOleObject(…) as IИмяОсновногоИнтерфейса.
    Ответ написан
    Комментировать
  • Delphi подключение через API?

    OCTAGRAM
    @OCTAGRAM
    Из известных мне компонентов Indy это может, но, скорее всего, он потребует обновления. Не уверен, какая его версия подходит для Delphi 7 (ну почему Delphi не новый 10.3.3???). К нему нужен OpenSSL, но в комплект он не входит. И вот тут, в зависимости от того, насколько старый Indy, будет нужен либо в новом обычный OpenSSL DLL, либо в старом патченный специально для Indy: https://indy.fulgan.com/SSL/

    Также OpenSSL DLL может не подойти версии новее 1.0. В 1.1 поломали обратную совместимость, перестав экспортировать некоторые символы. Не факт, что в той версии Indy, которая совместима с Delphi 7, переделали на версию 1.1.

    Компонент, через который стало можно работать с HTTP и, самое важное тут, с HTTPS, средствами Windows, появился из коробки только в XE7 или где-то в этом диапазоне. В 7 можно попробовать как вариант напрямую WinInet API.
    Ответ написан
    Комментировать
  • Счётчик успешных операций в минуту на Delphi?

    OCTAGRAM
    @OCTAGRAM
    Обычно календарь юникса измеряется в секундах, и только в JS исключение с миллисекундами. Если там правда миллисекунды, может, тогда заменить целочисленное деление div на операцию с плавающей точкой /

    Также хорошей практикой будет использовать по возможности не гражданский календарь, а монотонное время. В языке Ada это приложение к стандарту D.8 Monotonic Time, описывающее пакет Ada.Real_Time. В Delphi тот же функционал спрятан в модуль с не очевидным названием System.Diagnostics. Это если программа не перезапускается в течение всего интересующего интервала.
    Ответ написан
    Комментировать