Что такое код setgraphmode

Содержание

Turbo Pascal Documentation

Процедура SetGraphMode

Модуль Graph

Функция: Устанавливает для системы графический режим и
очищает экран.
Описание: SetGraphMode(режим : integer)
Примечания: Параметр «режим» должен задавать для теку-
щего драйвера устройства допустимый графический режим.
Данная процедура используется для выбора графического ре-
жима, отличного от того, который по умолчанию устанавлива-
ется процедурой InitGraph.
Процедура SetGraphMode может также использоваться вмес-
те с процедурой RestoreCrtMode для переключения между тек-
стовым и графическим режимами.
Процедура SetGraphMode сбрасывает все графические пара-
метры (текущий указаетель, палитру, цвет, область просмотра,
и т. д.) в те значения, которые назначаются для них по умол-
чанию.
Если делается попытка выбрать для текущего драйвера
устройства недопустимый режим, то функция GraphResult
возвращает значение -10 (grInvalidMode).
Определены следующие константы:

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Графический Имя Значение Столбцов Палитра Страниц
драйвер константы х строк
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
CGA CGAC0 0 320×200 C0 1
CGAC1 1 320×200 C1 1
CGAC2 2 320×200 C2 1
CGAC3 3 320×200 C3 1
CGAHi 4 640×200 2 цвета 1
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

MCGA MCGAC0 0 320×200 C0 1
MCGAC1 1 320×200 C1 1
MCGAC2 2 320×200 C2 1
MCGAC3 3 320×200 C3 1
MCGAMed 4 640×200 2 цвета 1

EGA EGALo 0 640×200 16 цветов 1
ЗЙДКк 1 640щ350 16 цветов 2

ЗЙД64 ЗЙД64Ор 0 640щ200 16 цветов 1
ЗЙД64Кк 1 640щ350 4 цвета 1

EGA- EGAMonoHi 3 640×350 2 цвета 1*

MONO EGAMonoHi 3 640×350 2 цвета 1**

HERC HercMonoHi 0 720×348 2 цвета 2

ATT400 ATT400C0 0 320×200 C0 1
ATT400C1 1 320×200 C1 1
ATT400C2 2 320×200 C2 1
ATT400C3 3 320×200 C3 1
ATT400Med 4 640×200 2 цвета 1
ATT400Hi 5 640×200 2 цвета 1

VGA VGALo 0 640×200 16 цветов 2
VGAMed 1 640×350 16 цветов 2
VGAHi 2 640×480 16 цветов 1

PC3270 PC3270Hi 0 640×200 2 цвета 1

8514 IBM8514Lo 0 640×480 256 цветов 1
8514 IBM8514Hi 0 1024×768 256 цветов 1
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

* — 64К на плате EGAMono
** — 256К на плате EGAMomo
Аналогичная процедура имеется в версии 2.0 Турбо-Си.
Ограничения: Перед обращением к данной процедуре необ-
ходимо выполнить (с нормальным завершением) вызов процедуры
InitGraph.
Прочее: См. также процедуры ClrearDevice, DetectGraph,
GetGraphMode, InitGraph, RestoreCrtMode.
Пример:

uses Graph;
var
GraphDriver : integer;
GraphMode : integer;
LowMode : integer;
HighMode : integer;
begin
GraphDriver := Detect;
InitGraph(GraphDriver, GraphMode, »);
if GraphResult <> grOk then
Halt(1);
GetModeRange(GraphDriver, LowMode, HighMode);
SetGraphMode(LowMode); < выбрать режим с низким разрешением >
Line(0, 0, GetMaxX, GetMaxY);
Readln;
CloseGraph;
end.

Что такое код setgraphmode

Отменяет выделенную графике память. Используется для определения собственной подпрограммы.

Распределяет память графике; используется для определения собственной подпрограммы.

Возвращает текущий графический режим.

Возвращает минимальный и максимальный допустимые режимы для заданного драйвера.

Инициализирует графическую систему и переводит аппаратное обеспечение в графический режим.

Устанавливает дополнительный драйвер устройства в таблице драйверов устройства BGI.

Загружает поставляемый файл векторного (штрихового) шрифта в таблицу символьных файлов BGI.

Регистрирует внешний или загруженный пользователем файл драйвера для включения во время компоновки.

Восстанавливает первоначальный (существовавший до Initgraph) режим экрана.

Задает размер внутреннего графического буфера.

Выбирает заданный графический режим, очищает экран и восстанавливает все умолчания.

Графический пакет компилятора Borland C++ обеспечивает графические драйверы для следующих графических адаптеров (и полностью совместимых с ними):

Цветной/графический адаптер (CGA);

Многоцветная графическая матрица (MCGA);

Улучшенный графический адаптер (EGA);

Видеографическая матрица (VGA);

Графический адаптер Hercules;

Графический адаптер серии AT&T 400;

Графический адаптер 3270 PC;

Графический адаптер IBM 8514.

Для запуска графической системы вы должны прежде всего вызвать функцию initgraph. Функция initgraph загружает графический драйвер и переводит систему в графический режим.

Вы можете указать для функции initgraph использование конкретного графического драйвера и конкретный режим, либо задать автообнаружение установленного видеоадаптера и выбор соответственного драйвера уже во время выполнения. Если вы задали в функции initgraph автообнаружение, то она сама вызовет функцию detectgraph для выбора графического драйвера и режима. Если вы задали в initgraph использование конкретного графического драйвера и режима, то вы сами отвечаете за физическое присутствие соответствующего аппаратного обеспечения. Если заставить initgraph пытаться использовать отсутствующее аппаратное обеспечение, то результат в таком случае непредсказуем.

После того, как графический драйвер загружен, вы можете определить его имя при помощи функции getdrivename, а число поддерживаемых драйвером режимов — при помощи функции getmaxmode. Функция getgraphmode сообщит вам, в каком графическом режиме вы находитесь в текущий момент. Имея номер режима, вы можете определить его имя при помощи функции getmodename. Вы также имеете возможность изменить графический режим при помощи функции setgraphmode и вернуть исходный видеорежим (тот, который был установлен до инициализации графики) с помощью restorecrtmode. Функция restorecrtmode вернет экран в текстовый режим, но не закроет при этом графическую систему (загруженные шрифты и драйверы останутся в памяти).

Функция graphdefaults сбрасывает установки состояния графической системы (размеры графического окна, цвет линий, цвет и шаблон заполнителя и т.д.) в исходное состояние. Функции installuserdriver и installuserfont позволяют установить в графической системе новые драйверы устройства и шрифты.

И наконец, закончив работу в графике, вы должны вызвать функцию closegraph для того, чтобы закрыть графическую систему. Функция closegraph выгружает драйвер из памяти и восстанавливает первоначальный видеорежим (через обращение к restorecrtmode).

Обычно подпрограмма initgraph загружает графический драйвер, распределяя для этого драйвера память и затем загружая туда с диска соответствующий файл .BGI. В качестве альтернативы данной схеме динамической загрузки вы можете скомпоновать нужный файл графического драйвера (или несколько таких файлов) непосредственно с файлом выполняемой программы. Для этого файл .BGI сначала преобразуется в файл .OBJ (при помощи утилиты BGIOBJ), после чего в исходный код помещается вызов функции registerbgidriver (до вызова initgraph), чтобы зарегистрировать графический драйвер(ы) в системе. При построении программы вы должны выполнить компоновку файлов .OBJ всех зарегистрированных драйверов.

После определения того, какой графический драйвер должен использоваться (посредством detectgraph) функция initgraph проверяет, был ли желаемый драйвер зарегистрирован. Если был, то initgraph обращается к зарегистрированному драйверу непосредственно в памяти. В противном случае функция initgraph распределяет память для драйвера и загружает нужный файл .BGI с диска.

Использование функции registerbgidriver относится к более сложным методам программирования, не рекомендуемым для начинающих программистов.

Во время выполнения графической системе может понадобиться распределить память для драйверов, шрифтов и внутренних буферов. При необходимости она вызывает функцию graphgetmem для распределения памяти и функцию graphfreemem для ее освобождения. По умолчанию данные

Trying to use fetch and pass in mode: no-cors

I can hit this endpoint, http://catfacts-api.appspot.com/api/facts?number=99 via Postman and it returns JSON

Additionally I am using create-react-app and would like to avoid setting up any server config.

In my client code I am trying to use fetch to do the same thing, but I get the error:

No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://localhost:3000’ is therefore not allowed access. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.

So I am trying to pass in an object, to my Fetch which will disable CORS, like so:

Interestingly enough the error I get is actually a syntax error with this function. I am not sure my actual fetch is broken, because when I remove the < mode: 'no-cors' >object, and supply it with a different URL it works just fine.

I have also tried to pass in the object < mode: 'opaque'>, but this returns the original error from above.

I belive all I need to do is disable CORS.. What am I missing?

5 Answers 5

Adding mode: ‘no-cors’ won’t magically make things work. In fact it makes things worse, because one effect it has is to tell browsers, “Block my frontend JavaScript code from looking at contents of the response body and headers under all circumstances.” Of course that’s almost never what you want.

What happens with cross-origin requests from frontend JavaScript is that browsers by default block frontend code from accessing resources cross-origin. If a site sends Access-Control-Allow-Origin in its responses, then browsers will relax that blocking and allow your code to access the response.

But if a site sends no Access-Control-Allow-Origin header in its responses, there’s no way your frontend code can directly access responses from that site. In particular, you can’t fix it by specifying mode: ‘no-cors’ (in fact that’ll ensure your frontend code can’t access the response contents).

However, one thing that will work is if you send your request through a CORS proxy, like this:

Note: if when you go to try to use https://cors-anywhere.herokuapp.com, you find it’s down, you can also easily deploy your own proxy to Heroku in literally just 2-3 minutes, with 5 commands:

After running those commands, you’ll end up with your own CORS Anywhere server running at, e.g., https://cryptic-headland-94862.herokuapp.com/. So then rather than prefixing your request URL with https://cors-anywhere.herokuapp.com , prefix it instead with the URL for your own instance; e.g., https://cryptic-headland-94862.herokuapp.com/https://example.com.

I can hit this endpoint, http://catfacts-api.appspot.com/api/facts?number=99 via Postman

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS explains why it is that even though you can access the response with Postman, browsers won’t let you access the response cross-origin from frontend JavaScript code running in a web app unless the response includes an Access-Control-Allow-Origin response header.

http://catfacts-api.appspot.com/api/facts?number=99 has no Access-Control-Allow-Origin response header, so there’s no way your frontend code can access the response cross-origin.

Your browser can get the response fine and you can see it in Postman and even in browser devtools—but that doesn’t mean browsers will expose it to your code. They won’t, because it has no Access-Control-Allow-Origin response header. So you must instead use a proxy to get it.

The proxy makes the request to that site, gets the response, adds the Access-Control-Allow-Origin response header and any other CORS headers needed, then passes that back to your requesting code. And that response with the Access-Control-Allow-Origin header added is what the browser sees, so the browser lets your frontend code actually access the response.

So I am trying to pass in an object, to my Fetch which will disable CORS

You don’t want to do that. To be clear, when you say you want to “disable CORS” it seems you actually mean you want to disable the same-origin policy. CORS itself is actually a way to do that — CORS is a way to loosen the same-origin policy, not a way to restrict it.

But anyway, it’s true you can — in just your local environment — do things like give your browser runtime flags to disable security and run insecurely, or you can install a browser extension locally to get around the same-origin policy, but all that does is change the situation just for you locally.

No matter what you change locally, anybody else trying to use your app is still going to run into the same-origin policy, and there’s no way you can disable that for other users of your app.

You most likely never want to use mode: ‘no-cors’ in practice except in a few limited cases, and even then only if you know exactly what you’re doing and what the effects are. That’s because what setting mode: ‘no-cors’ actually says to the browser is, “Block my frontend JavaScript code from looking into the contents of the response body and headers under all circumstances.” In most cases that’s obviously really not what you want.

As far as the cases when you would want to consider using mode: ‘no-cors’ , see the answer at What limitations apply to opaque responses? for the details. The gist of it is that the cases are:

In the limited case when you’re using JavaScript to make a resource from another origin the content of a

Пытается использовать режим выборки и передачи: no-cors

Я могу попасть в эту конечную точку, http://catfacts-api.appspot.com/api/facts?number=99 через Postman и он возвращает JSON

Кроме того, я использую приложение create-react-app и хотел бы избежать настройки любой конфигурации сервера.

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

Нет заголовка «Access-Control-Allow-Origin» присутствует в запрошенном ресурс. Origin ‘http://localhost:3000’ поэтому не допускается доступ. Если непрозрачный ответ отвечает вашим потребностям, установите запрос режим «no-cors» для извлечения ресурса с отключенным CORS.

Итак, я пытаюсь передать объект, к моему Fetch, который отключит CORS, например:

Интересно, что ошибка, которую я получаю, на самом деле является синтаксической ошибкой с этой функцией. Я не уверен, что мой фактический fetch сломан, потому что когда я удаляю объект и поставляю его с другим URL-адресом, он отлично работает.

Я также попытался передать объект < mode: 'opaque'>, но это возвращает исходную ошибку сверху.

Я верю всему, что мне нужно сделать, это отключить CORS.. Что мне не хватает?

mode: ‘no-cors’ добавления mode: ‘no-cors’ волшебным образом не заставит вещи работать. На самом деле это только усугубляет ситуацию, потому что один из эффектов, который он оказывает, заключается в том, чтобы сказать браузерам: «Заблокируйте мой код JavaScript на внешнем интерфейсе от просмотра содержимого тела ответа и заголовков при любых обстоятельствах». Конечно, это почти никогда не то, что вы хотите.

Что происходит с запросами кросс-источника из внешнего интерфейса JavaScript, так это то, что браузеры по умолчанию блокируют код внешнего интерфейса от доступа к ресурсам кросс-источника. Если сайт отправляет Access-Control-Allow-Origin в своих ответах, браузеры ослабят эту блокировку и позволят вашему коду получить доступ к ответу.

Но если сайт не отправляет заголовок Access-Control-Allow-Origin в своих ответах, то ваш интерфейс не сможет напрямую получить доступ к ответам с этого сайта. В частности, вы не можете исправить это, указав mode: ‘no-cors’ (фактически это гарантирует, что ваш код веб-интерфейса не сможет получить доступ к содержимому ответа).

Однако, одна вещь, которая будет работать, если вы отправите свой запрос через прокси-сервер CORS, например так:

Примечание: если вы попытаетесь использовать https://cors-anywhere.herokuapp.com и обнаружите, что он не работает, вы также можете легко развернуть свой собственный прокси-сервер в Heroku буквально за 2-3 минуты, используя 5 команд:

После выполнения этих команд вы получите собственный сервер CORS Anywhere, например, https://cryptic-headland-94862.herokuapp.com/. Поэтому вместо префикса URL-адреса вашего запроса с помощью https://cors-anywhere.herokuapp.com вместо этого используйте префикс URL-адреса для собственного экземпляра; например, https://cryptic-headland-94862.herokuapp.com/https://example.com.

Я могу поразить эту конечную точку, http://catfacts-api.appspot.com/api/facts?number=99 через Почтальона

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS объясняет, почему даже если вы можете получить доступ к ответу с помощью Postman, браузеры не позволят вам получить доступ к ответу из разных источников из кода JavaScript внешнего интерфейса выполняется в веб-приложении, если ответ не содержит заголовок ответа Access-Control-Allow-Origin .

http://catfacts-api.appspot.com/api/facts?number=99 не имеет заголовка ответа Access-Control-Allow-Origin , поэтому ваш код веб-интерфейса не может получить доступ к источнику ответа.

Ваш браузер может получить хороший ответ, и вы можете увидеть его в Postman и даже в devtools для браузера, но это не значит, что браузеры предоставят его вашему коду. Они не будут, потому что у него нет заголовка ответа Access-Control-Allow-Origin . Таким образом, вы должны вместо этого использовать прокси, чтобы получить его.

Прокси-сервер отправляет запрос на этот сайт, получает ответ, добавляет заголовок ответа Access-Control-Allow-Origin и любые другие необходимые заголовки CORS, а затем передает его обратно вашему запрашивающему коду. И этот ответ с добавленным заголовком Access-Control-Allow-Origin — это то, что видит браузер, поэтому браузер позволяет вашему коду внешнего интерфейса фактически получить доступ к ответу.

Поэтому я пытаюсь передать объект, в мой выбор, который отключит CORS

Вы не хотите этого делать. Для ясности, когда вы говорите, что хотите «отключить CORS», вы на самом деле имеете в виду, что хотите отключить политику того же происхождения. На самом деле CORS — это способ сделать это — CORS — это способ ослабить политику того же происхождения, а не способ ее ограничить.

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

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

Скорее всего, вы никогда не захотите использовать mode: ‘no-cors’ на практике, за исключением нескольких ограниченных случаев, и даже тогда, только если вы точно знаете, что делаете и каковы эффекты. Это потому, что mode: ‘no-cors’ настройки mode: ‘no-cors’ фактически говорит браузеру: «Заблокируйте мой код JavaScript внешнего интерфейса при просмотре содержимого тела и заголовков ответа при любых обстоятельствах». В большинстве случаев это явно не то, что вы хотите.

Что касается случаев, когда вы хотели бы рассмотреть возможность использования mode: ‘no-cors’ , см. Ответ в разделе » Какие ограничения применяются к непрозрачным ответам? для деталей. Суть в том, что случаи:

В ограниченном случае, когда вы используете JavaScript для создания ресурса из другого источника, содержимое

Объектно-ориентированное программирование. Модуль Graph , страница 5

Procedure SetActivePage(Page; Word) Устанавливает активную страницу для графического вывода.

Procedure SetAllPalette(var Palette) Изменяет все цвета палитры.

Procedure SetAspectRatio(XAsp, YAsp: Word) Изменяет масштабный коэффициент отношения сторон графического экрана.

Procedure SetBkColor (Color: Word) Устанавливает цвет фона.

Procedure SetColor (Color: Word) Устанавливает основной цвет, которым будет осуществляться рисование.

Procedure SetFillPattern (Pattern: FillPatternType; Color: Word) Устанавливает произвольный образец штриховки.

Procedure SetFillStyle (Pattern, Color: Word) Устанавливает образец штриховки и цвет.

Procedure SetGraphBuf Size (Size: Word) Позволяет изменить размер буфера для функций штриховки.

Procedure SetGraphMode(Mode: Integer) Устанавливает новый графический режим и очищает экран.

Procedure SetLineStyle(LineStyle, Pattern, Thickness: Word) Устанавливает толщину и стиль линии.

Procedure SetPalette(ColorNum, Color: Word) Заменяет цвет палитры с номером ColorNum на цвет Color.

Procedure SetRGBPallete(ColorNum, Red, Green, Blue: Integer) Позволяет модифицировать палитру для IBM 8514 и VGA.

Procedure SetText Justify (Horiz, Vert: Word) Устанавливает выравнивание текста, ис: пользуемое в процедурах OutText и OutTextXY.

Procedure SetTextStyle (Font, Direction, CharSize; Word) Устанавливает текущий шрифт, стиль и размер текста.

Procedure SetUserCharSize(MultX, DivX, MultY, DivY: Word) Изменяет пропорции шрифта.

Procedure SetViewPort (X1, Y1, X2, Y2: Integer; ClipOn; Boolean) Устанавливает текущее окно для графического вывода.

SetVisualPage(PageNo: Word) Устанавливает номер видимой графической страницы.

SetWriteMode(WriteMode; Integer) Устанавливает режим вывода (копирование или XOR) для линий, рисуемых процедурами DrawPoly, Line, LineRel, LineTo, Rectangle.

Procedure GetBkColor; Word Возвращает текущий фоновый цвет.

Procedure GetColor; Word Возвращает текущий цвет.

Procedure GetDriverName; String Возвращает строку с именем текущего драйвера.

Procedure GetGraphMode: Integer Возвращает текущий графический режим.

Procedure GetMaxColor; Word Возвращает максимальный цвет, который можно задать в SetColor.

Procedure GetMaxMode: Integer Возвращает номер максимального режима текущего загруженного драйвера.

Procedure GetMaxX: Integer Возвращает максимальную горизонтальную координату графического экрана.

Procedure GetMaxY; Integer Возвращает максимальную вертикальную координату графического экрана.

Procedure GetModeName(ModeNum; Word) ; String Возвращает строку с именем указанного графического режима.

Procedure GetPaletteSize: Integer Возвращает размер таблицы палитры.

Procedure GetPixel (X, Y; Integer) : Word Возвращает цвет пикселя с координатами X,Y.

Procedure GetX: Integer Возвращает координату X текущего указателя.

Procedure GetY; Integer Возвращает координату У текущего указателя.

Procedure GraphErrorMsgtErrorCode: Integer): String Возвращает строку сообщения об ошибке для заданного кода ErrorCode.

Procedure GraphResult: Integer Возвращает код ошибки для последней графической операции.

Procedure ImageSize(X1, Y1, X2, Y2: Integer) Возвращает число байт, требуемое для сохранения прямоугольной области экрана.

Procedure InstallUserDriver(Name: String; AutoDetectPtr; Pointer): Integer Устанавливает пользовательский драйвер устройства в таблицу драйверов устройств.

Procedure InstallUserFont (FontFileName: String): Integer Устанавливает новый шрифт, который не встроен в BGI систему.

Procedure RegisterBGIdriver (Driver: Pointer); Integer Регистрирует драйвер для графической системы.

Procedure RegisterBGIfont (Font: Pointer): Integer Регистрирует шрифт для графической системы.

Procedure TextHeight (TextStr: String) : Word Возвращает высоту строки в пикселах.

Procedure TextWidth(TextStr: String): Word Возвращает ширину строки в пикселах.

Описание G и M кодов для программирования ЧПУ (CNC) станков

На производстве, где работают различные станки с числовым программным управлением, используется множество различного программного обеспечения, но в большинстве случаев весь управляющий софт использует один и тот же управляющий код. Программное обеспечение для любительских станков, так же базируется на аналогичном коде. В обиходе его называют «G-код». В данном материале представлена общая информация по G-коду (G-code).

G-code это условное именование языка для программирования устройств с ЧПУ (CNC) (Числовое программное управление). Был создан компанией Electronic Industries Alliance в начале 1960-х. Финальная доработка была одобрена в феврале 1980-о года как RS274D стандарт. Комитет ИСО утвердил G-code, как стандарт ISO 6983-1:1982, Госкомитет по стандартам СССР — как ГОСТ 20999-83. В советской технической литературе G-code обозначается, как код ИСО-7 бит.

Производители систем управления используют G-code в качестве базового подмножества языка программирования, расширяя его по своему усмотрению.

Программа, написанная с использованием G-code, имеет жесткую структуру. Все команды управления объединяются в кадры — группы, состоящие из одной или более команд. Кадр завершается символом перевода строки (ПС/LF) и имеет номер, за исключеним первого кадра программы. Первый кадр содержит только один символ» %». Завершается программа командой M02 или M30.

Основные (в стандарте называются подготовительными) команды языка начинаются с буквы G:

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

Сводная таблица кодов:

Подготовительные (основные) команды / Коды Описание
G00-G04 Позиционирование инструмента
G17-G19 Переключение рабочих плоскостей (XY, XZ, YZ)
G20-G21 Не стандаризовано
G40-G44 Компенсация размера различных частей инструмента (длина, диаметр)
G53-G59 Переключение систем координат
G80-G84 Циклы сверления, нарезания резьбы
G90-G92 Переключение систем координат (абсолютная, относительная)

Таблица основных команд:

Код Описание Пример
G00 Ускоренное перемещение инструмента (холостой ход) G0 X0 Y0 Z100;
G01 Линейная интерполяция G01 X0 Y0 Z100 F200;
G02 Круговая интерполяция почасовой стрелки G02 X15 Y15 R5 F200;
G03 Круговая интерполяция против часовой стрелки G03 X15 Y15 R5 F200;
G04 Задержка на P миллисекунд G04 P500;
G10 Задать новые координаты для начала координат G10 X10 Y10 Z10;
G11 Отмена G10G11;
G15 Отмена G16G15 G90;
G16 Переключение в полярную систему координат G16 G91 X100 Y90;
G20 Режим работы в дюймовой системе G90 G20;
G21 Режим работы в метрической системе G90 G21;
G22 Активировать установленый предел перемещений (Станок невыйдет за их предел). G22 G01 X15 Y25;
G23 Отмена G22G23 G90 G54;
G28 Вернуться на референтную точку G28 G91 Z0 Y0;
G30 Поднятие по оси Z на точку смены инструмента G30 G91 Z0;
G40 Отмена компенсации размера инструмента G1 G40 X0 Y0 F200;
G41 Компенсировать радиус инструмента слева G41 X15 Y15 D1 F100;
G42 Компенсировать радиус инструмента справа G42 X15 Y15 D1 F100;
G43 Компенсировать высоту инструмента положительно G43 X15 Y15 Z100 H1 S1000 M3;
G44 Компенсировать высоту инструмента отрицательно G44 X15 Y15 Z4 H1 S1000 M3;
G53 Переключиться на систему координат станка G53 G0 X0 Y0 Z0;
G54-G59 Переключиться на заданную оператором систему координат G54 G0 X0 Y0 Z100;
G68 Поворот координат на нужный угол G68 X0 Y0 R45;
G69 Отмена G68G69;
G80 Отмена циклов сверления (G81-G84)G80 Z100;
G81 Цикл сверления G81 X0 Y0 Z-10 R3 F100;
G82 Цикл сверления сзадержкой G82 X0 Y0 Z-10 R3 P100 F100;
G83 Цикл сверления сотходом G83 X0 Y0 Z-10 R3 Q8 F100;
G84 Цикл нарезание резьбы G95 G84 X0 Y0 Z-10 R3 F1.411;
G90 Абсолютная система координат G90 G21;
G91 Относительная система координат G91 G1 X4 Y5 F100;
G94 F (подача) — в формате мм/мин. G94 G80 Z100;
G95 F (подача )- в формате мм/об. G95 G84 X0 Y0 Z-10 R3 F1.411;
G98 Отмена G99G98 G15 G90;
G99 После каждого цикла не отходить на «подходную точку» G99 G91 X10 K4;

Таблица технологических кодов:

Технологические команды языка начинаются с буквы М. Включают такие действия, как:

  • Сменить инструмент
  • Включить/выключить шпиндель
  • Включить/выключить охлаждение
  • Вызвать/закончить подпрограмму

Руководство по кросс-доменным запросам (CORS)

На прошлой неделе я внедрял в проект CORS-запросы – современный способ кросс-доменного Аякса. По следам прочитанной документации и набитых шишек подготовил небольшой мануал. Это вольный пересказ англоязычных статей, вопросов со Стека и скромный личный опыт.

Но сначала короткая предыстория. Я неравнодушен к собеседованиям, как вы, наверное, знаете. Чаще я собеседовал бекенд, т.к. к фронтенду отношусь прохладно. Но тема фронтенда обладает огромным потенциалом для оценки уровня кандидата. Я считаю, что разработчик должен в деталях понимать протокол HTTP и тонкости работы браузера.

Один из вопросов на тему фронтенда звучит банально: как на клиенте получить данные с другого домена?

Некоторые кандидаты отвечают, что проблемы нет, достаточно выполнить Аякс-запрос. И с большим удивлением узнают, что, оказывается, нельзя: сработают какие-то там политики безопасности.

Один собеседуемый заявил, что в Фаерфоксе это работает, достаточно зайти на страницу для разработчиков и что-то там переключить. Я не против такого ответа. Следующий вопрос, как вы заставите всех пользователей установить именно Фаерфокс и поменять системный флаг?

С понятием JSONP вообще беда – никто не может объяснить, как это устроено. Разработчики думают, что это обычный Аякс, только с каким-то P на конце, то ли баг, то ли фича. А это вообще ни разу не Аякс.

Аббревиатура CORS появилась недавно, и спрашивать о ней нет смысла. Этот пробел восполняет данный мануал.

Разберем вопросы из предыдущих абзацев. Действительно, слать Аякс-запросы к серверам с другим доменом запрещено на уровне браузера. Однако, в интернете полно сайтов, где значимая часть контента подгружается со сторонних серверов. Например, этот блог работает на статичном генераторе Jekyll, в котором нет комментариев. Делиться мнениями помогает сервис Discuss: лента комментариев встраивается Джаваскриптом. Получая и отправляя комментарии, вы взаимодействуете с серверами Discuss, а мой блог вообще ни при чем. Значит, слать запросы Аяксом все же можно?

Нет, здесь работает JSONP. Аббревиатура значит JSON with Padding (с подкладкой). Идея основана на лазейке в стандартах: загружать скрипты с других доменов не запрещено! Скажем, если в файле example.js на чужом сервере написано что-то вроде:

, то достаточно подгрузить его тегом

и браузер выполнит все, что внутри. В данном случае покажет окошко.

Предположим теперь, что сервер отдает не статичный файл, а генерит его динамически в зависимости от параметров. Например, мы добавляем на страницу скрипт с адресом:

В переменой method указываем, какое действие требуем от сервера. В данном случае, получить пользователя по идентификатору. Айдишку передаем следующим параметром user_id . Пусть такой пользователь найден на сервере, теперь его нужно отдать клиенту. Если просто выплюнуть объект:

, то на клиенте ничего не произойдет: объект просто считается в память. Именно поэтому передают третий параметр callback – имя функции, объявленной на клиенте, в которую нужно завернуть пользователя. С этим параметром ответ станет другим:

На клиенте отработает код, зашитый в функцию processUser : вывести данные в консоль, отрисовать виджет и т.д. Вот как работает JSONP.

Теперь, имея полную картину, нельзя не признать, что технология очень крива. Прежде всего, это лазейка, костыль. Разработчики стандартов просто не были настолько хитры, чтобы предугадать динамическое взаимодействие на уровне скриптов.

Далее, подгрузка скриптов ни разу не безопасней, чем Аякс. Целое семейство вирусов занимается тем, что добавляет на страницу браузера скрипты для отрисовки баннеров порно и казино. Когда вы подключаетесь к интернету через мобильных операторов, обсосы вставляют в HTML-трафик скрипты для отрисовки виджетов (если соединение не HTTPS).

JSONP работает только методом GET, что сводит на нет возможности REST-интерфейса. Для REST-сервисов приходится писать прокладки-прокси, т.е. множить костыли.

Добавив скрипт на страницу, в дальнейшем вы не можете отследить его судьбу. Если у Аякс-запроса есть специальные коллбеки для основных событий (начало, удачное завершение, таймаут, неудачное завершение), то у скрипта ничего такого нет. Загрузился ли он? Ответил ли сервер? Была ли ошибка? Никто не знает.

Ясно, что в 2020 году приложениям на js нужен надежный способ забирать данные с серверов. Чтобы это была законно, а не по-воровски в обход протоколов и стандартов. Таким способом стал CORS – Cross-Origin Resource Sharing , кросс-доменные запросы.

Идея проста – пусть клиент шлет Аякс-запрос к чужому серверу. Браузер добавит в запрос особые заголовки с информацией о том, что запрос с другого домена. На их основании сервер решит, как обрабатывать такой запрос, и добавит особые заголовки в ответ. Удобно, правда?

Техническая реализация несколько сложнее. Стандарт CORS различает “простые” и “сложные” запросы. Простым считается запрос методами:

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type, но только со значениями:
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

Если ваш запрос удовлетворяет этим критериям, можно слать Аякс к другому домену из любого современного браузера. При этом браузер добавит заголовок Origin с адресом страницы, откуда инициирован запрос. Подделать заголовок скриптом не удастся.

Сервер, получив на обработку подобный запрос, должен прочесть Origin и решить, как его обрабатывать. Заголовок ответа Access-Control-Allow-Origin регулирует, с какого домена разрешено запрашивать данные. Это может быть как веб-адрес, так и знак астерикса (звездочки), если разрешено всем. Несколько разных адресов через запятую, к сожалению, не поддерживаются.

и ответа с разрешением на получение данных:

Обратите внимание на такую вещь: мы намерены использовать CORS, чтобы дергать чужие API. С вероятностью почти 100% они работают по протоколу JSON , то есть принимают и отдают заголовок Content-Type: application/json . Вроде бы мелочь, но такой запрос автоматом перестает быть простым и переходит в разряд “сложных”, где схема взаимодействия иная.

Сложные запросы проходят в два этапа. Сначала браузер делает запрос по тому же урлу, но методом OPTIONS . Сервер должен ответить: какими другими методами и дополнительными заголовками (помимо стандартных) можно обращаться к этому урлу. И только получив разрешение, браузер сделает запрос на основной урл.

При этом браузер не дурак и все запомнит: если разрешили только методы GET и POST, то PUT и DELETE не сработают. Аналогично с заголовками: если помимо стандартных разрешено использовать только Authorization , то нужно передать его и ничего другого.

Пример сложного запроса:

Клиент хотел отправить Аяксом запрос методом PUT на урл http://api.alice.com/cors с сайта http://api.bob.com . Поскольку это сложный запрос, браузер запросил разрешение: типа, хочу сделать PUT на этот урл с особым заголовком X-Custom-Header . Сервер ему на это:

Или иными слвами: разрешено ходить методами GET, POST, PUT и с заголовком X-Custom-Header. Это подходит под критерии первоначального запроса. Браузер делает второй запрос куда мы намеревались вначале.

Первая стадия, когда делается запрос OPTION, официально называется preflight request . Надо сказать, такое взаимодействие весьма прозрачно отражается в браузере. Например, в консоли разработчика в Хроме видны оба запроса со всеми заголовками.

Вот такие строгости. В нашем проекте API на стороне сервера требует заголовки Version (версия операции), Authorization (авторизация по токену) и Content-Type (JSON), поэтому в ответе указываем

, иначе запрос не пройдет.

Теперь все это можно протестировать. Запускаем локальный сервер, открываем консоль Хрома и пишем:

Забавно, что заголовок Origin в этом случае будет равен https://google.com , потому что Хром считает пустой страницей главную Гугла.

Видно теперь, что даже сложная версия стандарта весьма понятна, если разобраться. На мой взгляд, она все же избыточна: может быть либо один, либо два запроса. Я бы постарался привести к общему знаменателю. Как этот ад поддерживают разработчики браузеров, не понимаю.

Несмотря на кажущуюся простоту, реализовать поддержку CORS на сервере требует времени. Первоначально я хотел использовать чужую библиотеку, но после 10 минут чтения исходного кода понял, что автор НЕПРАВИЛЬНО понял спецификацию и реализовал ее с ошибками. Лишний раз убедился, авторы сторонних библиотек – не боги, а такие же смертные. Они могут тупить, ошибаться. Лучше потратить день на чтение спеки и сделать все правильно, чем доверять первому встречному решению.

Расскажу теперь о тонкостях, с которыми столкнулся при внедрении CORS в проекте. Прежде всего, чтобы сократить число preflight-запросов, стоит либо кешировать эндпоинт OPTIONS заголовками:

, либо вообще объявить его на уровне Nginx:

Еще одна тонкость: даже если возвращаете ответ с не-положительным статусом, например, не прошла валидация или нет прав, заголовок Access-Control-Allow-Origin обязан присутствовать. Если заголовка нет, браузер решит, что CORS-запрос запрещен и не прочитает ответ.

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

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

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

Сайт, целиком посвященный CORS: описание, статьи, конфиги, примеры кода.

Set in fetch #151

Comments

Copy link Quote reply

vuhaininh commented Jun 25, 2020

Hi, how can I set in fetch because I have problem with CORS

«FETCH API cannot load
No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://localhost:8080’ is therefore not allowed access. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.»

This comment has been minimized.

Copy link Quote reply

lexich commented Jun 25, 2020

This comment has been minimized.

Copy link Quote reply

vuhaininh commented Jun 25, 2020 •

Hi,
I set: options: <
mode: ‘no-cors’
>
the fetch is completed but I do not get data in actions / reducers
Could you please fetch Data from this:

This comment has been minimized.

Copy link Quote reply

lexich commented Jun 25, 2020

When I do the same in console fetch(url, < mode: 'no-cors' >) I have error:
Refused to connect to ‘https://external.api.yle.fi/v1/programs/items.json?q=finland&mediaobject=audio&app_ s Content Security Policy .
Redux api is only lightweight wrapper above fetch api and redux. Pls write you workable code with fetch and i help you implement it. But you example above looks correct

This comment has been minimized.

Copy link Quote reply

vuhaininh commented Jun 25, 2020 •

Hi I run the following code in console and it works. Could you please check again.
fetch(«https://external.api.yle.fi/v1/programs/items.json?q=finland&mediaobject=audio&app_ >)

When I used options mode no-cors in redux-api, it can fetch but it does not return data to state.audios ( null )

This comment has been minimized.

Copy link Quote reply

vuhaininh commented Jun 25, 2020

I open a new blank tab in Chrome to run the code
fetch(«https://external.api.yle.fi/v1/programs/items.json?q=finland&mediaobject=audio&app_ >)

This comment has been minimized.

Copy link Quote reply

lexich commented Jun 25, 2020

Try this. fetch(«https://external.api.yle.fi/v1/programs/items.json?q=finland&mediaobject=audio&app_ >).then(d => d.text()).then(d => console.log(«Done», d)).catch(err => console.error(«Error», err)) Response body is empty.

This comment has been minimized.

Copy link Quote reply

vuhaininh commented Jun 25, 2020

Ok I see that.
So I am confusing how I can do to get data from that api

Может кому надо! сорри, если было. Инженерные коды для «Андроид»

Многие пользователи смартфонов и планшетов на Android даже не подозревают о существовании так называемых инженерных или сервисных кодов. Сервисные коды на смартфонах и на обычных телефонах появились намного раньше, чем вышла первая версия ОС Андроид. Они предназначены в основном для инженеров сервисных центров и продвинутых пользователей, поэтом сразу хотим предупредить читателей: если не знаете для чего этот код, то не стоит вводить, а если все же решили ввести код, то делаете на свой страх и риск. Стоит подумать прежде, чем вводить какой-либо код для «Андроид», т.к. это может привести к частичной или полной потери данных и вывести из строя само устройство. Если же Вы приняли решение использовать коды, давайте рассмотрим каждый инженерный код подробнее:

#06# — Узнать IMEI;

##4636## — Сведения и настройки;

##8351## — Voice Dialer Logging Enabled;

##4636## — Этот код может быть использован для получения интересной информации о телефоне и аккумулятора. Он показывает следующие 4 меню на экране:
— Информация о телефоне;
— Информация об аккумуляторах;
— Статистика аккумулятора;
— Статистика использования.

##7780## — Этот код сбрасывает следующие настройки на заводские:
— настройки Вашего Google-аккаунта, хранящиеся на Вашем смартфоне;
— данные и настройки системы и приложений;
— загруженные приложения.
Код НЕ удаляет:
— текущие системные приложения и приложения поставляющиеся со смарфоном;
— данные на SD карте (фото, видео и т.д.).
PS: Перед тем, как сбросить настройки смартфон запросит подтверждение, так что до самого последнего момента у Вас будет шанс передумать.

27673855# — Подумайте прежде, чем вводить этот код. Этот код используется для заводского форматирования, то есть, запускает удаление всех файлов и настроек включая те, которые хранятся во внутренней памяти. Так же он переустанавливает прошивку смартфона.
PS: После введения кода есть только один путь назад — быстро вытащить батарею и начать восстановление данных через ПК.

##34971539## — Этот код используется для получения информации о камере телефона. Он показывает следующие четыре параметра:
— Обновление прошивки камеры в образ (не пытайтесь повторить этот вариант);
— Обновление прошивки камеры на SD-карте;
— Получить версию прошивки камеры;
— Посмотреть сколько раз обновлялась прошивка.
ВНИМАНИЕ: Никогда не используйте первый вариант, в противном случае ваша камера телефона перестанет работать, и придется нести телефон в сервисный центр для переустановки прошивки камеры.

##7594## — Этот код может быть использован для изменения режима кнопки «Отбой / Вкл.Выкл.». По умолчанию, при длительном нажатии кнопки, будет показан экран с предложением выбрать любой вариант: «Переключиться в беззвучный режим», «Режим полета» или же «Выключить смартфон».
Вы можете изменить предложенные варианты используя этот код. К примеру, можно сделать так, чтобы телефон сразу же выключался, без выбора из меню нужного варианта.

##273283255663 282## — Код открывает экран копирования файлов, на котором можно сделать резервные копии своих данных (фото, аудио и т.п.)

##197328640## — Этот код можно использовать для входа в режим обслуживания. Вы можете запускать различные тесты и изменять настройки в сервисном режиме для WLAN, GPS и Bluetooth;

##232339## или ##526## или ##528## — WLAN (используйте кнопку «Меню» для запуска различных тестов);

##232338## — показывает MAC адрес WiFi;

##1575## — Еще один тест GPS;

##232337## — Показывает адрес устройства Bluetooth;

Коды для запуска различных заводских тестов:
##0283## — Пакетные Loopback;

##0842## — Устройство тест (тест вибрации и подсветки тест);

##2663## — Сенсорный экран, версия;

##2664## — Сенсорный экран, тест;

Это основные коды для «Андроид», которые могут понадобится продвинутому пользователю смартфона. Еще раз повторимся: не вводите коды, если не уверены в их предназначении! Но для решения некоторых проблем в работе устройства на «Андроид» эти коды крайне полезны.

Дубликаты не найдены

там немного опечатался по невнимательности, пикабу отказывает мне в редактировании!
Многие пользователи смартфонов и планшетов на Android даже не подозревают о существовании так называемых инженерных или сервисных кодов. Сервисные коды на смартфонах и на обычных телефонах появились намного раньше, чем вышла первая версия ОС Андроид. Они предназначены в основном для инженеров сервисных центров и продвинутых пользователей, поэтом сразу хотим предупредить читателей: если не знаете для чего этот код, то не стоит вводить, а если все же решили ввести код, то делаете на свой страх и риск. Стоит подумать прежде, чем вводить какой-либо код для «Андроид», т.к. это может привести к частичной или полной потери данных и вывести из строя само устройство. Если же Вы приняли решение использовать коды, давайте рассмотрим каждый инженерный код подробнее:

*#06# — Узнать IMEI;

*#*#4636#*#* — Сведения и настройки;

*#*#8351#*#* — Voice Dialer Logging Enabled;

*#*#4636#*#* — Этот код может быть использован для получения интересной информации о телефоне и аккумулятора. Он показывает следующие 4 меню на экране:
— Информация о телефоне;
— Информация об аккумуляторах;
— Статистика аккумулятора;
— Статистика использования.

*#*#7780#*#* — Этот код сбрасывает следующие настройки на заводские:
— настройки Вашего Google-аккаунта, хранящиеся на Вашем смартфоне;
— данные и настройки системы и приложений;
— загруженные приложения.
Код НЕ удаляет:
— текущие системные приложения и приложения поставляющиеся со смарфоном;
— данные на SD карте (фото, видео и т.д.).
PS: Перед тем, как сбросить настройки смартфон запросит подтверждение, так что до самого последнего момента у Вас будет шанс передумать.

*2767*3855# — Подумайте прежде, чем вводить этот код. Этот код используется для заводского форматирования, то есть, запускает удаление всех файлов и настроек включая те, которые хранятся во внутренней памяти. Так же он переустанавливает прошивку смартфона.
PS: После введения кода есть только один путь назад — быстро вытащить батарею и начать восстановление данных через ПК.

*#*#34971539#*#* — Этот код используется для получения информации о камере телефона. Он показывает следующие четыре параметра:
— Обновление прошивки камеры в образ (не пытайтесь повторить этот вариант);
— Обновление прошивки камеры на SD-карте;
— Получить версию прошивки камеры;
— Посмотреть сколько раз обновлялась прошивка.
ВНИМАНИЕ: Никогда не используйте первый вариант, в противном случае ваша камера телефона перестанет работать, и придется нести телефон в сервисный центр для переустановки прошивки камеры.

*#*#7594#*#* — Этот код может быть использован для изменения режима кнопки «Отбой / Вкл.Выкл.». По умолчанию, при длительном нажатии кнопки, будет показан экран с предложением выбрать любой вариант: «Переключиться в беззвучный режим», «Режим полета» или же «Выключить смартфон».
Вы можете изменить предложенные варианты используя этот код. К примеру, можно сделать так, чтобы телефон сразу же выключался, без выбора из меню нужного варианта.

*#*#273283*255*663 282*#*#* — Код открывает экран копирования файлов, на котором можно сделать резервные копии своих данных (фото, аудио и т.п.)

*#*#197328640#*#* — Этот код можно использовать для входа в режим обслуживания. Вы можете запускать различные тесты и изменять настройки в сервисном режиме для WLAN, GPS и Bluetooth;

*#*#232339#*#* или *#*#526#*#* или *#*#528#*#* — WLAN (используйте кнопку «Меню» для запуска различных тестов);

*#*#232338#*#* — показывает MAC адрес WiFi;

*#*#1575#*#* — Еще один тест GPS;

*#*#232331#*#* — Bluetooth- тест;

*#*#232337#*# — Показывает адрес устройства Bluetooth;

Коды для запуска различных заводских тестов:
*#*#0283#*#* — Пакетные Loopback;

*#*#0673#*#* или *#*#0289#*#* — Мелодия-тест;

*#*#0842#*#* — Устройство тест (тест вибрации и подсветки тест);

*#*#2663#*#* — Сенсорный экран, версия;

*#*#2664#*#* — Сенсорный экран, тест;

*#*#0588#*#* — Датчик движения;

*#*#3264#*#* — RAM версия.

Это основные коды для «Андроид», которые могут понадобится продвинутому пользователю смартфона. Еще раз повторимся: не вводите коды, если не уверены в их предназначении! Но для решения некоторых проблем в работе устройства на «Андроид» эти коды крайне полезны.

Иллюстрированный самоучитель по Turbo Pascal

Процедуры и функции

Чаще всего причиной возникновения ошибки при обращении к процедуре InitGraph является неправильное указание местоположения файла с драйвером графического адаптера (например, файла CGA.BGI для адаптера CGA). Настройка на местоположение драйвера осуществляется заданием маршрута поиска нужного файла в имени драйвера при вызове процедуры InitGraph. Если, например, драйвер зарегистрирован в подкаталоге DRIVERS каталога PASCAL на диске D, то нужно использовать вызов:

Замечание
Во всех следующих примерах процедура InitGraph вызывается с параметром Driver в виде пустой строки. Такая форма обращения будет корректна только в том случае, когда нужный файл графического драйвера находится в текущем каталоге. Для упрощения повторения примеров скопируйте файл, соответствующий адаптеру Вашего ПК, в текущий каталог
.

Процедура CloseGraph

Завершает работу адаптера в графическом режиме и восстанавливает текстовый режим работы экрана. Заголовок:

Процедура RestoreCRTMode

Служит для кратковременного возврата в текстовый режим. В отличие от процедуры CloseGraph не сбрасываются установленные параметры графического режима и не освобождается память, выделенная для размещения графического драйвера. Заголовок:

Функция GetGraphMode

Возвращает значение типа Integer, в котором содержится код установленного режима работы графического адаптера. Заголовок:

Процедура SetGraphMode

Устанавливает новый графический режим работы адаптера. Заголовок:

Здесь Mode – код устанавливаемого режима.

Следующая программа иллюстрирует переход из графического режима в текстовый и обратно:

В этом примере для вывода сообщений как в графическом, так и в текстовом режиме используется стандартная процедура WriteLn. Если Ваш ПК оснащен нерусифицированным адаптером CGA, вывод кириллицы в графическом режиме таким способом невозможен, в этом случае замените соответствующие сообщения так, чтобы использовать только латинские буквы.

Илон Маск рекомендует:  Шаблоны в object pascal
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL