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

У меня, к сожалению, эта функция сбрасывается после каждого закрытия паскаля, и начинает работать только для новой переменной, может из-за того что стоит win10. И ещё не знаете где найти исходники GraphABC для PascalABC?

Если у вас анализатор кода ломается - надо найти минимальный набор действий ведущий к его поломке и залить это в issues, а не мирится. И я сомневаюсь что вин10 виновата, это в более старых версиях, как XP, может быть что то, и то вряд ли.

Посмотрел только что, там свойства A, R, G и B, так и называются. Доступны только для чтения.

Исходники всех стандартных модулей есть в папке

Именно для того что без .net - не представляю, в интернете ищите, где то, или поиском в проводнике… А для .net в

C:\Program Files (x86)\PascalABC.NET\LibSource

1 лайк

Про 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?

1 лайк

В PictureBox-е, не заметил такой функции в PictureBox1.CreateGraphics. поэтому пробую подогнать, но не получается :frowning_face:.

В PABC есть FloodFill.

В общем мне нужна функция заливки, как в paint.

Graphics Class

1 лайк

Я что то смог написать, для 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 цвета, там только для фигур и регионов.

1 лайк

Я кинул, чтобы он ознакомился. А реализовывать FloodFill - уже его задача.

1 лайк

Есть это:

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.

1 лайк

Прошу помощи, как создать ярлык на рабочем столе с определённым названием и путём к файлу?

А не подскажите, как работать с *.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, там вам ответят более компетентные специалисты.

1 лайк

Знаете как масштабировать 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.

Надо пояснять что то из этого кода?

1 лайк

А что не просто так:

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.
1 лайк