![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Цитата:
|
|
#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
я смогу в паинтбоксе ставить просто точки кликом? |