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

Ну так а в чём проблема? Присваивайте 1 обработчик всем кнопкам. Параметры у обработчика не для красоты, sender это объект - вызвавший обработчик, то есть та кнопка, на которую нажали.

Побитового округления не существует. То что в джаве - это костыль для вызова нормального округления. Используйте Round, Ceil и т.п.

У вас уже достаточно хорошо. Можно только улучшить пару моментов:

  1. Почему вы размеры в cardinal храните? xpointer.Length ведь возвращает int64. В 32-битном числе размер файла не всегда поместится.
  2. HashSet всегда проверяет, содержится ли элемент, при вызове Add. Поэтому:
    if not xList.Add(sz) then xpointer.Delete;

Насчёт несуществующих страниц msdn - нет, если бы знали - была бы issue. Говорите с какими именно типами и в каких контекстах такое происходит.

Никто не отменял .Aggregate:

begin
  SeqGen(64, BigInteger(1), x -> x * 2)
  .Aggregate((i1,i2)->i1+i2)
  .Println;
end.

С таким сразу на StackOverflow. Напишите сюда тоже если найдёте)))

uses PABCSystem в самом конце секции uses.

А вообще можно 1 раз var rng := new Random и потом rng.Next(100). По этому принципу работает PABCSystem.Random.

Я не считаю, что .Aggregate((i1,i2)->i1+i2) - это удачная замена .Sum в части повышения наглядности и краткости записи. По этой же причине долго клянчил, чтобы сделали .Prod. Как выход, если уж страшно хочется использовать запись в одну строку - да, конечно…

Программа постоянно ожидает появлениe новых файлов в заданном каталоге:

 var watcher := new FileSystemWatcher(dir2);
  watcher.EnableRaisingEvents := true;
  watcher.Filter := '*.*';
  watcher.created += NewFileCreated;
  &Application.Run();

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

Как дождаться синхронизации и закрытия нового файла перед началом работы?

Спасибо.

Ну, зависит от того - чем используется файл. Попробуйте, что ли, с FileInfo смотреть дату изменения и т.п.

Вообще эта фича больше создана для редакторов. А у они - обычно отображают сообщение “файл … изменён, загрузить заново?”. Таким образом пользователь выбирает когда загружать файл, и он то уже знает что загружать надо после того как он был дозаписан.

Я бы при каждом обновлении точки последнего изменения - проверял, даёт ли этот файл редактировать, если это какой то бекграундовый процесс…

Так как для ускорения системы в лаборатории отключено обновление последнего доступа NTFS, пришлось добавлять в список с проверкой try…catch и вызывать по таймеру.

  1. Как можно вызвать запись события в системный журнал приложений (предупреждение и ошибка)?
  2. Как выбрать русский голос на системе?
{$reference 'System.speech.dll'}
uses System.Speech;
  
begin
var голос := new System.Speech.Synthesis.SpeechSynthesizer();
голос.Rate:=-2;

// можно вывести, но как найти и выбрать русский
foreach var v in голос.GetInstalledVoices() do Println(v);
// голос.SelectVoice и голос.SelectVoiceByHint(мужской или женский), а как русский?

var x:='3,2,1';

Repeat 
 голос.SpeakAsync(X);
 Readln(x)
Until x='.'

end.

Хотел добавить звук “колокольчика” перед озвучиванием, но пока нормально, ведь SpeakAsync автоматически добавляет новые задания в очередь.

Спасибо.

Заметил в последних обновлениях PascalABC.Net вот такую опцию (Режим автозавершения кода) image
Для чего она нужна? Подробности при её использовании?

Надо было просто точкой перетыкать. Ищите в сторону:
.VoiceInfo.Culture

Обсуждения нововведений и вопросы по ним - это сюда:

Там уже начали вчера.

1 лайк

Пришлось немного поискать ответ и переделать пример:

uses System.Globalization, ...;
.
.
.
var voices = synth.GetInstalledVoices(new CultureInfo('ru-RU'));

хотя можно пройтись по индексам и выбрать:

var список=голос.GetInstalledVoices()
for var i:=1 to список.count do if список[i].VoiceInfo.Culture='ru-RU' then голос.SelectVoice(список[i].VoiceInfo.name);
1 лайк

Кстати, если что - там есть возможность без особых усилий сделать свой голос.

Там чему то скармливается текстовый файл, в котором написаны буквы, слоги и т.п. - и их транскрипция. Акцент наверняка так будет неоч, но фича прикольная и даёт больше пространства для мысли.

Спасибо! Удобно сделано.

Благодаря турплам очень легко [пере]делать под себя процедуры и функции, особенно дополняя подсказки комментариями. Работа с файлами очень гибкая и лёгкая, хотя странно, что нет функции вроде WriteEvent(источник, сообщение, категория):boolean;

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

uses System.Diagnostics;

begin
 var ev:= new EventLog('Application');
 ev.Source:= 'Application'; 
 ev.WriteEntry('ПЕРЕХОД К ФАЗЕ №2')//, EventLogEntryType.Information, 101, 1); 
end.

Не понял код с шарпа. А есть пример вывода системной информации - версия ОС, процессор, памяти всего и свободно, имя компьютера и пользователя, размеры и свободное место на диске и т.д. ? Спасибо.

Вы там осторожнее с ними, у них производительность на порядок ниже чем у передачи отдельных значений… А как вы кстати их используете? Я не очень представляю где они полезны для своих синонимов.

Я не совсем понимаю зачем вам. Я всегда использую эти методы, которые сам когда то написал:

procedure WTF(name: string; params obj: array of object) := lock name do System.IO.File.AppendAllText(name, string.Join('', obj.ConvertAll(a -> _ObjectToString(a))) + char(13) + char(10));

procedure SaveError(params obj: array of object);
begin
  (new System.Threading.Thread(()->begin
    
    (new System.Threading.Thread(()->System.Console.Beep(1000, 1000))).Start;
    if not System.IO.File.Exists('Errors.txt') then
      WTF('Errors.txt', 'Started|', StartTime);
    var b := true;
    while b do
      try
        WTF('Errors.txt', new object[2](System.DateTime.Now, '|') + obj);
        b := false;
      except
      end;
    
  end)).Start;
end;

procedure Log(params data: array of object) := WTF('Log.txt', data);

procedure Log2(params data: array of object) := WTF('Log2.txt', data);

procedure Log3(params data: array of object) := WTF('Log3.txt', data);

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

А куда там права? Как вы делаете так что их запрашивает?

Добавление ссылки в настройках переводится как $reference. Остальное переводится строчка в строчку, .Net языки жи.

+ основные данные можно получить из System.Environment.

Хотел бы узнать, какие токены, кроме ToDo, FixMe, поддерживает PascalABC.Net ?

Все что указаны в:
C:\Program Files (x86)\PascalABC.NET\Highlighting\PascalABCNET.xshd

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

Ну а я себе только ATTENTION оранжевым цветом в коментах добавлял, так что я не сильно разбираюсь как там что менять.

Но будьте осторожны, держите запасную копию ибо обновление сбрасывает этот файл к стандартным настройкам.

1 лайк

Спасибо, нашел! А как можно просмотреть количество использованных токенов в программе? Есть ли какой - нибудь “счетчик” токенов?

Будет, если вы его напишете)) Это ведь программа 20-30 строк, ничего сложного такую сделать.
А зачем собственно? Я вот не понимаю зачем это может понадобится, так что и в основные инструменты добавлять странно.

Ближайшее что мне надо было - это подсчитать кол-во //ToDo в программе, и посмотреть какие остались. Но для этих задач подходят идеально Notepad++ и его Ctrl+F. Ну и посмотреть где //ToDo остались - и Ctrl+F паскаля достаточно.

Например, в Microsoft Visual Studio 2017 сделано так:
image

Думаю, было бы удобно разместить такую панель здесь
image

Можно бы было сразу в одном месте посмотреть все планы на будущее на улучшение и исправление кода. А также посчитать, сколько задач всего осталось. Главное преимущество: Компактность и удобство, пользователь бы сам мог открыть список задач.

Ну, тогда напишите это же но в соответствующую тему. Идея таки хорошая.

Хорошо, спасибо.