Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 02.10.2017
Сообщений: 10
1

Графический редактор

10.10.2017, 13:01. Показов 4171. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно написать начало графического редактора(только в PaintBox). Я это сделал, но при изменении размера окна все пропадает. Сказали, надо создать массив массивов точек и чтобы оно сохранялось. Подскажите, как это осуществить?

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
unit Edit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
 
type
  TPoint =record
    X: Longint;
 
Y: Longint;
 
end;
 
 
  { TGEditor }
 
 
 
  TGEditor = class(TForm)
    pb: TPaintBox;
    procedure pbClick(Sender: TObject);
    procedure pbMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure pbMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure pbMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  GEditor: TGEditor;
  i,j,x,y,lastx ,lasty : integer;
  isDrawing: boolean;
  mas: array of array of TPoint;
 
implementation
 
{$R *.lfm}
 
{ TGEditor }
 
procedure TGEditor.pbClick(Sender: TObject);
begin
 
end;
 
procedure TGEditor.pbMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssleft in shift then
  begin
  isDrawing:=true;
  canvas.Moveto(x,y);
  end;
end;
 
procedure TGEditor.pbMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if isDrawing=true then
  pb.Canvas.Line(lastx, lasty, x, y);
  lastx:=x;lasty:=y;
end;
 
procedure TGEditor.pbMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  isDrawing:=false;
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2017, 13:01
Ответы с готовыми решениями:

Графический редактор на Lazarus'е
нужно сделать графический редактор. желательно через paintbox. не могли бы вы подсказать, как можно...

Графический редактор в лазарус
Добрый день , я делаю в лазарусе программу типа Paint, я в этом не очень еще понимаю , но Вот...

Создать графический редактор
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil,...

Векторный графический редактор
Обязательно чтобы в нем были: 1)Графические примитивы типа квадрат,круг,треугольник,линия 2)Чтобы...

21
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.10.2017, 13:37 2
Чудо, а не IDE, в Делфи ничего никуда не пропадает.
0
0 / 0 / 0
Регистрация: 02.10.2017
Сообщений: 10
10.10.2017, 13:38  [ТС] 3
В Lazarus'e при данном коде пропадает(при изменении размера окна). Сделать проект нужно именно в Lazarus
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.10.2017, 13:39 4
Цитата Сообщение от antons201 Посмотреть сообщение
Сказали, надо создать массив массивов точек
Для каждой линии создавать свой массив? И как выводить точки этих массивов, в каком событии?
0
0 / 0 / 0
Регистрация: 02.10.2017
Сообщений: 10
10.10.2017, 13:42  [ТС] 5
Настолько подробно я не знаю, поэтому и пишу сюда, Но завязано всё на этом. Вообще создаётся один двумерный массив, как я понял. И в него пишутся координаты точек, скорее всего в первый массив записываются массивы всех точек, которые рисуются. Но как это всё выводить и запоминать я пока не понимаю.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32959 / 21276 / 8169
Регистрация: 22.10.2011
Сообщений: 36,546
Записей в блоге: 8
10.10.2017, 14:21 6
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// в класс формы добавить bm : TBitmap
 
// при создании формы создать bitmap достаточного размера (я сделал размером с полный экран)
procedure TGEditor.FormCreate(Sender: TObject);
begin
  bm := TBitmap.Create;
  bm.SetSize(Screen.Width, Screen.Height);
  bm.Canvas.Brush.Color := clWhite;
  bm.Canvas.FillRect(Rect(0, 0, bm.Width, bm.Height));
end;
 
procedure TGEditor.pbMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: integer);
begin
  if ssleft in shift then
  begin
    isDrawing := True;
    bm.canvas.Moveto(x, y); // работаем с bitmap, а не с pb
  end;
end;
 
// рисуем на битмапе и заставляем pb перерисоваться
procedure TGEditor.pbMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
begin
  if isDrawing = True then
  begin
    bm.Canvas.Line(lastx, lasty, x, y);
    pb.Invalidate;
  end;
  lastx := x;
  lasty := y;
end;
 
procedure TGEditor.pbMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: integer);
begin
  isDrawing := False;
end;
 
// при перерисовке pb (событие OnPaint) содержимое битмапа будет на нем отрисовано.
procedure TGEditor.pbPaint(Sender: TObject);
begin
  pb.Canvas.Draw(0, 0, bm);
end;
Вот и все... А, да. Я положил PaintBox в левый верхний угол формы, а еще лучше - поставить Align = alClient...

Ну, и не забывать битмап удалять при разрушении формы.
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.10.2017, 14:54 7
Линию рисовать нужно так.
Pascal
1
2
3
4
5
6
7
procedure TGEditor.pbMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if isDrawing then
   begin
    bm.Canvas.Lineto(x, y);//не line
    pb.invalidate;
Иначе из первой точки рисует еще и линию из точки (0;0)или от конца предыдущей линии.
С Bitmap классно, хотя и с массивами тоже перерисовывает.
0
0 / 0 / 0
Регистрация: 02.10.2017
Сообщений: 10
10.10.2017, 15:33  [ТС] 8
А можно пример варианта с массивами? А то по ТЗ они должны быть и чувствую, что если их не будет, то будет не хорошо.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32959 / 21276 / 8169
Регистрация: 22.10.2011
Сообщений: 36,546
Записей в блоге: 8
10.10.2017, 15:40 9
С массивами нехорошо будет. Чем больше линий/точек, тем больше будет массив и тем, соответственно, дольше будет перерисовка. И редактор начнет подтормаживать. Лучше сделай с битмапом, а массивы еще для чего-нибудь приспособишь.
0
0 / 0 / 0
Регистрация: 02.10.2017
Сообщений: 10
10.10.2017, 16:04  [ТС] 10
Ошибка появляется "edit1.pas(81,20) Error: method identifier expected"
Ругается на FormCreate

Также ругается на pbPaint и там на pb выдает ошибку: edit1.pas(120,3) Error: Identifier not found "pb"
Хотя чуть выше всё нормально. подскажите, пожалуйста.

Добавлено через 8 минут
Стоп, с этим разобрался. Сделал как сказали, но ошибка появляется.
Миниатюры
Графический редактор  
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.10.2017, 16:12 11
Вот то что предложил volvo, все помянутые процедуры должны быть инициированы.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;
 
type
 
  { TGEditor }
 
  TGEditor = class(TForm)
    pb: TPaintBox;
    bm : TBitmap;
    procedure FormCreate(Sender: TObject);
    procedure pbMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure pbMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure pbMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure pbPaint(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  GEditor: TGEditor;
  x,y,lastx ,lasty : integer;
  isDrawing: boolean;
 
implementation
 
{$R *.lfm}
 
{ TGEditor }
 
procedure TGEditor.FormCreate(Sender: TObject);
begin
  bm := TBitmap.Create;
  bm.SetSize(Screen.Width, Screen.Height);
  bm.Canvas.Brush.Color := clWhite;
  bm.Canvas.FillRect(Rect(0, 0, bm.Width, bm.Height));
end;
 
procedure TGEditor.pbMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if ssleft in shift then
 begin
  isDrawing:=true;
  bm.canvas.Moveto(x,y);
 end;
end;
 
procedure TGEditor.pbMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if isDrawing then
  begin
    bm.Canvas.Lineto(x, y);
    pb.invalidate;
    lastx:=x;lasty:=y;
  end;
 
end;
 
procedure TGEditor.pbMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  isDrawing:=false;
end;
 
procedure TGEditor.pbPaint(Sender: TObject);
begin
pb.Canvas.Draw(0, 0, bm);
end;
 
 
end.
0
0 / 0 / 0
Регистрация: 02.10.2017
Сообщений: 10
10.10.2017, 16:13  [ТС] 12
Да, я разобрался с этим, не сразу заметил просто. а вот ошибка появляется(та что на скриншоте выше)
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.10.2017, 16:16 13
Ну приложи архив проекта без лишних файлов, в том числе без .exe, а то фиг знает что там в строке 299.
0
0 / 0 / 0
Регистрация: 02.10.2017
Сообщений: 10
10.10.2017, 16:27  [ТС] 14
Вот
Вложения
Тип файла: rar Графический редактор.rar (382.7 Кб, 62 просмотров)
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.10.2017, 16:31 15
Вот если нужно, с массивами.
Вложения
Тип файла: rar Перерисовка с масивами.rar (124.6 Кб, 62 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32959 / 21276 / 8169
Регистрация: 22.10.2011
Сообщений: 36,546
Записей в блоге: 8
10.10.2017, 16:34 16
Ну, не знаю, нет никакой ошибки, и рисовал и изменял размеры и перемещал окно
Миниатюры
Графический редактор  
0
0 / 0 / 0
Регистрация: 02.10.2017
Сообщений: 10
10.10.2017, 16:41  [ТС] 17
Не знаю, у меня всё ошибка лезет. Странно. Но с массивами зашло, оставлю, наверное, этот вариант. Спасибо всем большое за помощь.
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.10.2017, 16:47 18
А у меня тоже вылазит эта ошибка.
Как только кликаю мышкой по форме(по pb).
Миниатюры
Графический редактор   Графический редактор  
0
602 / 550 / 210
Регистрация: 24.01.2012
Сообщений: 1,352
10.10.2017, 16:58 19
процедура formcreate не привязана к событию oncreate. Отсюда проблема.
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.10.2017, 17:05 20
Точно, ведь писал же ему.
Цитата Сообщение от Puporev Посмотреть сообщение
все помянутые процедуры должны быть инициированы.
Добавлено через 3 минуты
Да я не смотрел, активировал OnCreate и все заработало.
0
10.10.2017, 17:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2017, 17:05
Помогаю со студенческими работами здесь

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

Как добавить функцию Текст в графический редактор?
Как сделать так, что бы можно было писать текст на графическом редакторе? Лазарус

Графический редактор - Как сделать чтобы при изменении размера окна форма не очищалась
Я делаю графический редактор и возник вопрос -как сделать чтобы при изменении размера окна форма...

Графический редактор в Паскаль
Очень многие посетители форума просят нарисовать в паскале какой-либо рисунок. Давайте совместно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru