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


#2098

Пока что даже простой пример 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.

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

Мне турплы помогают легко решить задачу одновременного возвращения комплексного результата (например, пару или результат и флаг успеха) без рекордов, без глобальных переменных, без кодирования и прочих ухищрений или извращений. Очень гибкая возможность.


#2099

Для возвращаемого значения лучше использовать именно записи/классы. Так же можно использовать System.ValueTuple. Но все кортежи - это всё же больше для мелких программ в которых не важна производительность и красота кода.

Описание возвращаемого значения записью/классом - даёт возможность описать каждое значение и сделать их порядко-независимыми. Ну и строгая типизация .Net языка так же поможет не перепутать - чему вы присваиваете этот результат.

Разве? По моему оно у вас просто не успевает сработать, лог слишком быстро записывается.

Аварийное завершение по Halt и Process.Kill - точно моментальное. Но если вы запускаете отдельный поток - он вполне может закончить выполнятся до того как у вас программа дойдёт до Halt. (но это не точно)

Что то вроде StackOverflow - может и дать другим потокам пару секунд перед тем как убивать всё. Но я бы на это не надеялся, на разных версиях винды может быть по-разному.

.Cast&<ManagementObject>

У паскаля парсер не такой мощный как у C#.

Он видит:

Case < ManagementObject

То есть, сравнение 2 имён. Потом видит что результат сравнивают:

... > ()

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

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


#2100

Спасибо.

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

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

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


Замечания и предложения
#2101

Мыслите правильно, однако если бы вы прошлись по примерам (это выдал поиск 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;

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


#2102

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

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

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

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


#2103

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

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


#2104

В описании Irrlicht указана управляемая DLL (автоматическая / новая / как библиотека классов для Net), но Pascal Abc . Net выдал, что невозможно прочитать сборку, а я не знаю, как и можно ли работать в Паскале с Lib вообще.

Глянул несколько вариантов на подобии DGLE-master, но они вообще идут без DLL и нужна Visual Studio для компиляции с правильными параметрами.

А в Моно целый комплекс, надо бы распечатать и разобраться.

Также не исключено, что наш админ что-то обновил или подшаманил, но это уже с понедельника проверю)


#2105

Ок ладно, всё по порядку.

Неуправляемый код - это обычный машинный код. Управляемый - это файл который хоть и называется .exe или .dll - но хранит он исходники. Исходники ассемблеро-подобного языка, CIL. Этот код генерирует каждый .Net язык, и каждый .Net язык может подключать с $reference файл, хранящий CIL код (даже если он .exe!).

Из проблем которые могут возникнуть… Возможно - у .dll неправильная битность. Попробуйте {$platformtarget x86}, что ли… А то паскаль как и его родители - не любит 32 битные системы по-умолчанию. (и правильно, 32-битники в 2к19 - не люди))) )


#2106

Скорее всего ваш Моно.dll откомпилирован под x86. Поэтому и программу тоже надо компилировать под x86. Поставьте ключ компиляции {$platformtarget x86}


#2107

Системы в лаборатории старые - по 2-3 гигабайта памяти и с лицензией ещё на виндовс 7 и 8 (даже отдельно виста есть).

К сожалению, даже простенький пример с ютуба не сработал, так что буду думать.

А подскажите, Pascal Abc . Net (graph3d) умеет различать встроенную HD и внешнюю видеокарту? Спасибо.


#2108

Graph3D основан на WPF, и вот для него надо выяснять.
Но, вопрос вообще задан странно, тип видеокарты можно различить и в OpenCL. Но только какого эффекта вы от этого ожидаете? WPF то всё равно будет использовать то, что больше всего подходит для графики.


#2109

Спасибо. Вопрос не праздный и без подвоха: две одинаковые конфигурации с двумя видеокартами, на одном компьютере откомпилированный пример graph3d работает со встроенной картой (похуже картинка, особенно сетка), а на другом - выбирает внешнюю карту, а если в режиме ожидания, то будит монитор, подключенный к внешней карте (и намного мягче картинка).

Подозреваю ОС (7 и 8.1), драйвера и настройки, но подтверждения пока не нашёл.


#2110

Wpf пользуется directX. Поэтому посмотрите версию directX. И конечно же ОС может иметь значение


#2111

А в WPF разве нет какого то способа попросить его использовать что то конкретное? То что выбирается встроенная видеокарта когда есть нормальная - это вообще плохо.


#2112

Вообще-то видеокарта выбирается на уровне BIOS, если это не dual-режим.


#2113

А разве она выбирается не в зависимости от того - в разъём какой подключён монитор? Или это и есть что то типа значения “по умолчанию” в биосе?


#2114

Если в BIOS выбрана конкретная карта, вторую просто не видно. Конечно, некоторые ОС на BIOS просто плюют…


#2115

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

А как в игре Минёр (Minesweper) реализованы активные элементы - обычные AxB кнопки для Net нормально? Спасибо.


#2116

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


#2117

Кнопки будут люто лагать ибо каждая из них имеет свою область рисования и информацию из каждой надо будет скопировать на форму при каждой перерисовке. А у GDI и без того с производительностью далеко не всё гладко.

Делайте что то типа PictureBox, определяйте обработчики нажатий. А рисовать, в теории, можно и через Graphics, но это тоже немного медленно. Вообще для игр надо использовать что то типа OpenGL, DirectX и т.п.

Да, и у меня так же.