• Что за типы функций при импорте OpenCV DLL в Delphi?

    TrueBers
    @TrueBers
    Гуглю за еду
    не спрашивайте зачем мне это нужно
    действительно. C++ ABI -- это боль, сильная боль. Даже разработчики компиляторов страдают от неё. Если вам уж прям так важно поковыряться в его кишках, то изучайте исходники LLVM и спецификацию стандарта ABI. А если нет, то возьмите OpenCV C API и не выносите себе голову.

    но описан как функция
    А как он должен быть описан, как сферический код в вакууме?

    чем отличается от обычных деструкторов
    Стандарт определяет деструкторы:
    1. base object destructor
    2. complete object destructor
    3. deleting destructor
    4. trivial/non-trivial destructor

    Что из этого есть "обычный" деструктор?

    Здесь про деструкторы и псевдо-код порядка их вызовов. Здесь -- про общее устройство виртуальной таблицы.

    что на самом деле означает `vbase destructor`, в каких случаях он вызывается
    Есть предположение, что это имя экспортируемого complete object destructor для класса, базовым классом которого является класс с виртуальным деструктором. То есть, он выполняет часть процесса цепочки деструкторов, которая помимо вызова base object destructor, вызывает также все деструкторы для всех базовых виртуальных классов. Но при этом ещё не вызван deleting destructor, который собственно вызывает operator delete. Т.е. получается, что complete object destructorпо включённому в него списку действий, как бы "наследуется" от base object destructor. В свою очередь, deleting destructor "наследуется" от complete object destructor.

    Предполагаю, что вызывается автоматически в замыканиях. Но что на самом деле означает `default constructor closure'
    Для чего он может вызываться в замыканиях, просто чтоб было?

    Моё же предположение, что это замыкание -- некий адаптер-костыль чтоб привести нетривиальные параметры конструктора в удобоваримую ABI-форму, и вызывается когда default constructor имеет default non-trivial parameters, для которых надо сначала вызвать конструктор, либо когда это variadic конструктор, которому нужно привести список аргументов к Сишному `va_arg`, чтобы переслать их через границу ABI. Вот в этом случае он вызывается, как я понимаю.

    Один ценный никому не нужный совет: тебе НЕ НУЖНО в этом разбираться. Брось эту затею и возьми сишный API.
    Ответ написан
    3 комментария
  • Как подсчитать количество строк в текстовом файле?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Приведенный код не понятно для чего, а подсчитать строки можно так (если их не много)

    var LinesCount: Integer;
    var List: TStringList;
    try
      List.LoadFromFile('filename.txt');
      LinesCount := List.Count;
    finally
      List.Free;
    end;
    writeln(LinesCount);


    или так

    writeln(Length(TFile.ReadAllLines('filename.txt')))


    или так (можно для большого файла, если длина одной строки не огромная)

    var LinesCount := 0;
    with TFile.OpenText('filename.text') do
    try
      while not EndOfStream do begin ReadLine; Inc(LinesCount); end;
    finally
      Free;
    end;
    Writeln(LinesCount);
    Ответ написан
    Комментировать
  • Почему в буфер вставляется только первый символ?

    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 и с чем его едят?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Отличия большие. PascalABC.NET - это сторонняя разработка, которая вобрала в себя синтаксис C#. Например, лямбда функции, LINQ, набор библиотек System.* и т.д.

    Delphi - это развитие чистого Pascal. Синтаксис там тот же, однако развитие языка дало: дженерики, вывод типов, анонимные функции, инлайн объявление, таски, хелперы и прочие вещи, упрощающие написание программ.

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

    Для написания на Delphi существует одна официальная IDE - RAD Studio. В том числе есть бесплатная версия RAD Studio CE (на данный момент, самая свежая бесплатная версия - RAD Studio CE 10.4.2, вышедшая в прошлом году с апдейтами в этом году). Получить установочник и ключ, бесплатно можно здесь.

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

    Посмотреть, что можно сделать на Delphi можно, например у меня на канале. Там есть несколько видео.
    Ответ написан
    2 комментария
  • Как сравнить два изображения на delphi с процентной погрешностью?

    @kalapanga
    В таком вопросе уместнее был бы тег Алгоритмы, а Delphi и Pascal - это всего лишь возможные инструменты реализации выбранного алгоритма.
    Надо определиться, что Вы хотите считать схожими изображениями (упомянутая процентная погрешность информации не добавляет). Идентичные попиксельно или что-то более сложное? Повёрнутые на угол? Зеркально отражённые? Уменьшенные и увеличенные? С изменённой цветовой палитрой? Одинаковый объект, снятый с разных ракурсов?
    В зависимости от этого алгоритм может состоять только из цикла перебора пикселей, а может из нейронной сети.
    Так что:
    1) формулируете Ваши критерии схожести;
    2) под них придумываете или ищете готовый алгоритм;
    3) а уж его реализуете хоть на Дельфи, хоть на чём.
    Ответ написан
    4 комментария
  • Как сравнить два изображения на delphi с процентной погрешностью?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Можно. Например, можно просто попиксельно сравнить. Указав допустимую погрешность разницы между пикселями.
    Получить доступ к пикселями можно очень легко. Через Bitmap.Canvas.Pixels[x, y], либо быстрее, через scanline[y]
    Ответ написан
    Комментировать
  • Как в Delphi XE создать JSON?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Это у тебя массив из объектов. А значит, мы создаем массив и добавляем в него объекты. Логично? По-моему - да.
    var
      JSA : TJSONArray;
      JS : TJSONObject;
    begin
      JSA := TJSONArray.Create;
    
      JS := TJSONObject.Create;
      JS.AddPair('foo', 'bar');
      JSA.Add(JS);
    
      JS := TJSONObject.Create;
      JS.AddPair('foo', 'bar');
      JSA.Add(JS);
    
      writeln(JSA.ToString);
    
      JSA.Free;
    
      readln;
    end.


    Добавляя элементы в JSA их не нужно самому удалять. Они становятся его частью.
    Ответ написан
    Комментировать
  • Как заиметь TLS в Windows 7?

    @res2001
    Developer, ex-admin
    В этих ветках включаются/выключаются крипто протоколы. По умолчанию включены, поэтому там ничего нет.
    Если надо принудительно выключить, тогда создаем раздел и выставляем соответствующее значение.
    В свое время принудительно выключал SSL3.0 и т.п. не безопасные протоколы подобным образом.
    https://docs.microsoft.com/ru-ru/windows-server/id...
    Другие параметры в этих ветках:
    https://docs.microsoft.com/ru-ru/windows-server/se...

    Сами протоколы пришли в обновлении 3140245, ссылку дал vasilyevmn
    Ответ написан
    1 комментарий
  • Как исправить ошибку 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
    Ответ написан
    Комментировать
  • Компонент для изменения мета данных в JPG для Delphi 7?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Крайне советую перейти на Delphi 10.3.3 CE. Среда бесплатная, удобнее д7, эффективнее и ещё десяток всякого.
    Есть пакетный менеджер GetIt. Очень много добавлено из коробки (типа дженериков, тасков, работы с json, xml, http+ssl), плюс всё это кроссплатформенное
    Ответ написан
    Комментировать
  • Как использовать функции в delphi?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Так ты создавай эту функцию внутри класса формы
    Ответ написан
  • Как реализовать сочетания клавиш только в активной форме?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Не нужно такие сочетания "ctrl+z" регистрировать в системе.
    Чтоб форма обрабатывала сочетания, используй простое событие OnKeyUp (или если нужно OnKeyDown). Чтоб сочетание обрабатывала в первую очередь форма, а не контрол в фокусе, то у формы установи свойство KeyPreview = True

    procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
    begin
      if [ssCtrl] = Shift then
        case Key of
          vkZ: //Ctrl+Z pressed
            ;
        end;
    end;
    Ответ написан
    Комментировать
  • Как создать OLE объект для интеграции perco S-20 с внешним ПО?

    @acwartz
    Тут должна быть ваша реклама.
    Ну для начала не городить грабли, если мы говорим о COM, то SDK скорее всего зарегистрировал в системе библиотеку типов(TLB) из который Delphi сам создаст полноценный модуль со всеми интерфейсами и сам же пропишет функцию типа CoCreateMySuperDuperSDK: ISuperDuperSDKInterface, которую только что и останется вызвать и больше не думать о том "как вызвать что-то ещё".

    И делается это так:
    Меню Component -> Import Component... -> "Type library" -> ищем свою халабуду. И далее 3 раза Next ничего не трогая, потом Finish. И вуаля, delphi сделал за всю всю работу, полностью сгенерировав обертку над предоставляемыми интерфейсами.

    А если нет, то такую tlb можно поискать внутри dll/exe идущих вместе с SDK или лежащий вообще где-то рядом, потому что COM/OLE распространяются вместе библиотекой типов которая описывает все интерфейсы. Или спросить у разработчиков SDK о ней.
    Ответ написан
    Комментировать
  • Как создать OLE объект для интеграции perco S-20 с внешним ПО?

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

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

    @evgeniy_lm
    Если сильно хочется оптимизации "древний" TextFile замените на StringList который существенно удобнее.
    Ответ написан
    1 комментарий
  • Как можно оптимизировать код?

    @kalapanga
    "Как оптимизировать код" - неверный вопрос. Код можно оптимизировать, если есть критерии оптимизации. А у Вас не только критериев нет, Вы даже не написали, что программа делать должна, с какими данными работать. Так что думаю, если программа делает то, что задумано, то не стоит ничего "оптимизировать". Лучше лишний раз на ошибки проверьте.
    Если уж Вам сильно хочется замечаний, то вот некоторые. Часть можете считать придирками, но есть и более важные.
    Сверху вниз.
    Глобальная переменная I. Потенциальный источник ошибок. В каких-то процедурах она перекрывается локальной переменной, в каких-то нет. Легко неуследить и использовать не ту, что нужно. (Глобальную переименовать)
    Нелогичное название процедуры MatrixInput. Да, там формируется матрица, но при этом она не вводится (Input), а наоборот выводится - write(...)! (Для лучшей читабельности кода назовите например FillMatrix)
    В этой же процедуре не контролируется выход индекса за границу в строке
    M[I,J]:=S[N*(i-1)+j];
    Раз уж выделили этот кусочек в отдельную процедуру, в её начале надо проверить корректность входных параметров.
    В процедуре CheckAndFixString вместо цикла
    while length(S)<NeedLength do S:=S+'#'
    лучше так
    S := S + StringOfChar('#', NeedLength - length(S));
    Здесь длина строки нужна только один раз, а не на каждом проходе цикла.
    Основная программа.
    Главная ошибка - "захардкоженные" имена файлов. Вы принесли кому-то Вашу программу. Откуда у него такие каталоги?
    Или используйте ini-файл с путями к файлам или хотябы оставьте в коде только имена файлов и ищите их в каталоге программы.
    Здесь же вторая ошибка - отсутствие обработки ошибок при работе с файлами. Если например нужного файла нет программа свалится с ошибкой вместо информативного сообщения пользователю.
    Ответ написан