У меня, к сожалению, эта функция сбрасывается после каждого закрытия паскаля, и начинает работать только для новой переменной, может из-за того что стоит win10. И ещё не знаете где найти исходники GraphABC для PascalABC?
Если у вас анализатор кода ломается - надо найти минимальный набор действий ведущий к его поломке и залить это в issues, а не мирится. И я сомневаюсь что вин10 виновата, это в более старых версиях, как XP, может быть что то, и то вряд ли.
Посмотрел только что, там свойства A
, R
, G
и B
, так и называются. Доступны только для чтения.
Исходники всех стандартных модулей есть в папке
Именно для того что без .net - не представляю, в интернете ищите, где то, или поиском в проводнике… А для .net в
C:\Program Files (x86)\PascalABC.NET\LibSource
Про win10 точно, проверил на 7-ке. Может я что то не поставил(.net стоит). Ломается на моём проекте и всё. Вот скриншот
PictureBox1 объявлен, но в списке его нет. Может проверите мой проект на вашем ПК.
DrawN2.rar (104,2 КБ)
И ещё в GraphABC
есть процедура
FloodFill
procedure Picture.FloodFill(x, y: integer; c: Color);
var
hdc, hBrush, hOldBrush: IntPtr;
begin
var borderColor: Color := GetPixel(x, y);
var bc := ColorTranslator.ToWin32(borderColor);
var cc := ColorTranslator.ToWin32(c);
Monitor.Enter(f);
hdc := gbmp.GetHDC();
hBrush := CreateSolidBrush(cc);
hOldBrush := SelectObject(hdc, hBrush);
ExtFloodFill(hdc, x, y, bc, 1);
SelectObject(hdc, holdBrush);
DeleteObject(hBrush);
gbmp.ReleaseHdc();
DeleteObject(hdc);
Monitor.Exit(f);
end;
Она заполняет область ограниченную, например, линиями. Как её подогнать под мой проект?.
Проверил, у меня тоже ломается. Вин 7. Попробуйте скопировать весь проект и в копии удалять по 1 элементу, пока не останется только то что вызывает ошибку.
В смысле в PictureBox-e заливку? Или в GraphABC в паскале без .net?
В PictureBox-е, не заметил такой функции в PictureBox1.CreateGraphics.
поэтому пробую подогнать, но не получается .
В PABC есть FloodFill.
В общем мне нужна функция заливки, как в paint.
Я что то смог написать, для PictureBox
-а:
{$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 цвета, там только для фигур и регионов.
Я кинул, чтобы он ознакомился. А реализовывать FloodFill - уже его задача.
Есть это:
if pascal then begin
writeln(pas, '//Textout');
writeln(pas, 'setFontColor(RGB(',mtbColR.Text.ToInteger,',', mtbColG.Text.ToInteger,',', mtbColB.Text.ToInteger,'));');
writeln(pas, 'setFontSize(', StrToFloat(mtbPenW.Text), ');');
writeln(pas, 'TextOut(', mtbPosX.Text.ToInteger,',', mtbPosY.Text.ToInteger,',', mtbPosX1.Text,');');
end;
Надо что-бы с mtbPosX1.Text
выводились в файл символы '
.
И кстати после набора System.Drawing анализатор резко исправляется.
Символ '
это char(39)
. Так же его можно писать как #39
.
Прошу помощи, как создать ярлык на рабочем столе с определённым названием и путём к файлу?
А не подскажите, как работать с *.doc, текст, картинки вставлять?
Подключите Microsoft.Office.Interop.Word.dll
и ищите в пространстве имён Microsoft.Office.Interop.Word
то что вам надо.
{$reference Microsoft.Office.Interop.Word.dll}
begin
//Microsoft.Office.Interop.Word;
end.
На форуме было несколько примеров работы с Exсel… По крайней мере создание переменной, соответствующий файлу вёрда, должно быть примерно такое же как с Excel-эм. Вот поиск в разделе PABC.Net по слову Excel. Документация по пространству имён Microsoft.Office.Interop.Word
находится тут. Попробуйте ещё задавать вопросы по этой теме на StackOverflow, там вам ответят более компетентные специалисты.
Знаете как масштабировать pictureBox
без перерисовки?
Есть система координат
Нужно “приблизить” изображение.
С какими типами библиотек работает external
? Возможно ли как то подключить .dll написанную на C++? На C#?
только нативные dll. managed-сборки подключаются с помощью reference
Есть последовательность двухкомпонентных кортежей, есть ли метод перевода этой последовательности в последовательность элементов из этих кортежей?
Если я правильно понял что вы имели в виду, можно использовать SelectMany
:
function ToSeq<T>(self: (T, T)): sequence of T; extensionmethod;
begin
yield self.Item1;
yield self.Item2;
end;
begin
var s1: sequence of (integer, integer);
s1 := Seq(
(0, 1),
(2, 3),
(4, 5),
(6, 7)
);
var s2 := s1.SelectMany(t->t.ToSeq);
s2.Print;
end.
Надо пояснять что то из этого кода?
А что не просто так:
begin
var s1:=Seq((0, 1),(2, 3),(4, 5),(6, 7));
var s2:=s1.SelectMany(t->Seq(t[0],t[1]));
s2.Print
end.