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

Мы не ищем легких путей! :stuck_out_tongue_winking_eye: А кроме того, это не похоже на С/С++/С#/Java …

Медленно привыкаем к хорошему :slight_smile:

Здравствуйте. Не подскажите как использовать System.Drawing.Pen

System.Drawing.Pen это тип для рисования линий и контуров в GDI:

{$reference System.Drawing.dll}

begin
  //создаём картинку
  var b := new System.Drawing.Bitmap(100, 100);
  var gr := System.Drawing.Graphics.FromImage(b);
  //рисуем первый прямоугольник
  var pen := new System.Drawing.Pen(System.Drawing.Color.FromArgb($FFFF0000));//создаём новый Pen красного цвета
  gr.DrawRectangle(pen, new System.Drawing.Rectangle(10, 40, 80, 20));//все "Graphics.Draw..." рисуют контуры, а "Graphics.Fill..." заполненные объекты
  //рисует второй прямоугольник
  pen.Color := System.Drawing.Color.FromArgb($FF00FF00);
  pen.DashStyle := System.Drawing.Drawing2D.DashStyle.DashDotDot;//в этот раз поставим стиль линии на штрих-точка-точка
  gr.DrawRectangle(pen, new System.Drawing.Rectangle(40, 10, 20, 80));
  //сохраняем в файл что получилось
  b.Save('out.bmp');
end.

На выходе получаем:

out

Станица msdn.

1 лайк

Вопрос: Что за тип single? Как Integer превратить в single?

single=float(число с плавающей точкой на 4 байта). Просто паскалевское название.

Как Integer превратить в single?

begin
  var i: integer := 5;
  var s1: single := single(i);//явное преобразование
  var s2: single := i;//неявное преобразование
end.

Любая учебная программа (и не только школьная) объясняет такое в 1 из первых уроков, вам стоит для начала хоть что то выучить перед тем как вопросы задавать.

В школе у нас преподаватели по информатике грубо говоря не очень. По этой программе я знаю только real, integer и array[0..n] of ..., мы даже boolean не проходили. И это за ~ 1 год обучения паскалю. Ну это отговорки.

graph.FillRectangle(bru, xx1, yy1, h, w);

Это не хочет работать. Нет перегруженной подпрограммы с такими типами параметров xx1,yy1,h,w - single.

Вот как, сочувствую (а я думал это у меня информатику плохо преподавали :confused:)

Могу тогда посоветовать почитать всю справку и посмотреть примеры (всё это есть под кнопкой Помощь в IDE).

А это откуда? (из какого модуля)

В общем я лучше Вам скину полную версию

Код
unit Unit1;

interface

uses System, System.Drawing, System.Windows.Forms;

type
  Form1 = class(Form)
    procedure button1_Click(sender: Object; e: EventArgs);
    procedure button3_Click(sender: Object; e: EventArgs);
  {$region FormDesigner}
  private 
    {$resource Unit1.Form1.resources}
    button1: Button;
    label1: &Label;
    label2: &Label;
    Px1: TextBox;
    label3: &Label;
    label4: &Label;
    Px2: TextBox;
    Py2: TextBox;
    Py1: TextBox;
    rad: TextBox;
    button3: Button;
    button2: Button;
    label5: &Label;
    button4: Button;
    Zapoln: CheckBox;
    RGB: RadioButton;
    ARGB: RadioButton;
    label7: &Label;
    label8: &Label;
    label9: &Label;
    label10: &Label;
    ColA: TextBox;
    ColR: TextBox;
    ColG: TextBox;
    ColB: TextBox;
    pictureBox1: PictureBox;
    button5: Button;
    button6: Button;
    WidPen: TextBox;
    label11: &Label;
    label6: &Label;
    {$include Unit1.Form1.inc}
  {$endregion FormDesigner}
  public 
    constructor;
    begin
      InitializeComponent;
    end;
  end;

implementation

procedure Form1.button1_Click(sender: Object; e: EventArgs);
var
  x1, x2, y1, y2, a, r, g, b: integer;
begin
  
  //Точки
  x1 := StrToInt(Px1.Text);
  y1 := StrToInt(Py1.Text);
  x2 := StrToInt(Px2.Text);
  y2 := StrToInt(Py2.Text);
  
  //Инициализация графики
  var graph := pictureBox1.CreateGraphics;
  var pen := new System.Drawing.Pen(System.Drawing.Color.FromArgb(255, 255, 255));
  pen.width := 1;
  
  if RGB.Checked then begin
    r := StrToInt(ColR.Text);
    g := StrToInt(ColG.Text);
    b := StrToInt(ColB.Text);
    pen.Color := System.Drawing.Color.FromArgb(r, g, b);
  end;
  
  if ARGB.Checked then begin
    a := StrToInt(ColA.Text);
    r := StrToInt(ColR.Text);
    g := StrToInt(ColG.Text);
    b := StrToInt(ColB.Text);
    pen.Color := System.Drawing.Color.FromArgb(a, r, g, b);
  end;
  
  //Рисуем
  pen.Width := StrToInt(WidPen.Text);
  graph.DrawLine(pen, x1, y1, x2, y2);
  
end;

procedure Form1.button3_Click(sender: Object; e: EventArgs);
var
  x1, x2, y1, y2, a, r, g, b: integer;
    //single
  xx1, yy1, h, w: single;
begin
  x1 := StrToInt(Px1.Text);
  y1 := StrToInt(Py1.Text);
  x2 := StrToInt(Px2.Text);
  y2 := StrToInt(Py2.Text);
  
  //Цвета, кисть, и тд
  var graph := pictureBox1.CreateGraphics;
  var pen := new System.Drawing.Pen(System.Drawing.Color.FromArgb(255, 255, 255));
  var bru := new System.Drawing.Pen(System.Drawing.Color.FromArgb(255, 255, 255));
  pen.width := 1;
  
  if RGB.Checked then begin
    r := StrToInt(ColR.Text);
    g := StrToInt(ColG.Text);
    b := StrToInt(ColB.Text);
    pen.Color := System.Drawing.Color.FromArgb(r, g, b);
    bru.Color := System.Drawing.Color.FromArgb(r, g, b);
  end;
  
  if ARGB.Checked then begin
    a := StrToInt(ColA.Text);
    r := StrToInt(ColR.Text);
    g := StrToInt(ColG.Text);
    b := StrToInt(ColB.Text);
    pen.Color := System.Drawing.Color.FromArgb(a, r, g, b);
    bru.Color := System.Drawing.Color.FromArgb(a, r, g, b);
  end;
  
  //Рисуем
  pen.Width := StrToInt(WidPen.Text);
  
  if Zapoln.Checked then graph.DrawRectangle(pen, x1, y1, x2, y2)
  else begin
    var xx := Abs(x2 - x1);
    var yy := Abs(y2 - y1);
    
    xx1 := x1;yy1 := y1;
    h := xx;w := yy;
    graph.FillRectangle(bru, xx1, yy1, h, w);
  end;
end;

end.

Давайте тогда уже .zip или .rar всего проекта, тут 1 файлом не обойдёшься, слишком много зависимостей с другими файлами + без .pabcproj файла ничего компилироваться не будет.

Draw.rar (28,9 КБ)

У меня компилируется без проблем.

Странно. Может с .NET проблемы переустановить?

А, ну так вы ведь добавили .NETBrush и теперь компилируется. А вообще для того чтобы заливать вам нужно не System.Drawing.Pen а System.Drawing.SolidBrush. Работает примерно так же, можно тоже как то настраивать.

1 лайк

Не подскажите как связать toolStripMenuItem4: ToolStripMenuItem; с saveFileDialog1: SaveFileDialog; И как этим пользоваться.

Может ли кто то объяснить почему так работает?

Программа 1:

{$reference System.Windows.Forms.dll}

uses System.Windows.Forms;

begin
  var f := new Form;
  var wr := new System.IO.BinaryWriter(System.IO.File.Create('temp'));
  var h := f.Handle;//мало ли, может его уничтожит потому что в этой программе больше не используется
  wr.Write(integer(h));
  wr.BaseStream.Close;
  System.Windows.Forms.Application.Run(f);
end.

Программа 2:

{$reference System.Windows.Forms.dll}

uses System.Windows.Forms;

begin
  var re := new System.IO.BinaryReader(System.IO.File.OpenRead('temp'));
  var c := Form.FromHandle(System.IntPtr(re.ReadInt32()));//c уже тут оказывается = nil
  var f := Form(c);
  re.BaseStream.Close;System.IO.File.Delete('temp');
  
  Sleep(1000);
  
  writeln($'found form with {f.Width} width');//Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта.
  
  Sleep(1000);
  
  f.Close;
end.

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

Как явно указать тип-параметр (T) для данной функции?

function SendRequestAsync<T>(methodToExecute: TeleSharp.TL.TLMethod): System.Threading.Tasks.Task<T>;

SendRequestAsync&<Tип>

1 лайк