Помощь новичкам

То есть, прямо при запуске bat-файла вызов идёт? А не идёт при запуске через Студию?

Это я не смотрел отдельно от IDE.

Проблема решилась запуском pabcnetcclear.exe.

Ясно. Он специально для этого писался

Есть ли у Вас установщик, который бы устанавливал PascalABC.NET с настройками по-умолчанию одним кликом? Мне требуется сделать так, чтобы если на компьютере разработчика ABCNET не установлено PascalABC.NET, но для сборки проекта он требуется, чтобы он доустанавливался автоматически, от пользователя требовалось бы всего лишь подтверждение желания установить данный компилятор. Нехорошо бы было заставлять разработчиков ABCNET бегать на официальный сайт, ждать пока он скачается, запускать установщик и ждать конца установки ещё и нажимая на различные кнопочки.

Если такого установщика нет, то прошу меня посвятить в процесс создания установщиков для данного языка. Для начала достаточно бы было знать в чём Вы создаёте установщики.

Кто то на форуме мне помнится делал бесшумный установщик

1 лайк

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

Скоростной велосипед для (возможно, кривого) обновленя паскаляABC.NET

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

Так вот, эта программа избавляет вас от этих страданий! 1 клик + 5-10 сек, это всё что ей нужно! +она показывает прогресбары для всего, истинное наслаждение!!!1!!!11!!1!!

Если вылетает какая то ошибка про отказ в доступе - запускайте от админа, или скачайте .manifest файл и положите его к .exe

Для работы нужен 7z (архиватор, < пары мегабайт весит) и раз нет никаких настроек и вопросов во время выполнения - ставит он, разумеется, в стандартные папки, то есть C:\Program Files (x86)\PascalABC.NET и C:\PABCWork.NET.

, разработчик сам не уверен корректно ли работает его программа; я опасаюсь применять такое в своём проекте, даже если бы именно он и потребовался бы. Всё-же, мне потом будут от пользователей жалобы лететь, если что-то пойдёт не так. Продукт, который разработчик хочет показывать и советовать пользователям, должен быть хорошо оттестирован (так ли это, в случае с данным PABCNETDownloader?), иметь понятное описание, написанное на нормальном (!) русском (или английском, например) языке, без жаргона, чтобы у пользователей не возникало сомнений в качестве продукта. Точнее, само серьёзное оформление репозитория должно показывать, что к продукту отнеслись не тяп-ляп. Хотя, конечно, можно красиво всё оформить, что многие позавидуют, а написать приложение некачественно…

Протестировать же продукт можно было скооперировавшись с разработчиками PascalABC.NET и удостоверившись, что он корректно или некорректно работает. Если этого сделано не было, увы, это проблема только разработчика PABCNETDownloader и пенять он может только на себя.

@Admin, и всё-же, как Вы создаёте свой установщик? Через какую программу?

Это NSIS

1 лайк

Не зря с него хотел начать изучение создания установщиков.

NSIS довольно медленный. Мой установщик потому и “скоростной”, что даже просто 7z-ом распаковывать его быстрее чем самим же NSIS-ом.

Но этой мой установщик это proof-of-concept и в целом для себя. Поэтому я позволил себе кинуть такое в ReadMe.md (и зря вы по-серьёному эти слова разбирать пытаетесь).

Ну, ничего вам не мешает пойти по тому же пути, раз это уже доказано что работает. Но при этом сделать целясь на нормальный функционал. Если будет ничем не хуже - я бы и сам может использовал.


Если соберётесь вот что надо знать:

  • Посмотрите в логе установщика - он выполняет ещё некоторые программы, как прекомпилятор управляемых .dll под процессор пользователя.
    Мой установщик это делает (правда, жутким костылём, и разницы производительности с- и без прекомпиляции я не заметил).

  • Основное чем отличается установка от обновления - записи в реестре. И вот это мой установщик не делает, потому что мне это не было надо. Посмотрите в эти записи в реестре:
    HKEY_CLASSES_ROOT\.pas
    HKEY_CLASSES_ROOT\.pabcproj
    HKEY_CLASSES_ROOT\PascalABCNET.PascalABCNETParser
    HKEY_CLASSES_ROOT\PascalABCNET.PascalABCNETProject
    Так же, чего установщик паскаля не делает - это добавление кнопки в меню папки ПКМ>>Создать. Мой установщик тоже не делает, зато в корне репозитория есть .reg файл для этого.

1 лайк

Качество - для меня важный параметр, поэтому буду стараться делать хороший установщик.

А как можно обойти прерывания в коде вида

begin
  try
    var список := EnumerateAllFiles('c:\', '*.pdf');
    список.printlines;
  except
   //continue; {continue вне цикла}
  end;
end.

чтобы продолжить дальше?

Или придётся изобретать что-то на подобии

/// Возвращает перечисляемую коллекцию имен файлов которые соответствуют шаблону в указанном каталоге, с дополнительным просмотром вложенных каталогов /// /// Полный или относительный путь катага в котором выполняется поиск /// Шаблон поиска файлов /// Одно из значений перечисления SearchOption указывающее нужно ли выполнять поиск во вложенных каталогах или только в указанном каталоге /// Возвращает перечисляемую коллекцию полных имен файлов private static IEnumerable SafeEnumerateFiles(string path, string searchPattern = “.”, SearchOption searchOption = SearchOption.TopDirectoryOnly) { var dirs = new Stack(); dirs.Push(path);

while (dirs.Count > 0)
{
    string currentDirPath = dirs.Pop();
    if (searchOption == SearchOption.AllDirectories)
    {
        try
        {
            string[] subDirs = Directory.GetDirectories(currentDirPath);
            foreach (string subDirPath in subDirs)
            {
                dirs.Push(subDirPath);
            }
        }
        catch (UnauthorizedAccessException)
        {
            continue;
        }
        catch (DirectoryNotFoundException)
        {
            continue;
        }
    }

    string[] files = null;
    try
    {
        files = Directory.GetFiles(currentDirPath, searchPattern);
    }
    catch (UnauthorizedAccessException)
    {
        continue;
    }
    catch (DirectoryNotFoundException)
    {
        continue;
    }

    foreach (string filePath in files)
    {
        yield return filePath;
    }
}

}

_

Хотя с "ленивостью", похоже, не получится

static IEnumerable EnumerateFilesDeepIgnoringAccessException( DirectoryInfo root, string mask) { var localResult = new List(); try { localResult = root.EnumerateFiles(mask).ToList(); } catch (UnauthorizedAccessException) { // ignore it yield break; }

foreach (var fi in localResult)
    yield return fi;

foreach (var di in root.EnumerateDirectories())
{
    foreach (var fi in EnumerateFilesDeepIgnoringAccessException(di, mask))
        yield return fi;
}

}

потому что нельзя yeild в блоке try.

Пропустить элемент последовательности нельзя, потому что .MoveNext всё равно придётся вызывать.

А try и yield совместимы, пока не в одной и той же подпрограмме:

function TryEnmrFiles(path: string): sequence of string; forward;

function EnmrFiles(path: string): sequence of string;
begin
  yield sequence System.IO.Directory.EnumerateFiles(path);
  foreach var dir in System.IO.Directory.EnumerateDirectories(path) do
    yield sequence TryEnmrFiles(dir);
end;

function TryEnmrFiles(path: string): sequence of string;
begin
  try
    Result := EnmrFiles(path);
  except
  end;
end;

(хз то ли я в try обернул, давно таким не занимался)

Имеются старые паскалевские исходники на эстонском, испанском и других иностранных языках.

“Локализация” подразумевает многоязычную поддержку или же перевод откомпилированных ресурсов. А как называется (полу)автоматизированный процесс замены значимых названий функций, процедур, переменных и описаний прямо в исходнике?

Насколько я понял, если делать самостоятельно, достаточно вырезать слова в список, убрать зарезервированные, перевести список в Яндексе или Гугле, и вставить перевод.

Какие могут быть особенности кроме частичных совпадений?

Раньше это звали препроцессингом, а современных новомодных терминов я не знаю.

А что, у Вас сотни исходников на эстонском? Ну так там в любом случае только строки менять под ввод-вывод.

Зачем нужна кнопка “Сгенерировать реализацию”?

Чтоб создать реализацию метода вне класса. Чтоб кнопка работала - надо описать заголовок метода, но не писать ему begin-end; блок.

Так же работает у модулей/библиотек, для глобальных подпрограмм в секции интерфейса.

А как можно посмотреть реализацию “безопасных” срезов?

Я забыл о жадной развёртке и полагал, что

срез:=s?[a:b]; //со знаком вопроса

равнозначно

try срез:=s[a:b] except end; //без вопроса

который, в отличие от первого, спотыкается на нуле и выходе за максимум.

Самый простой способ - сделать .exe, удалить .pdb и декомпилировать чем то типа DotPeek.

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

Я обычно узнаю названия DotPeek-ом, а затем смотрю в PABCSystem.

Безопасные срезы просто корректируют границы срезов чтобы они не выходили за границы массива

Имеется несколько независимо дополняемых списков и нужно из каждого брать следующее или предыдущее значения как удаляя, так и оставляя элемент. Традиционное решение с массивом индексов показалось избыточным и усложняет код. И если решение с удалением элементов решается через L[i].FirstOrDefault и L[i].RemoveAt(0), то для перехода без удаления нужны индексы или вспомогательные списки.

Проще через класс или в .Net есть более подходящая структура, которая отслеживает текущий индекс?