Ну, зависит от того - чем используется файл. Попробуйте, что ли, с FileInfo смотреть дату изменения и т.п.
Вообще эта фича больше создана для редакторов. А у они - обычно отображают сообщение “файл … изменён, загрузить заново?”. Таким образом пользователь выбирает когда загружать файл, и он то уже знает что загружать надо после того как он был дозаписан.
Я бы при каждом обновлении точки последнего изменения - проверял, даёт ли этот файл редактировать, если это какой то бекграундовый процесс…
Так как для ускорения системы в лаборатории отключено обновление последнего доступа NTFS, пришлось добавлять в список с проверкой try…catch и вызывать по таймеру.
Как можно вызвать запись события в системный журнал приложений (предупреждение и ошибка)?
Как выбрать русский голос на системе?
{$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 автоматически добавляет новые задания в очередь.
var список=голос.GetInstalledVoices()
for var i:=1 to список.count do if список[i].VoiceInfo.Culture='ru-RU' then голос.SelectVoice(список[i].VoiceInfo.name);
Кстати, если что - там есть возможность без особых усилий сделать свой голос.
Там чему то скармливается текстовый файл, в котором написаны буквы, слоги и т.п. - и их транскрипция. Акцент наверняка так будет неоч, но фича прикольная и даёт больше пространства для мысли.
Благодаря турплам очень легко [пере]делать под себя процедуры и функции, особенно дополняя подсказки комментариями. Работа с файлами очень гибкая и лёгкая, хотя странно, что нет функции вроде 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.
Все что указаны в: C:\Program Files (x86)\PascalABC.NET\Highlighting\PascalABCNET.xshd
Кроме всего прочего, этот файл можно и самому дописывать. @Kotov в этом особо приуспел, поменял цвет практически всего в IDE. И ключевых слов там и т.п.
Ну а я себе только ATTENTION оранжевым цветом в коментах добавлял, так что я не сильно разбираюсь как там что менять.
Но будьте осторожны, держите запасную копию ибо обновление сбрасывает этот файл к стандартным настройкам.
Будет, если вы его напишете)) Это ведь программа 20-30 строк, ничего сложного такую сделать.
А зачем собственно? Я вот не понимаю зачем это может понадобится, так что и в основные инструменты добавлять странно.
Ближайшее что мне надо было - это подсчитать кол-во //ToDo в программе, и посмотреть какие остались. Но для этих задач подходят идеально Notepad++ и его Ctrl+F. Ну и посмотреть где //ToDo остались - и Ctrl+F паскаля достаточно.
Например, в Microsoft Visual Studio 2017 сделано так:
Думаю, было бы удобно разместить такую панель здесь
Можно бы было сразу в одном месте посмотреть все планы на будущее на улучшение и исправление кода. А также посчитать, сколько задач всего осталось. Главное преимущество: Компактность и удобство, пользователь бы сам мог открыть список задач.
{$reference 'system.management.dll'}
uses System.Management;
begin
var query:= 'SELECT * FROM Win32_OperatingSystem';
var searcher:= new ManagementObjectSearcher(query);
var info:= searcher.Get().Cast<ManagementObject>().FirstOrDefault();
var caption:= info.Properties['Caption'].Value.ToString();
var version:= info.Properties['Version'].Value.ToString();
var spMajorVersion:= info.Properties['ServicePackMajorVersion'].Value.ToString();
var spMinorVersion:= info.Properties['ServicePackMinorVersion'].Value.ToString();
end.
А идея асинхронного лога - это зачёт, почему-то сам не подумал, что даже аварийное завершение программы будет ждать поток.
Мне турплы помогают легко решить задачу одновременного возвращения комплексного результата (например, пару или результат и флаг успеха) без рекордов, без глобальных переменных, без кодирования и прочих ухищрений или извращений. Очень гибкая возможность.
Для возвращаемого значения лучше использовать именно записи/классы. Так же можно использовать System.ValueTuple. Но все кортежи - это всё же больше для мелких программ в которых не важна производительность и красота кода.
Описание возвращаемого значения записью/классом - даёт возможность описать каждое значение и сделать их порядко-независимыми. Ну и строгая типизация .Net языка так же поможет не перепутать - чему вы присваиваете этот результат.
Разве? По моему оно у вас просто не успевает сработать, лог слишком быстро записывается.
Аварийное завершение по Halt и Process.Kill - точно моментальное. Но если вы запускаете отдельный поток - он вполне может закончить выполнятся до того как у вас программа дойдёт до Halt. (но это не точно)
Что то вроде StackOverflow - может и дать другим потокам пару секунд перед тем как убивать всё. Но я бы на это не надеялся, на разных версиях винды может быть по-разному.
.Cast&<ManagementObject>
У паскаля парсер не такой мощный как у C#.
Он видит:
Case < ManagementObject
То есть, сравнение 2 имён. Потом видит что результат сравнивают:
... > ()
() это недопустимое выражение, отсюда ошибка.
А чтоб он не думал что < может быть знаком сравнения - надо добавить &. Никак по-другому шаблонные параметры подпрограммы явно не указать.