Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 22.06.2014, 22:58
elviss77 elviss77 вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

нет,я хочу нарисовать прямую и ввести длинну,потом от этой прямой нарисовать дальше отрезок и ввести длинну,в оконцовке у меня может получится 30 отрезков с учетом обхода колонн,вход и выход из комнат,и кликнув по кнопке метраж получу сумму.дальше мой план передо мной-жму кнопку уголок и кликаю на рисунке,где они должны быть,опять эти клики суммируются и получаю ответ,дальше тройники-то же самое,т.е все на моем плане я рисую и по клику считаю
Ответить с цитированием
  #17  
Старый 22.06.2014, 23:22
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Вот вам вариант с подсчетом общего пробега:
Код:
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  
Старый 22.06.2014, 23:31
elviss77 elviss77 вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

спасибо вам большое...буду изучать ваши коды и эксперементировать...надеюсь,как разберусь буду озадачивать вас новыми вопросами.спасибо,что откликнулись!
Ответить с цитированием
  #19  
Старый 23.06.2014, 06:28
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от elviss77
нет,я хочу нарисовать прямую и ввести длинну,потом от этой прямой нарисовать дальше отрезок и ввести длинну,в оконцовке у меня может получится 30 отрезков с учетом обхода колонн,вход и выход из комнат
Эта штука называется трассировка.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #20  
Старый 23.06.2014, 11:05
elviss77 elviss77 вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Код:
привет!Начал разбирать ваш код:создал на форме 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  
Старый 23.06.2014, 13:34
elviss77 elviss77 вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

прошу прощения,за предыдущее сообщение-разобрался!!!
есть несколько вопросов:
1 по поводу работы кода-лайбл1 это моя ведомая линия,лейбл2 это итог-правильно?какой масштаб рисунка?я нарисовал линюю-получил число,чему оно равно?пикселы?сантиметры?
2. по поводу кода:интересует private то это и что за параметры там заданы,что обозначают и что делают?
Ответить с цитированием
  #22  
Старый 23.06.2014, 19:47
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Единицы измерения пиксели. Верно во вторую метку выводится общая длина всех нарисованных линийю Понятно, что 5.25 пикселя быть не может, можно округлить до ближайшего целого 5.
Код:
private
    ClickPos, CursorPos: TPoint;
    Lines: Array of TRect;
ClickPos, CursorPos: TPoint; - переменные типа рекорд, удобны тем что уже содержат Х и У. Вместо этих двух переменных можно было бы сделать 4 обычные, но так компактнее и нагляднее.
Lines: Array of TRect - тут чуток посложнее. Array of - это динамический массив, размер которого может изменятся в теле программы. В него идет накопление координат линий. Можно было бы просто сразу записывать не координаты, а длину, но так более гибко. Есть возможность полной перерисовки всех линий заново. А TRect тоже удобный тип, содержит пару переменных типа TPoint, которые я использую для хранения координат линии.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 23.06.2014 в 19:53.
Ответить с цитированием
  #23  
Старый 23.06.2014, 22:09
elviss77 elviss77 вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

еще вопрос:создал кнопку,как ей задать процедуру вывести мой рисунок?т.е кликнул по ней и то чио я рисовал выведется в отдельном поле или форме?
procedure TForm1.Button1Click(Sender: TObject);
begin

end;
Ответить с цитированием
  #24  
Старый 23.06.2014, 22:50
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

В виде битмапа или векторно?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #25  
Старый 23.06.2014, 22:58
elviss77 elviss77 вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

чтобы потом на нем мог размечать фурнитуру типа того же паинтбокса
Ответить с цитированием
  #26  
Старый 23.06.2014, 22:59
elviss77 elviss77 вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 17
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

если я создам форму с вашим кодом,но без процедуры PaintBox1MouseUp
я смогу в паинтбоксе ставить просто точки кликом?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025