Ответы пользователя по тегу Delphi
  • Virtual TreeView для Delphi 5 остался у кого-то?

    @zedxxx
    На гитхабе же у них вся история лежит, откатывайтесь на любой коммит назад в истории и используйте: https://github.com/JAM-Software/Virtual-TreeView

    Самый первый коммит датирован 2009-м годом и там есть файлы проекта для Delphi 4 и выше.
    Ответ написан
    1 комментарий
  • Как открыть файл по своей программой (ассоциировать его с программой)?

    @zedxxx
    Когда вы сделали ассоциацию расширения файла с программой, Windows будет запускать вашу программу передавая имя файла, по которому кликнули, в параметрах командной строки. Таким образом, при старте приложения вам надо проверить наличие этого параметра и если он есть, то вызвать процедуру открытия файла.

    Единственное, что следует учесть, что первым параметром всегда идёт имя вашей программы, так что смотреть надо на второй параметр.

    Для доступа к параметрам существует функция System.ParamStr.
    Ответ написан
    Комментировать
  • Как и с чего начать обучение?

    @zedxxx
    Начать можно с "Библия Delphi" Флёнова (3-е издание): https://www.ozon.ru/context/detail/id/5708188/

    Потом посмотрите на книги Осипова:
    • Delphi XE2 (В подлиннике)
    • Delphi. Программирование для Windows, OS X, iOS и Android
    • Базы данных и Delphi. Теория и практика
    Ответ написан
    3 комментария
  • Каким образом сохранить пункты PopupMenu в INI?

    @zedxxx
    Вам надо руками, для каждого пункта меню, записать его свойства в ini:

    for i := 0 to TfMain.PopupMenu.Items.Count - 1 do begin
      ini.WriteString('Настройки', 'Пункт_' + IntToStr(i) + '_Caption', TfMain.PopupMenu.Items[i].Caption);
      ... // и так далее, для всех остальных параметров, которые надо сохранить
    end;

    Что касается события OnClick, то тут есть 2 варианта:

    1. (плохой) каждому событию присвоить/сопоставить какой-то ID (число) и записать его как Integer, таким образом при считывании параметров из ini вы будете знать, какую функцию использовать

    2. (хороший) для всех пунктов меню использовать одно событие OnClick, а каждому пункту меню в свойство Tag записать своё уникальное значение, по которому вы будете различать, по какому конкретно пункту кликнул пользователь и выполнять то или иное действие. Соответственно, и в ini надо будет записывать значение Tag.
    Ответ написан
    2 комментария
  • Нужно ли изучать delphi 10.3 с нуля если шарю в delphi 7?

    @zedxxx
    С нуля учить не надо. Надо ознакомиться с новыми возможностями и использовать их по мере необходимости.

    Самая главная особенность при переходе с D7 - Юникод. И вот этот документ надо просто выучить в обязательном порядке: https://www.embarcadero.com/images/dm/technical-pa...

    Вот тут хорошо расписан список новых фич в языке по мере их появления: https://stackoverflow.com/questions/8460037
    Ответ написан
    1 комментарий
  • Notepad++, Scintilla, SendMessages и Delphi - как вставить строку?

    @zedxxx
    Вы передаёте указатель на область памяти в адресном пространстве вашей программы, а у Notepad++ своё, изолированное адресное пространство. И по адресу, указанному в сообщении, естественно, будет мусор.

    Для того, чтобы передавать буфер из приложения в приложение, в WinAPI предусмотрено сообщение WM_COPYDATA. И в этом случае, Windows "под капотом" заботится о том, чтобы перенести передаваемый буфер в адресное пространство приложения адресата, чтобы оно могло его считать.

    Но Scintilla не ожидает, что ей будут управлять извне, поэтому напрямую не получится послать ей такое сообщение. Можно попробовать внедрить свою dll в адресное пространство Notepad++ и добавить там обработчик сообщений WM_COPYDATA с пересылкой в Scintilla уже изнутри.

    Поскольку Notepad++ поддерживает плагины, то с внедрением dll проблем быть не должно. В демке для Delphi плагина даже есть пример, как управлять Scintilla:

    procedure THelloWorldPlugin.FuncHelloWorld;
    var
      s: string;
    begin
      s := 'Hello World';
      SendMessage(self.NppData.ScintillaMainHandle, SCI_REPLACESEL, 0, LPARAM(PChar(s)));
    end;
    Ответ написан
    2 комментария
  • Delphi Async Callable?

    @zedxxx
    А в чём, собственно, вопрос? Чтобы сделать код потокобезопасным, обращение к гую надо завернуть в Synchronize метод (вызов Sleep, естественно, заворачивать не надо).
    Вот туториал про использование TTask и синхронизацию: Using Tasks from the Parallel Programming Library
    Ответ написан
    4 комментария
  • Как перевести координаты с PaintBox X и Y в Longitude и Latitude (Openstreetmap)?

    @zedxxx
    TilesAtZoom := 1 shl Zoom; // при условии, что зум считаем с нуля
    PixelsAtZoom := 256 * TilesAtZoom;
    
    PixelResolutionLon := 360 / PixelsAtZoom;
    PixelResolutionLat := 180 / PixelsAtZoom;
    
    Lon := Lon0 + X * PixelResolutionLon;
    Lat := Lat0 - Y * PixelResolutionLat;
    Ответ написан
    8 комментариев
  • Открыть браузер из приложения Android?

    @zedxxx
    Попробуйте этот код (источник):

    unit OpenViewUrl;
     
    interface
     
    // URLEncode is performed on the URL
    // so you need to format it   protocol://path
    function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;
     
    implementation
     
    uses
      IdURI, SysUtils, Classes, FMX.Dialogs,
    {$IFDEF ANDROID}
      Androidapi.Helpers,
      FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText,
      Androidapi.JNI.Net, Androidapi.JNI.JavaTypes;
    {$ELSE}
    {$IFDEF IOS}
      Macapi.Helpers, iOSapi.Foundation, FMX.Helpers.iOS;
    {$ENDIF IOS}
    {$ENDIF ANDROID}
     
    function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;
    {$IFDEF ANDROID}
    var
      Intent: JIntent;
    begin
    // There may be an issue with the geo: prefix and URLEncode.
    // will need to research
      Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
        TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(URL))));
      try
        SharedActivity.startActivity(Intent);
        exit(true);
      except
        on e: Exception do
        begin
          if DisplayError then ShowMessage('Error: ' + e.Message);
          exit(false);
        end;
      end;
    end;
    {$ELSE}
    {$IFDEF IOS}
    var
      NSU: NSUrl;
    begin
      // iOS doesn't like spaces, so URL encode is important.
      NSU := StrToNSUrl(TIdURI.URLEncode(URL));
      if SharedApplication.canOpenURL(NSU) then
        exit(SharedApplication.openUrl(NSU))
      else
      begin
        if DisplayError then
          ShowMessage('Error: Opening "' + URL + '" not supported.');
        exit(false);
      end;
    end;
    {$ELSE}
    begin
      raise Exception.Create('Not supported!');
    end;
    {$ENDIF IOS}
    {$ENDIF ANDROID}
     
    end.
    Ответ написан
  • Как организовать отбор данных по условию?

    @zedxxx
    Есть варианты:
    1. Рисуете гуй, чтобы он повторял максимальную комбинацию, как вы привели в примере. Т.е. для каждой позиции (условие N) даёте возможность выбрать переменную, с чем и как её сравнивать. Причём, делаете так, что поля были опциональные, т.е. чтобы некоторые можно было оставить пустыми.
    Вот пример, как нечто похожее сделано в TheBat!
    5cadd9d405df8651031116.png
    2. Подключаете скриптовый язык (Lua или паскале-подобный DWScript, RemObjects PascalScript) и пишите простую инструкцию для пользователей.
    Ответ написан
    Комментировать
  • Assembler - Входит ли число в интервал?

    @zedxxx
    В Delphi (для Win32) по умолчанию используется соглашение вызовов register: до 3-х параметров передаётся через регистры EAX, ECX, EDX, результат передаётся через EAX (подробнее, смотри тут: Using Assembler in Delphi).

    Соответственно, получаем вот такой код:
    function IntervalAsm(const AValue, AMin, AMax: Byte): Boolean; register;
    asm
      // Входные параметры уже лежат в регистрах:
      // al = AValue
      // dl = AMin
      // cl = AMax
    
      cmp dl, al     // сравнение с AMin
      ja @@RetFalse  // если al < dl, то выход с False
      cmp cl, al     // сравнение с AMax
      jae @@RetTrue  // если al <= cl, то выход с True
    
    @@RetFalse:
      xor eax, eax   // eax = 0 -> Result = False
      ret
    
    @@RetTrue:
      mov al, 1      // eax = 1 -> Result = True
      ret
    end;

    Если возникают трудности с написанием кода на ассемблере, то лучше всего написать код на Delphi (или даже на самом простом Си), скомпилировать его, а затем декомпилировать и посмотреть, а какой же код генерирует сама Delphi. Для учебных проектов на Delphi прекрасно подойдёт Interactive Delphi Reconstructor (IDR).
    Ответ написан
    Комментировать
  • Как сравнить несколько строчных массивов?

    @zedxxx
    1. Вычислить хэши строк во всех массивах при помощи какой-нибудь быстрой функции, чтобы давала не очень большое число коллизий и на выходе был Integer или Int64, для скорости сравнения.

    2. Далее уже сравнивать эти хэши, причём, при совпадении нужно выполнять полное сравнение строк. Заодно можно подсчитывать была коллизия или нет. Сравнивая число коллизий которые даёт выбранная хэш функция и время хэширования строк, можно будет сделать вывод о приемлемости той или иной функции.

    В качестве хэш функции можно взять crc32с из фреймворка mORMot, говорят что она оптимизированная и очень быстрая: blog.synopse.info/post/2014/05/25/New-crc32c%28%29... Она у них используется для хэш таблиц по-умолчанию.

    Вот тут есть сравнительные тесты: https://www.delphitools.info/2014/08/25/string-has...

    Ещё можно взять библиотеку от гугла - CityHash она умеет считать хэши 32/64/128/256 бит. Тоже, говорят, быстрая. Используем для 64-битных хэшей, вот тут есть бинарники и обёртка для Delphi: https://bitbucket.org/sas_team/cityhash/src/7c7c73...
    Ответ написан
    Комментировать
  • Как лицензируется ПО сделанное в Delphi? Как лицензируется компоненты?

    @zedxxx
    www.interface.ru/home.asp?artId=21283

    Лицензии на средства разработки бывают трех типов:

    Коммерческая лицензия позволяет: использовать продукт для разработки ПО/распространять разработанное ПО/распространять компоненты ПО (например BDE), которые перечислены в лицензии на распространение.

    Ознакомительная (Downloads) лицензия: позволяет ознакомиться и исследовать ПО/ограничена во времени (30 дней)/не позволяет вести никакую разработку

    Образовательная (Academic) лицензия позволяет: Использовать продукт в целях изучения на курсах по программированию/Использовать продукт для обучения программированию/Не позволяет вести разработку, которая может быть использована вне процесса обучения


    Вот тут список доступных коммерческих лицензий https://www.embarcadero.com/ru/app-development-too...

    Обратите внимание на пункт "Лицензия на коммерческое использование", в котором для Starter указано "С ограничениями", что означает:

    *If you’re an individual you may use the Starter Edition to create apps for your own use and apps that you can sell until your revenues reach $1,000 per year. If you’re a small company or organization without revenue (or up to $1,000 per year in revenue), you can also use the Starter Edition. Once your company's total revenue reaches US $1,000, or your team expands to more than 5 developers, move up to the Professional edition with an unrestricted commercial license.

    Остальные лицензии позволяют распространять ваше ПО без ограничений.
    Ответ написан
    4 комментария
  • Как в idhttp отправить кириллицу на сайт?

    @zedxxx
    1. Почитать вот тут www.w3schools.com/tags/ref_urlencode.asp и узнать, как должен быть закодирован текст для передачи в url;

    2. Закодировать текст, используя одно из решений отсюда: stackoverflow.com/questions/776302/standard-url-en... (если используется XE7 и выше, то лучшее решение - TNetEncoding.Url.Encode()).
    Ответ написан
    Комментировать
  • Как упаковать 4 значения типа real в XMM регистр на Delphi?

    @zedxxx
    На чистом Delphi, без ассемблерной вставки, это по-моему никак не сделать. Ну а как это сделать на ассемблере, можно нагуглить за пару минут: Moving a single float to a xmm register
    "mov    $0x3f000000, %%eax\n"  // encoding of 0.5
    "movd   %%eax,       %%xmm1\n" // move to xmm1
    "shufps $0, %%xmm1,  %%xmm1\n" // splat across all lanes of xmm1

    Тут, ключевая инструкция - shufps, насколько можно понять.

    Если данные лежат в памяти уже в упакованном виде, их можно сразу загнать в xmm регистр (пример из ссылки выше): movaps xmm0,xmmword ptr [ecx]
    Ответ написан
  • Какой язык программирования наиболее удобен для приложения с локальной базой данных?

    @zedxxx
    Если выбирать между Java и С#, то десктопное приложение всё же лучше писать на C#, потому как гуй у явы выглядит слегка кособоко. Delphi так же весьма хорош + абсолютная портативность, в отличии от кандидатов выше. К тому же, при должном умении, на нём можно и под Андроид писать.
    Ответ написан
  • Как настроить правильный кирллический вывод через IDHTTP?

    @zedxxx
    Использование AnsiToUtf8 (и подобных) не приводит вообще ни к чему.

    Может быть вы покажите нам хоть строчку кода, как вы это делаете? Создаётся впечатление, что вы неправильно работаете со строками. Плюс, мне абсолютно не понятно, как конвертирование текста в utf8 и его передача по сети может привести "ни к чему".

    Использование URLEncode (различных вариаций) приводит строку к виду

    Это вообще предназначено для кодирования URL, а не данных.
    Ответ написан
    Комментировать
  • Как сделать сортировку по клику в ListView в Delphi?

    @zedxxx
    Использовать CustomSort: www.swissdelphicenter.ch/torry/showcode.php?id=1103
    Ответ написан
    Комментировать