Интересно, то есть учитель требует обязательно код паскале без .net? И у меня на информатике, к примеру, были задания типо “нарисуйте график”, при чём учительница заставляла делать разметку циклами. У вас есть на этот случай план? И ещё, библиотека System.Drawing.dll в паскале без .net вообще доступна?
begin
var i := 5;
var s := $'i*2 and +1 = {i*2+1}';
writeln(s);
end.
Выведет i*2 and +1 = 11.
По сути, вторая строчка переводится компилятором в var s := string.Format('i*2 and +1 = {0}',i*2+1);, вот только выглядит читабельнее.
В {} ставится выражение, его результат превратит в текст и вставит в строку. Если у вас не компилируется - обновите паскаль, это ооочень недавно добавили.
Ещё, поэтому же, нет поддержки анализатора кода (Ctrl+Space, подсказка по нажатию точки и т.п.), но добавить собираются.
Так, стоп, они совпадают? Я пытался сделать остановку программы, но vk_escape небыло. И нет, он не “офигел”. Спокойно считает что PascalABC и pascalABC.NET просто 2 версии 1 проекта. Ещё и обиделся когда я его поправил.
@Sun_Serega у нас в школе Linux стоит. PABC через неэмулятор wine работает. Они не захотели заморачиваться. Если так будет, то буду писать ручками, это задумывается для облегчения “тупого набора” которого у нас много. а dll для меня остаются пока загадкой.
Нет (и никогда не существовало PascalABC. Был (и закрыт десять с лишним лет назад Pasacal ABC, фактически копирующий синтаксис Turbo Pascal 7.0, за исключением графической библиотеки.
PascalABC.NET и Pascal ABC совершенно разные проекты, более того, из-за особенностей платформы .NET совместимость языка с Turbo Pascal была снижена вплоть до запрета некоторых операций.
На официальном сайте сказано, что
[30.08.17] Вышла версия 3.3.0.1531
Новый модуль 3D-графики Graph3D
Новый модуль растровой графики GraphWPF
Модуль GraphABC объявляется устаревшим.
Он будет входить в последующие версии, но обновляться не будет
Покажите это своему преподавателю. А заодно посмотрите эти шесть презентаций с главной страницы официального сайта.
А с каких это пор и в каком продукте изменения в версиях пишутся в Справке? Для этого и существует официальный сайт, на котором в целом отслеживается версионность. ЧТО НОВОГО
А презентация - это чтобы быстрее понять особенности языка и их использование. А не тупо утверждать (неизвестно на каком основании), что два разных проекта на самом деле - просто две версии.
Есть 2 функции Color.FromARGB. Одна принимает 1 число на 4 байта, а другая 4 числа по 1 байту. Первая быстрее работает. Ну а если в вашем случае нету функции первого типа - поставьте точку после DrawPen.Color, вам покажет всё что есть в Color. Почитайте описания - найдёте.
У меня, к сожалению, эта функция сбрасывается после каждого закрытия паскаля, и начинает работать только для новой переменной, может из-за того что стоит win10. И ещё не знаете где найти исходники GraphABC для PascalABC?
Если у вас анализатор кода ломается - надо найти минимальный набор действий ведущий к его поломке и залить это в issues, а не мирится. И я сомневаюсь что вин10 виновата, это в более старых версиях, как XP, может быть что то, и то вряд ли.
Посмотрел только что, там свойства A, R, G и B, так и называются. Доступны только для чтения.
Исходники всех стандартных модулей есть в папке
Именно для того что без .net - не представляю, в интернете ищите, где то, или поиском в проводнике… А для .net в
Проверил, у меня тоже ломается. Вин 7. Попробуйте скопировать весь проект и в копии удалять по 1 элементу, пока не останется только то что вызывает ошибку.
В смысле в PictureBox-e заливку? Или в GraphABC в паскале без .net?
{$reference System.Windows.Forms.dll}
{$reference System.Drawing.dll}
uses System.Windows.Forms;
uses System.Drawing;
function ExtFloodFill(hdc: System.IntPtr; x, y: integer; color: integer; filltype: cardinal): boolean;
external 'Gdi32.dll' name 'ExtFloodFill';
function GetDC(hWnd: System.IntPtr): System.IntPtr;
external 'User32.dll' name 'GetDC';
function CreateSolidBrush(c: integer): System.IntPtr;
external 'Gdi32.dll' name 'CreateSolidBrush';
function SelectObject(hdc, hgdiobj: System.IntPtr): System.IntPtr;
external 'Gdi32.dll' name 'SelectObject';
function DeleteObject(obj: System.IntPtr): boolean;
external 'Gdi32.dll' name 'DeleteObject';
function CreateCompatibleDC(obj: System.IntPtr): System.IntPtr;
external 'Gdi32.dll' name 'CreateCompatibleDC';
function FloodFill(self: Control; x, y: integer; c_from, c_to: Color): boolean; extensionmethod;
begin
var win_c_from := ColorTranslator.ToWin32(c_from);
var win_c_to := ColorTranslator.ToWin32(c_to);
lock self do
begin
var gr := self.CreateGraphics;
var hdc := gr.GetHdc;
var hBrush := CreateSolidBrush(win_c_to);
var hOldBrush := SelectObject(hdc, hBrush);
Result := ExtFloodFill(hdc, x, y, win_c_from, $00000001);
SelectObject(hdc, hOldBrush);
DeleteObject(hBrush);
gr.ReleaseHdc();
DeleteObject(hdc);
end;
end;
begin
var f := new System.Windows.Forms.Form;
f.Bounds := new Rectangle(100, 100, 400, 400);
var pb := new System.Windows.Forms.PictureBox;
pb.Bounds := new Rectangle(100, 100, 200, 200);
f.Controls.Add(pb);
(new System.Threading.Thread(()->System.Windows.Forms.Application.Run(f))).Start();
Sleep(1000);
pb.CreateGraphics.FillRectangle(new SolidBrush(Color.Black), 50, 50, 100, 100);
Sleep(1000);
pb.FloodFill(75, 75, Color.Black, Color.Red);
end.
Но в этой процедуре FloodFill есть 1 огромная проблема - утечка памяти. ~36 байт за 1 вызов уходит в небытие. Какой то из использованных там ресурсов не высвобождается.
А ещё всё будет стираться после сворачивания окна.
Он же сказал, проблема в том - что в System.Drawing.Graphics нету функции заливки для области 1 цвета, там только для фигур и регионов.