![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
|||
|
|||
![]() нет,я хочу нарисовать прямую и ввести длинну,потом от этой прямой нарисовать дальше отрезок и ввести длинну,в оконцовке у меня может получится 30 отрезков с учетом обхода колонн,вход и выход из комнат,и кликнув по кнопке метраж получу сумму.дальше мой план передо мной-жму кнопку уголок и кликаю на рисунке,где они должны быть,опять эти клики суммируются и получаю ответ,дальше тройники-то же самое,т.е все на моем плане я рисую и по клику считаю
|
#17
|
||||
|
||||
![]() Вот вам вариант с подсчетом общего пробега:
Код:
unit Unit27; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm27 = class(TForm) PaintBox1: TPaintBox; Label1: TLabel; Label2: TLabel; procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private ClickPos, CursorPos: TPoint; Lines: Array of TRect; end; var Form27: TForm27; implementation {$R *.dfm} function LineSize(A, B: TPoint): Real; begin Result := Sqrt(Sqr(Abs(B.X - A.X)) + Sqr(Abs(B.Y - A.Y))); end; procedure TForm27.FormCreate(Sender: TObject); begin SetLength(Lines, 0); end; procedure TForm27.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ClickPos := Point(X, Y); CursorPos := ClickPos; Canvas.Pen.Color := clRed; Canvas.Pen.Mode := pmNotXor; Canvas.Pen.Width := 3; end; procedure TForm27.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ssLeft in Shift then begin Canvas.MoveTo(ClickPos.X, ClickPos.Y); Canvas.LineTo(CursorPos.X, CursorPos.Y); CursorPos := Point(X, Y); Canvas.MoveTo(ClickPos.X, ClickPos.Y); Canvas.LineTo(X, Y); Label1.Caption := Format('%6.2f',[LineSize(ClickPos, CursorPos)]); end; end; procedure TForm27.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var i: Integer; Len: Real; begin Canvas.Pen.Mode := pmCopy; Canvas.MoveTo(ClickPos.X, ClickPos.Y); Canvas.LineTo(CursorPos.X, CursorPos.Y); SetLength(Lines, Length(Lines) + 1); Lines[High(Lines)] := Rect(ClickPos.X, ClickPos.Y, CursorPos.X, CursorPos.Y); for i := 0 to Length(Lines) - 1 do Len := Len + LineSize(Lines[i].TopLeft, Lines[i].BottomRight); Label2.Caption := Format('%6.2f',[Len]); end; end. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
elviss77 (22.06.2014)
|
#18
|
|||
|
|||
![]() спасибо вам большое...буду изучать ваши коды и эксперементировать...надеюсь,как разберусь буду озадачивать вас новыми вопросами.спасибо,что откликнулись!
|
#19
|
||||
|
||||
![]() Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#20
|
|||
|
|||
![]() Код:
привет!Начал разбирать ваш код:создал на форме PaintBox1 на вкладке events создал процедуру mousedown,прописал вручную procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ClickPos := Point(X, Y); CursorPos := ClickPos; Canvas.Pen.Color := clRed; Canvas.Pen.Mode := pmNotXor; Canvas.Pen.Width := 3; end; решил посмотреть что получится,запустил и получил ошибку в строке ClickPos := Point(X, Y); внизу ошибка называется так [Error]Unit1.pas(31):Undeclared identifier:'Click Pos' [FatalError] Project1.dpr(5):Could not compile used unit 'Unit1.pas' что это за ошибка ?что я не так сделал? это из первого вашего кода рисование линий Последний раз редактировалось Admin, 24.06.2014 в 19:22. |
#21
|
|||
|
|||
![]() прошу прощения,за предыдущее сообщение-разобрался!!!
есть несколько вопросов: 1 по поводу работы кода-лайбл1 это моя ведомая линия,лейбл2 это итог-правильно?какой масштаб рисунка?я нарисовал линюю-получил число,чему оно равно?пикселы?сантиметры? 2. по поводу кода:интересует private то это и что за параметры там заданы,что обозначают и что делают? |
#22
|
||||
|
||||
![]() Единицы измерения пиксели. Верно во вторую метку выводится общая длина всех нарисованных линийю Понятно, что 5.25 пикселя быть не может, можно округлить до ближайшего целого 5.
Код:
private ClickPos, CursorPos: TPoint; Lines: Array of TRect; Lines: Array of TRect - тут чуток посложнее. Array of - это динамический массив, размер которого может изменятся в теле программы. В него идет накопление координат линий. Можно было бы просто сразу записывать не координаты, а длину, но так более гибко. Есть возможность полной перерисовки всех линий заново. А TRect тоже удобный тип, содержит пару переменных типа TPoint, которые я использую для хранения координат линии. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 23.06.2014 в 19:53. |
#23
|
|||
|
|||
![]() еще вопрос:создал кнопку,как ей задать процедуру вывести мой рисунок?т.е кликнул по ней и то чио я рисовал выведется в отдельном поле или форме?
procedure TForm1.Button1Click(Sender: TObject); begin end; |
#24
|
||||
|
||||
![]() В виде битмапа или векторно?
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#25
|
|||
|
|||
![]() чтобы потом на нем мог размечать фурнитуру типа того же паинтбокса
|
#26
|
|||
|
|||
![]() если я создам форму с вашим кодом,но без процедуры PaintBox1MouseUp
я смогу в паинтбоксе ставить просто точки кликом? |