• Почему при ненулевой строке ее длина - 0?

    @zedxxx
    Если отвечать на вопрос из заголовка, то:
    1. При отсутствии директивы {$H+} тип string является алиасом на тип ShortString, который хранит длину строки в символе с индексом ноль. Максимальная длина для ShortString равна 255.
    2. Для того, чтобы функция Length правильно работала для ShortString, длину строки нужно задавать функцией SetLength - в самом начале процедуры добавьте вызов setlength(template, 255);

    Что касается приведенного кода, то тут возможно несколько вариантов исправления:
    • количество символов в строке у вас равно n-1 - можно использовать это значение;
    • можно включить директиву {H+} или объявить строку как AnsiString и увеличивать длину строки динамически. Перед записью в строку на каждой итерации дабавьте: setlength(template, length(template) + 1); - тогда вызов length(template) вернёт нужное значение.
    Ответ написан
    Комментировать
  • Почему появляется сдвиг индексации массива при передачи в функцию?

    @zedxxx
    в соответствии с правилами массивов в паскале: индексация с единицы

    Это строки всегда индексируются с единицы. Для массивов же нет такого правила. Как раз наоборот, динамические массивы и открытые массивы параметров всегда нумеруются с нуля.

    Да и для статических массивов лучше придерживаться этого правила (если только нет какого-то специфического требования в конкретном случае).

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

    for n := Low(source) to High(source) do
      writeln(source[n]);
    Ответ написан
    5 комментариев
  • Как в Android studio создать приложение на Kotlin?

    @zedxxx
    New Project - Empty Activity - Next - Finish
    Ответ написан
    Комментировать
  • Как в TXMLdocument в Delphi сделать перевод строки?

    @zedxxx
    Попробуйте так:
    LDocument.XML.Text := XmlDoc.FormatXMLData(LDocument.XML.Text);
    LDocument.Active := True;
    LDocument.SaveToFile(...);

    https://docwiki.embarcadero.com/Libraries/Sydney/e...
    Ответ написан
  • Хочу писать приложения под Win10, что учить?

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

    @zedxxx
    Для изучения Delphi вам прекрасно подойдёт бесплатная среда Delphi Community Edition
    Ответ написан
    Комментировать
  • Virtual TreeView для Delphi 5 остался у кого-то?

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

    Самый первый коммит датирован 2009-м годом и там есть файлы проекта для Delphi 4 и выше.
    Ответ написан
    1 комментарий
  • Стоит ли учить С/С++ если не планируешь писать на нём?

    @zedxxx
    Не стоит. Без практики, все ваши знания выветрятся через неделю.
    Ответ написан
    Комментировать
  • Какая связь между функциональной и императивной парадигмами?

    @zedxxx
    Никакой связи. Перевожу выделенное предлжение: "Эта книга была написана для тех, кто знаком с функциональным программированием на языке SML и хочет научиться императивному программированию на языке Си".

    Ниже по тексту там ещё есть: "функциональные и императивные языки могут быть использованы для написания программ в разных стилях: на SML можно писать в императивном стиле, а на Си в функциональном. Но программы написанные таким образом выглядят чужеродно". И книжка, судя по всему, о том, как писать на Си в таком чужеродном стиле, чтобы было аля SML. Вот такая идея.

    P. S. Чуток полистал книжку, и похоже, что там просто учебник как пересесть с SML на Си. С примерами на одном языке и трансляцией их на другой, с попутным разъяснением, что происходит.
    Ответ написан
    5 комментариев
  • Как открыть файл по своей программой (ассоциировать его с программой)?

    @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 комментария
  • Как разделить строку на масив по пробелу?

    @zedxxx
    Используйте свойство Split:

    uses 
      ...
      SysUtils;
         
    var
      I: Integer;
      VStr: string;
      VArr: TStringArray;
    begin
      VStr := 'Произвольная строка';
      VArr := VStr.Split(' ');
    
      for I := 0 to Length(VArr) - 1 do begin
        WriteLn(VArr[I]);
      end;
    end;
    Ответ написан
    Комментировать
  • Чем опасно переполнение статического массива в C?

    @zedxxx
    Да всё тем же. В стеке лежат некие данные (указатели, переменные, адреса возврата) и переполняя массив, вы тем самым затираете эти данные мусором.

    Нашёл красивую картинку, которая наглядно объясняет, как лежат данные в стеке:

    5df9288163d6c761119182.png
    Взял тут: Stack Canaries with GCC: Checking for Stack Overfl...

    Если в buffer2 писать сверх выделенного размера, то будут затёрты все данные, что лежат под ним.
    Ответ написан
    Комментировать
  • Какой смысл несет слово "имитация" в словосочетании "имитация передачи аргументов по ссылке"?

    @zedxxx
    В Си нету такого понятия как "ссылка" (это понятие из С++) и Си-шный код может только имитировать такое поведение как "передача по ссылке", используя указатели.
    Ответ написан
    Комментировать
  • Каким образом сохранить пункты 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 комментария
  • Зачем существует registry в lua?

    @zedxxx
    Об этом подробно написано в документации: https://www.lua.org/manual/5.3/manual.html#4.5

    Lua предоставляет реестр, предопределенную таблицу, которая доступна C коду для хранения любых Lua значений. Таблица рееста всегда расположена по псевдоидексу LUA_REGISTRYINDEX. Любая C библиотека может хранить данные в этой таблице, но она должна заботиться о выборе уникальных ключей, чтобы избежать коллизий с другими библиотеками. Обычно, вы должны использовать в качестве ключа строку содержащую имя библиотеки, или легкие пользовательские данные (light userdata) с адресом C объекта в вашем коде, или любой Lua объект созданный вашим кодом. Как и имена переменных, ключи, начинающиеся с подчеркивания со следующими за ним прописными буквами, зарезервированы для Lua.

    Целочисленные ключи в реестре используются механизмом ссылок (см. luaL_ref) и некоторыми предопределенными значениями. Следовательно, целочисленные ключи не должны использоваться для других целей.

    Когда вы создаете новый Lua контекст, его реестр содержит некоторые предопределенные значения. Эти предопределенные значения индексируются целочисленными ключами, определенными как константы в lua.h. Определены следующие константы:

    • LUA_RIDX_MAINTHREAD: По этому индексу в реестре расположен главный поток контекста. (Главный поток создается при создании контекста.)
    • LUA_RIDX_GLOBALS: По этому индексу в реестре расположено глобальное окружение.


    Так же, есть небольшой пример использования в Programming in Lua: https://www.lua.org/pil/27.3.1.html
    Ответ написан
    4 комментария
  • Нужно ли изучать 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 комментария
  • Статический и динамический массив в С?

    @zedxxx
    Разница во времени жизни и в месте размещения в памяти такого массива.

    Динамический массив размещается в куче и живёт до тех пор, пока вы его руками не удалите (вызовом free(a)).

    Статический* массив живёт на стеке и удаляется при выходе переменной из области видимости. Плюс ко всему, поскольку стек обычно имеет ограниченный размер, создание очень большого статического массива приведёт к ошибке переполнения стека (stack overflow).

    P. S. Только такой массив называется не статический, а Variable Length Array (массив переменной длины).
    Ответ написан
    Комментировать