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

Надо было просто точкой перетыкать. Ищите в сторону:
.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

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

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

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

Пока что даже простой пример WMI не осилил:

{$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 имён. Потом видит что результат сравнивают:

... > ()

() это недопустимое выражение, отсюда ошибка.

А чтоб он не думал что < может быть знаком сравнения - надо добавить &. Никак по-другому шаблонные параметры подпрограммы явно не указать.

Спасибо.

Небольшие программы - как раз мой случай, и пока всё ещё без излишеств и ошибок автотипа.

Я не использую Halt или Kill, речь о системном аварийном завершении, так что поток в самый раз.

Понятно, но было бы неплохо добавить в ЧаВо или примеры программ с пояснением подобных моментов, ведь кто-то ещё обязательно споткнётся.

Мыслите правильно, однако если бы вы прошлись по примерам (это выдал поиск Notepad++ по папке):

  C:\PABCWork.NET\Samples\!MainFeatures\01_First\Amp.pas (9 hits)
	Line 1: // Пример иллюстрирует использование значка & для снятия атрибута ключевого слова
	Line 3:   &begin,&end: integer;
	Line 3:   &begin,&end: integer;
	Line 5:   &begin := 1;
	Line 6:   &end := 2;
	Line 7:   var t: System.Type := &begin.GetType; // в System.Type использовать & не надо
	Line 7:   var t: System.Type := &begin.GetType; // в System.Type использовать & не надо
	Line 8:   write(&begin,' ',&end,' ',t);
	Line 8:   write(&begin,' ',&end,' ',t);
  C:\PABCWork.NET\Samples\!MainFeatures\07_NetLibs\Reflection.pas (1 hit)
	Line 6:   var t: &Type := typeof(DateTime);
  C:\PABCWork.NET\Samples\!NewExecutors\Исполнители.pas (1 hit)
	Line 147:       var ss := SSet(s.AsEnumerable&<integer>);
  C:\PABCWork.NET\Samples\!Tutorial\04_Graphics\GrFont2.pas (1 hit)
	Line 4: const s = 'Width & Height';
  C:\PABCWork.NET\Samples\!Tutorial\11_Enums\Enum2.pas (2 hits)
	Line 7:   var t: &Type := typeof(Months);
	Line 14:   var v: &Array := Enum.GetValues(t);
  C:\PABCWork.NET\Samples\!Tutorial\17_Interfaces\Interf1.pas (2 hits)
	Line 57:   &Array.Sort(a,new SortByName);
	Line 59:   &Array.Sort(a,new SortByAge);
  C:\PABCWork.NET\Samples\!Tutorial\17_Interfaces\Interf2.pas (1 hit)
	Line 42:   writeln('Индекс Козлова = ',&Array.FindIndex(a,(s: Student)-> s.name = 'Козлов'));
  C:\PABCWork.NET\Samples\Applications\GraphApplications\FuncTransform.pas (1 hit)
	Line 28: var ArrowKeys := HSet(Key.Left, Key.Right, Key.Up, Key.Down, Key.Home, Key.&End, Key.PageUp, Key.PageDown);
  C:\PABCWork.NET\Samples\BlockFileOfT\FileDatabase\FileArray.pas (4 hits)
	Line 80:     public constructor(&file: BlockFileOf<T>);
	Line 82:       f := &file;
	Line 87:     public constructor(&file: BlockFileOf<T>; mode: System.IO.FileMode);
	Line 89:       f := &file;
  C:\PABCWork.NET\Samples\BlockFileOfT\FileDatabase\База данных на файле.pas (1 hit)
	Line 38:   [StructLayout(LayoutKind.&Explicit, Size=16)]//Значит - мы сами указываем куда ставит каждое поле
  C:\PABCWork.NET\Samples\BlockFileOfT\Сравнение скорости.pas (2 hits)
	Line 15:   [StructLayout(LayoutKind.&Explicit)]	
	Line 22:   [StructLayout(LayoutKind.&Explicit)]	
  C:\PABCWork.NET\Samples\NETLibraries\System.Array\SystemArray1.pas (4 hits)
	Line 23:   // Сортировка массива (знак & используется для того,
	Line 25:   &Array.Sort(a);
	Line 30:   &Array.Reverse(a);
	Line 35:   var i := &Array.IndexOf(a, 99);
  C:\PABCWork.NET\Samples\NumLibABC\NumLibABCTest.pas (1 hit)
	Line 345:   Writeln('*** ',&NumLibABCVersion,' ***');
  C:\PABCWork.NET\Samples\OpenCL\OpenCLABC\MatrMlt.pas (2 hits)
	Line 61:         var C_Matr := C.GetArray&<array[,] of real>(MatrW,MatrW);
	Line 83:         var V2_Arr := V2.GetArray&<array of real>(MatrW);
  C:\PABCWork.NET\Samples\OpenCL\OpenCLABC\SimpleAddition.pas (1 hit)
	Line 31:   A.GetArray&<array of integer>(10).Println;

Несколько примеров его использования таки есть… Однако:

Не смог быстро подключить Irrlicht, потому что там вроде управляемая DLL, а что с файлом LIB делать не понял. Когда-то начинал XNA, идея которой сохранилась в Моно, но выдаёт:

{$reference 'MonoGame.Framework.dll'}
uses MonoGame.Framework;
// Пространство имен 'MonoGame.Framework' не найдено

Копирование библиотек в системную папку Паскаля, Lib\ или PABCWork.NET\ не помогло.

Может есть идея или даже рабочий пример? Спасибо.

Копируйте в папку со своей программой. Всё равно без этой .dll не запустится. А системные вообще лучше не трогать.

Почитайте для начала что значит управляемый и неуправляемый. И как работают .lib файлы в C++. А то вроде человек вы умный, но без таких базовых знаний я не знаю о чём объяснять.