October 2030
| |
|
1 |
2 |
3 |
4 |
5 |
| 6 |
7 |
8 |
9 |
10 |
11 |
12 |
| 13 |
14 |
15 |
16 |
17 |
18 |
19 |
| 20 |
21 |
22 |
23 |
24 |
25 |
26 |
| 27 |
28 |
29 |
30 |
31 |
|
9/9/23 05:53 pm
Заодно уж...
Починил этим вот способом и транслителирующий ренеймер, который таки транслителирует имена файлов на русском языке и таки переименовывает их
Исходники
СкачатьБинарник (EXE)SFX-архив (Распаковывается в каталог Windows) ZIP-архивСовместимость: Windows XP - Windows 10 (98 и Win11 не тестировались) Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/09/09/zaodno-uzh/
9/7/23 04:21 pm
Окончательное решение о рандомном переименовании файлов в Windows
ПреамбулаУже поднимал этот вопрос здесь ( копия), в общем, нативного решения не нашел, написал простенькую утилиту Random Renamer. Краткая справкаRandom renamer (rr), this program rename files to random names v 0.0.1b (L) ChaosSoftware 2023.Использование: rr.exe [параметры] | -h-h - помощь -m <mask> - Маска файлов для переименования. Параметр обязательный. Или используйте параметр -r для переименования только каталогов. [-a] <номер> - задать алфавит для генерации случайного имени, значение по умолчанию 0[-d] - стартовая директория, по умолчанию - текущая [-l] <число> - длина имени, по умолчанию 8[-r] - переименовывать директории [-s] - включая подкаталоги [-v] - отображать процесс на экране [-x] <число> - длина расширения, по умолчанию 3, каталогам расширение не присваивается. Алфавиты: 0: abcdefghijklmnopqrstuvwxyz0123456789 1: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 2: ABCDEF0123456789 3: abcdef0123456789 4: 0123456789 5: abcdefghijklmnopqrstuvwxyz 6: ABCDEFGHIJKLMNOPQRSTUVWXYZПо умолчанию: 0ИсходникНа GitHubБинарник (EXE for Windows)СкачатьИспользованиеПоложить бинарник в один из каталогов %PATH%, например, в C:\Windows и пользоваться. Потом сделаю пример, как его со shred'ом в BAT/CMD использовать. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/09/07/okonchatelnoe-reshenie-o-randomnom-pereimenovanii-fajlov-v-windows/
9/7/23 02:49 pm
FreePascal: TStringList надо инициализировать nil'ом
Вот как-то так:
var ... lstFiles:TStringList=nil; lstDirs:TStringList=nil;
Иначе возможен плавающий глюк, который внезапно может вылезти где угодно при обращении к TStringList. Возьмет и вылезет EAccessViolation, так что про инициализацию забывать не надо. Делал маленькую внутрикорпоративную утилиту, два дня потерял, отлаживая странный глюк, а вот оно как оказалось.
Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/09/07/freepascal-tstringlist-nado-initsializirovat-nil-om/
5/24/23 03:51 am
Lazarus: Генерация случайной строки из определенного алфавита (паттерна) символов.
На самом деле, оказалось довольно простой задачей.
Основная программаvar P1,P2,P3,P4:String; I:Integer;
begin
P1:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
P2:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
P3:='abcdefghijklmnopqrstuvwxyz0123456789';
P4:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
for I:=1 to 23 do
begin
WriteLn(GenerateString(75,P1));
end;
WriteLn('Press ENTER');
ReadLn();
end.Пока все совсем просто, создаем 4 паттерна (алфавита) для теста, заполняем паттерны, создаем счетчик для цикла, а в цикле вызываем функцию GenerateString, таким образом генерируем 23 строки. Функция GenerateString1. Функция GenerateString принимает 2 параметра - длина генерируемой строки и паттерн/алфавит, возвращает строку: function GenerateString (len:Integer; Pattern:String): String;2. Заводим две внутренних переменных, счетчик для текущей позиции символа в генерируемой строке, и переменную для хранения случайного символа, который получим из строки Pattern: var I:Integer; C:Char;3. Инициализируем значение переменной Result, которую функция автоматически возвратит в качестве результата функции: Result:='';Если этого не сделать, то при попытке заранее выделить память под переменную, компилятор выдаст предупреждение: Hint: Function result variable of a managed type does not seem to be initialized (Подсказка: Переменная результата функции управляемого типа, похоже, не инициализирована). 4. И счетчик для текущего символа: I:=0;5. Выделяем память под будущую строку, если этого не сделать, память будет выделяться динамически, что будет тормозить процесс: SetLength(Result,len);6. Запускаем цикл: while I < len do
begin
//...
end; В цикле: 1. Получаем случайный символ. 2. Записываем полученный символ в нужное место результирующей строки. 3. Увеличиваем счетчик цикла. Обращение к символу в строкеВ Pascal это очень просто, строка рассматривается как массив, а символы - элементы массива. Нумерация символов в строке начинается с единицы, т.е. если мы хотим в переменную C (типа char) записать третий символ из строки Pattern, то это делается так: C:=Pattern[3];Получение случайного целого числа из диапазона значенийДля этого применяется функция RandomRange из модуля Math со следующим синтаксисом: RandomRange(начальное_значение, конечное_значение);т.е. если вызвать функцию таким образом: I:= RandomRange(1,10);то в переменной I (целого типа) окажется случайное значение от 1 до 10. Внимание! Не забудьте в начале программы подключить модуль Math! Uses Math;Ну а длина строки, это совсем просто: Length(Pattern). Итого: 1. Получение случайного символа: C:=Pattern[RandomRange(1, Length(Pattern))];2. Запись символа в результирующую строку: Result[I+1]:=C;3. Увеличение счетчика: inc(I);Код функции целикомfunction GenerateString (len:Integer; Pattern:String): String;
var I:Integer; C:Char;
begin
Result:='';
I:=0;
SetLength(Result,len);
while I < len do
begin
C:=Pattern[RandomRange(1, Length(Pattern))];
Result[I+1]:=C;
inc(I);
end;
end;Результат работы программы Пример целикомНа GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/05/24/lazarus-generatsiya-sluchajnoj-stroki-iz-opredelennogo-alfavita-patterna-simvolov/
5/10/23 02:53 am
Паттерны (алфавиты) для создания случайных строк
Из пользовательского набора символов:
1. Заглавная, строчная латиница, цифры. 2. Заглавная латиница, цифры. 3. Строчная латиница, цифры. 4. Заглавная, строчная латиница.
P1:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; P2:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; P3:='abcdefghijklmnopqrstuvwxyz0123456789'; P4:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/05/10/patterny-alfavity-dlya-sozdaniya-sluchajnyh-strok/
4/24/23 04:58 am
Freepascal не находит нужного модуля (например, CRT) - решение.
Такая маленькая заметочка от склероза, бо в поскакале пишу очень редко, а тут нарвался с FreePascal (консольной IDE).
Если вдруг при компиляции из среды выходит ошибка:
file.pas(2,6) Fatal: Can't find unit Crt used by MyProgram
Особенно если модуль стандартный, и должен быть в комплекте с fp/fpc, надо проверить, прописан ли путь к каталогу units в конфиге среды:
В среде идем в меню Options --> Directories и если видим на вкладке Units ничего:
 Прописываем в окошке нужный каталог: X:\Path\To\FPC\units\$FPCTARGET\*где: X: - диск где установлен FreePascal Path\To\FPC - путь к каталогу, где установлен FreePascal $FPCTARGET - внутренняя переменная среды, которая указывает на цель компиляции ( x86, x64, arm и т.д.), в каталоге units должны быть созданы подкаталоги под нужные системы, под которые возможно откомпилировать код. У меня там только один каталог i386-win32. Например: C:\FPC\3.0.0\units\$FPCTARGET\*ИсточникЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/04/24/freepascal-ne-nahodit-nuzhnogo-modulya-naprimer-crt-reshenie/
12/5/22 12:27 am
Transren
Translit Renamer - программа, которая заменяет русские буквы в именах файлов на латинские, т.е. транслитерирует имена файлов и каталогов. v 0.0.1b (L) ChaosSoftware 2022.
Использование: transren.exe <-h>|<-m <mask> и/или <-t>>[-d] [-s]
-h - эта помощь
-m <mask> - Маска <mask>, маска для файлов, которые нужно переименовать
-t - переименовать каталоги (по маске каталоги не ищет)
[-d] <directory> - Стартовый каталог. Если не указан, используется текущий каталог.
[-s] - включить в поиск подкаталоги
[-f] - только поиск, показывает файлы для переименования
Примеры:
transren.exe -m *.html - транслитерировать *.html в текущем каталоге
transren.exe -t - переименовать подкаталоги в текущем каталоге
transren.exe -m *.html -s - переименовать *.html в текущей директории и всех подкаталогах
transren.exe -m *.* -s -t - транслитерировать все файлы и все поддиректории в текущей директории
transren.exe -m *.html -d D:\DOC\ - транслитерировать файлы *.html в каталоге D:\DOC
Если файл существует, программа спросит, заменить ли его. Если каталог существует, программа его пропустит.
Скриншоты

Как сделалБыла у меня для этих целей программулина на VB 6.0, но за давностью лет проебалась, вместе с исходниками. Пришлось с ноля переписывать на Трупопаскале FreePascal, в принципе, как написаны основные части, я уже рассказал, по тегу pascal ( копия на LJR) Зато не требует за собой таскать framework и кучу библиотек. Системные требования+ 64 Мб ОП + 800 Kb HDD + OS: Windows XP - Windows 11. СкачатьЭкзешникИнсталлятор (распаковывается в %WINDIR%)ZIP-архивИсходникиНа GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/12/05/transren/
12/3/22 01:39 am
Lazarus: Crt, WinCrt, русский язык и нажатие клавиши в консоли.
Понадобилось сделать что-то типа такого:
Файл уже существует. Заменить? [Y/N]
Вспомнил, что в Турбопаскале была функция ReadKey из модуля Crt, а вдруг и во FreePascal есть?
Есть, но модуль Crt делает глюк русскому языку:
program TestCrt;
uses Crt;
var Ch:char;
begin
WriteLn('Нажмите любую клавишу...');
Ch:=ReadKey;
end.
 Ладно, пробуем заменить Crt на WinCrt. Глюк с русским языком пропал, но функция ReadKey на нажатие клавиш не реагирует, да пиздец, еб твою мать! В общем, долго плевался, реализовал через TKeyEvent из модуля Keyboard: uses SysUtils,Keyboard;
function Ask(FilePath:UnicodeString):boolean;
var K: TKeyEvent;
KS:String;
begin
WriteLn ('File ', FilePath, ' is exists! Replace file? [Y/N]');
InitKeyBoard;
while true do begin
K:=GetKeyEvent;
K:=TranslateKeyEvent(K);
KS:=KeyEventToString(K);
if (KS='Y') or (KS='y') then begin DoneKeyBoard; exit(true); end;
if (KS='N') or (KS='n') then begin DoneKeyBoard; exit(false); end;
end;
DoneKeyBoard;
exit(false);
end;Исходник на PasteBinЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/12/03/lazarus-crt-wincrt-russkij-yazyk-i-nazhatie-klavishi-v-konsoli/
12/2/22 02:22 am
Lazarus, сортировка TStringList.
ПреамбулаИногда список строк ( TStringList) требуется сортировать, что, как бы, понятно. Но во Freepascal сортировка устроена довольно странно, в C# у аналогичного класса из коробки несколько больше возможностей, во всяком случае, можно поменять направление, по возрастанию или по убыванию. С хитрыми сортировками, конечно, тоже вылезает нетривиальщина, но на то они и хитрые сортировки. Тестовые спискиДля начала сформируем тестовые списки, для русского и английского языков. Там код тривиален, потому не буду загружать заметку, ссылки на PasteBin: Тестовый список для английского языкаТестовый список для русского языкаЗаодно уж и выведем списки в их изначальном виде: Стандартная сортировкаОна же единственная из коробки, является стандартной сортировкой по возрастанию, т.е. список сортируется от меньшего к большему, а об алгоритме будет ниже. Вызов функции простой: lstTest.Sort;Пробуем. Выводим список на экран: WriteLn('Сортировка по возрастанию (по-умолчанию, логическая):'); i:=0; while i < lstTest.Count do begin WriteLn(lstTest[i]); inc(i); end;
Writeln(); WriteLn('Press Enter...'); ReadLn();Результат:  Как обычно, с поддержкой русского язкы все весело, но чинить эту поддержку в данной заметке не буду. Кому сильно надо - пишите. Стандартный алгоритм сравнения строк во freepascalАлгоритм: 1. Строки сравниваются посимвольно. Например, в словах parrot и puppy первые символы ( p и p) равны, а далее a меньше u, т.е u в кодовой таблице находится ниже, чем a. 2. На этом сравнение прекращается, строка puppy больше чем parrot. 3. Если начальные символы строк совпадают, то в дело вступает длина, чем строка длиннее, тем она больше, поэтому, зависимая от центра Каталония, все еще больше, чем кот, который гуляет сам по себе: program test;
var
S1:string;
S2:string;
begin
S1:='cat';
S2:='catalonia';
if S1 < S2 then Writeln ('S1 (',S1,') < S2 (',S2,')' );
if S1 = S2 then Writeln ('S1 (',S1,') = S2 (',S2,')' );
if S1 > S2 then Writeln ('S1 (',S1,') > S2 (',S2,')' );
Readln();
end.Вывод: S1 (cat) < S2 (catalonia)Что, конечно, печально, потому что кот свободнее Каталонии, и явно больше в этом смысле. Пользовательские функции сортировкиОграничение, накладываемое одной функцией сортировки в комплекте класса TStringList легко решается тем, что можно подключить любую пользовательскую сортировку ссылкой на внешнюю функцию. Для этого надо установить пользовательскую функцию сортировки, таким вот образом: lstTest.CustomSort(@MySort);где MySort - имя вашей функции сортировки. Естественно, она должна быть заранее создана, чтобы все откомпилировалось и заработало. Не забудьте про символ @ перед именем функции, в Delphi не надо было его указывать, компилятор сам знал, где вместо имени функции вставить ссылку на ее адрес, в freepascal это надо указывать явно.Формат функции следующий: MySort(List: TStringList; Index1, Index2: Integer): Integer;Т.е. на входе нужна переменная типа TStringList и две переменные типа Integer, для индексов строк в списке, функция должна возвращать значение типа Integer: 1 - Если строка Index1 > Index20 - Если строки равны -1 - Если строка Index1 < Index2Конечно, по мнению пользовательского алгоритма сортировки. Например, можем повторить стандартный метод сортировки: function SortByAsc(List: TStringList; Index1, Index2: Integer): Integer;
begin
if List[Index1]>List[Index2] then
begin
Result := 1;
Exit;
end;
if List[Index1]=List[Index2]
then Result := 0
else Result := -1;
end; Внезапно, починился русский язкы :) Сортировка по убываниюfunction SortByDesc(List: TStringList; Index1, Index2: Integer): Integer;
begin
if List[Index1]<List[Index2] then
begin
Result := 1;
Exit;
end;
if List[Index1]=List[Index2]
then Result := 0
else Result := -1;
end;Вообще просто, достаточно заменить знак > на < в операторе сравнения. Другие пользовательские сортировкиВозможности пользовательских сортировок не ограничены практически ничем. Покажу, как обычно, самое простое - сортировка строк по длине. Сортировка по возрастанию: function SortByLenAsc(List: TStringList; Index1, Index2: Integer): Integer;
begin
if Length(List[Index1])>Length(List[Index2]) then
begin
Result := 1;
Exit;
end;
if Length(List[Index1])=Length(List[Index2])
then Result := 0
else Result := -1;
end;Т.е. просто применяем функцию Length в операторе сравнения: Length(List[Index1]) Тот же вариант, но по убыванию: function SortByLenDesc(List: TStringList; Index1, Index2: Integer): Integer;
begin
if Length(List[Index1])<Length(List[Index2]) then
begin
Result := 1;
Exit;
end;
if Length(List[Index1])=Length(List[Index2])
then Result := 0
else Result := -1;
end; Тестовые программыПример для английского языка на GitHubПример для русского языка на GitHubПо мотивамОбсуждения на Исходниках, но более подробнее и лучше у меня. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/12/02/lazarus-sortirovka-tstringlist/
11/28/22 02:31 pm
Lazarus. Поддержка Unicode в консоли Windows.
Продолжаем бодаться с русским языком в консоли (копия).
Ну не может же быть так, что виндовая консоль и Unicode (UTF-8) не поддерживает, подумал я. У меня и функции, которые, собственно, в программе нужны, UTF8 требуют, и с русским языком, если исходник не в UTF-8 работают криво, и в документации по Lazarus написано, что он поддерживает вывод на консоль в UTF-8, и в документации по винде написано, что она тоже нежно любит UTF-8, хотя может и в OEM(которая CP866).
Хинт оказался небольшим, неочевидным, и вообще был обнаружен чисто случайно, кодировку исходника надо поменять на на CP866, как я делал по ссылке выше, а на UTF-8 с BOM!
И нигде в документации (не в виндовой, не в Лазарувской) об этом не сказано, ну или закопано в такие бездны Варпа, что не докопался.
До (исходник в UTF-8):
 После (исходник в UTF-8 с BOM):  program Project1;
begin
WrileLn('Какая-то фигня с русскими буквами');
WrileLn('А, уже не фигня');
Readln();
end.Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/28/lazarus-podderzhka-unicode-v-konsoli-windows/
11/27/22 12:04 am
Lazarus, встроенный парсер командной строки.
ПреамбулаВ Lazarus есть довольно неплохой парсер командной строки, который (почти) работает из коробки. Для его использования нужно создать приложение на базе класса TCustomApplication, который обладает таким функционалом. Готовый шаблон проекта имеется в комплекте. Проект --> Создать проект... и в появившемся окне выбрать тип проекта Консольное приложение:  Можно ввести параметры для генерации кода:  Основной код приложения размещается в процедуре DoRun, например, в procedure TMyApplication.DoRun;Решил расширить пример с поиском файла по маске ( копия), заодно поэкспериментировать с парсером командной строки. Параметры будут такие: Использование: smallfinder.exe <аргументы> -h - эта помощь -m <маска> - маска файла для поиска. Обязательный параметр -d <директория> - Начальняя директория, если параметр не указан, используется текущая. -s - включить в поиск подкаталогиАнализ параметров командной строкиПримечание: весь код в процедуре TSmallfinder.DoRun. Почему-то способ проверки из документации, случая, когда параметров нет вообще, у меня сработал криво, так что пришлось вспоминать более старый: // check if no parameters - способ из документации нихуя не сработал
if ParamCount=0 then begin
WriteHelp;
Terminate;
Exit;
end; Но далее все вроде бы пошло как надо, единственное, что параметры регистрозависимые (т.е. -d и -D программа воспринимает как разные параметры), пока не стал с этим разбираться, может после, если сильно надо будет. Длинные имена параметров не использовал, только короткие. Вывод помощи: //help
if HasOption('h', '') then begin
WriteHelp;
Terminate;
Exit;
end;Процедуру WriteHelp можно создать при создании нового проекта, а потом только запомнить, примерно так: procedure TSmallfinder.WriteHelp;
begin
writeln('Usage: ',ExtractFileName(ExeName), ' <arguments>');
WriteLn('-h - this help');
WriteLn('-m <mask> - file mask for search. Parameter must be!');
WriteLn('-d <directory> - start directory. If not, use current dir.');
WriteLn('-s - include subdirs');
end;Маска файла: //mask
if HasOption('m','') then begin
Mask:=GetOptionValue('m','');
if Mask = '' then begin
WriteHelp;
Terminate;
Exit;
end;
end;Стартовый каталог: //start directory
StartDir:=GetOptionValue('d','');
if StartDir='' then begin
StartDir:=GetCurrentDir();
end;Искать в подкаталогах: //Include subdirs
IncludeSubdirs:=HasOption('s','');Ну и сам процесс поиска, до кучи: WriteLn('Start directory: ',StartDir);
lstFiles := TStringList.Create;
FindAllFiles(lstFiles, StartDir, Mask, IncludeSubdirs);
i:=0;
while i < lstFiles.Count do begin
WriteLn(lstFiles[i]);
inc(i);
end;
lstFiles.Free();Естественно, все нужные переменные перечисляем в секции var процедуры TSmallfinder.DoRunvar
Mask, StartDir:string;
IncludeSubdirs:boolean;
i:LongInt;
lstFiles:TStringList; Примеры работыsmallfinder.exe -m *.exe -d C:\Windows smallfinder.exe -m *.exe -d C:\Windows -s smallfinder.exe -m *.exe СсылкиМануал по обработке параметров командной строкиПример целиком на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/27/lazarus-vstroennyj-parser-komandnoj-stroki/
11/26/22 03:45 am
Lazarus: Транслит строки (в консоли)
1. Понадобятся модули regexpr и fgl:
uses regexpr, fgl;
regexpr нужен для небольшой оптимизации, a fgl - для создания аналога словаря (Dictionary).
2. Создаем тип для будущего словаря:
type
TDictTrans=class(specialize TFPGMap<string, string>);
Документация по TFPGMap
3. Сделаем функцию для транслитерации, с одним параметром, входной строкой с русскими буквами:
function Translit(Str:string):string; //тут будет код end;
4. Заводим внутренние переменные функции:
var Regex:TRegExpr; Dict:TDictTrans; Ch,oStr,oTrans:string; I:LongInt;
Regex - экземпляр класса для работы с регулярным выражением.
Dict - словарь для транслитерации.
Ch - транслитерируемый символ
oStr - выходная строка
oTrans - сюда будем возвращать результат транслита отдельного символа.
I - счетчик цикла, в котором будем анализировать строку.
Небольшая оптимизацияСоздаем новое регулярное выражение для кириллицы (и пробела) и проверяем входную строку на наличие русских букв. Если их нет - возвращаем исходную строку и выходим из функции: Regex:=TRegExpr.Create;
Regex.Expression:='[А-Я]|[а-я]|\s';
if not Regex.Exec(Str) then begin
exit(Str);
end; 5. Заполняем словарь (транслит взят из старого армейского учебника времен СССР, можете сделать свой): Dict:=TDictTrans.Create; Dict.Add(' ','_'); Dict.Add('А','A'); Dict.Add('а','a'); ... Dict.Add('Я','JA'); Dict.Add('я','ja');Словарь целиком на PasteBin6. Инициализируем переменные, используемые в цикле: Ch:=''; oStr:='';7. Заводим цикл for, нумерация символов в строке идет с 1, длина строки получается функцией Length(Str): for I:=1 to Length(Str) do begin ... end;8. В цикле получаем символ из строки: Ch:=Copy(Str,I,1);9. Пробуем получить данные из словаря по ключу, которым является русская буква. Если это удалось, присоединяем результат транслита к выходной строке, если нет - это не русская буква, присоединяем исходный символ к выходной строке: if Dict.TryGetData(Ch, oTrans) then begin
oStr:=oStr+oTrans; //russkaya bukva - transliteriruem
end
else begin
oStr:=oStr+Ch; //nerusskaya bukva, ostavlaem v pokoe
end; 10. Освобождаем память словаря после цикла: Dict.Free;11. Возвращаем результат работы функции: exit(oStr);Функция целиком на PasteBin12. Код основной программы: var
strInput, strOutput:string;
...
begin
Write('Input string:'); ReadLn(strInput);
strOutput:=Translit(strInput);
WriteLn(strOutput);
WriteLn('Press Enter...'); ReadLn();
end.Для совместимости с русским языком в консоли необходимо добавить директивы компилятора, иначе словарь будет работать неправильно: program translit; {$mode objfpc} {H+} {$codepage CP866} ...$mode objfpcH+ - чтоб строки по умолчанию не были ShortString'ами$codepage CP866 - установка кодовой страницы. Документация по работе со строкамиПроверка Исходник примера на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/26/lazarus-translit-stroki-v-konsoli/
11/25/22 11:55 pm
Lazarus, поддержка русских букв в консоли (Windows 7)
Из коробки русские буквы в консоли поддерживаются через жопу:
 Это потому что Lazarus по умолчанию создает файл в UTF8, а консоль Windows 7 поддерживает CP 866 (кодировку DOS/OEM), достаточно перекодировать файл: 1. Щелкаем по пустому месту в исходнике в редакторе. 2. Выбираем Параметры файла --> Кодировка 3. В выпадающем списке выбираем CP866:  4. В появившемся окне нажимаем кнопку Изменить файл:  5. ФАНФАРЫ! ИсточникТестовый пример на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/25/lazarus-podderzhka-russkih-bukv-v-konsoli-windows-7/
11/25/22 08:39 pm
Lazarus, регулярные выражения.
Из коробки доступен мощный класс TRegExpr, вполне себе работает с регулярками. Сожрал даже C#-овскую, без изменения синтаксиса вообще. Пример регулярки для обнаружения русских букв:
program regexptest;
uses regexpr;
var Regex:TRegExpr;
begin
Regex:=TRegExpr.Create;
Regex.Expression:='[а-я]|\s';
Writeln(Regex.Exec('АБВГ'));
Writeln(Regex.Exec('ABCD'));
ReadLn();
end.
ДокументацияПример на КиберфорумеЭтот пример на GitHubUPD: Более лучшая регулярка для поиска кириллицы (и пробела). [А-Я]|[а-я]|\sПервая ( [а-я]|\s) нормально работает, если формат файла исходника UTF-8, и текст в UTF-8, а вот с консолью в Win7 она работает только на строчных буквах, на заглавных не работает. А консоль требует CP866. О других косяках кириллицы в консоли - в следующих выпусках нашего журнала. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/25/lazarus-regulyarnye-vyrazheniya/
11/25/22 01:34 pm
Lazarus, список каталогов с подкаталогами
Плохо, что по маске не умеет каталоги искать. А в остальном все просто.
 program alldirs;
uses Classes, SysUtils, FileUtil;
var
lstDirs:TStringList;
i: Integer;
begin
lstDirs := TStringList.Create;
FindAllDirectories(lstDirs,'C:\Windows',true);
i:=0;
while i < lstDirs.Count do begin
WriteLn(lstDirs[i]);
inc(i);
end;
WriteLn ('Found: ',lstDirs.Count);
WriteLn ('Press Enter');
lstDirs.Free();
ReadLn();
end.Ссылка на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/25/lazarus-spisok-katalogov-s-podkatalogami/
11/24/22 09:58 pm
Поигрался с Freepascal/Lazarus
Больше по служебной необходимости, и воле случая, чем по собственному желанию. Инет отсутствовал, компы нормальные все заболели, а утилиту писать надо. Ще було, на том и писали.
Поиск файлаНаконец-то нормальный поиск файла, где маска файла работает как надо (как в DOS) и не принимает, например, расширение *.htm и *.html за одно и то же. C# мне не удалось этому очевидному решению научить, конечно, можно потом по выборке прогнать регулярное выражение, но оно тоже плохо срабатывает, упускает некоторые случаи, например, если имя файла начинается с расширения (т.е. на файл .html оно не сработает): В Lazarus все работает из коробки:  program testfind;
uses Classes, SysUtils, FileUtil;
var
lstFiles:TStringList;
i: Integer;
begin
lstFiles := TStringList.Create;
FindAllFiles(lstFiles, 'C:\Temp\Test', '*.htm', true);
i:=0;
while i < lstFiles.Count do begin
WriteLn(lstFiles[i]);
inc(i);
end;
WriteLn ('Found: ',lstFiles.Count);
WriteLn ('Press Enter');
ReadLn();
lstFiles.Free();
end.Пример и каталог с тестовыми файлами на GitHubUPD: Ссылка на мануалЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/24/poigralsya-s-freepascal-lazarus/
|