Volk:=ПОМОГИТЕ!

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

имхо, вводить координаты из едитов не очень удобно. Я бы сделал так. На МаусДаун (или ОнКлик) фиксировал координаты и выставлял флаг, что чертим прямую. Далее в МаусМув проверял флаг и если он установлен чертил линию от сохранённых координат до текущих. На следующий клик фиксировал линию и снимал флаг...
Изображение
Volk
Сообщения: 31
Зарегистрирован: 01 апр 2005, 16:01
Откуда: Новочеркасск

Короче исходник такой:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, ExtCtrls, ExtDlgs, Menus;

type
TForm1 = class(TForm)
Panel1: TPanel;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
SavePictureDialog1: TSavePictureDialog;
PaintBox1: TPaintBox;
Button1: TButton;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
Panel2: TPanel;
Panel3: TPanel;
Edit3: TEdit;
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
X2: integer;
Y2: integer;
implementation

{$R *.DFM}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
X1: integer;
Y1: Integer;
begin

Edit1.text := FormatFloat('##0', X);
Edit2.text := FormatFloat('##0', Y);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var
X2: Integer;
Y2: Integer;
index:Integer;
begin
X2:=StrToInt(Edit1.Text);
Y2:=StrToInt(Edit2.Text);
end;


procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var
X2: Integer;
Y2: Integer;
index:Integer;
begin
X2:=StrToInt(Edit1.Text);
Y2:=StrToInt(Edit2.Text);
Canvas.TextOut(X2, Y2, '.');
\\ВОТ ТУТ ЗАПОРКА!!!!!! ОНО ЛИБО ОДНУ ТОЧКУ СТАВИТ XY ЛИБО X2Y2!!!!!!!!!!
Canvas.TextOut(X, Y, '.');


end;


procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
X2: Integer;
Y2: Integer;
begin
Edit1.text := FormatFloat('##0', X);
Edit2.text := FormatFloat('##0', Y);




end;

end.

end;

end.
Для Edit1,2 код для того чтоб ты водиш по форме а оно отображает координаты курсора.
и ЕЩЁ Я ВООБШЕ НЕ МОГУ ПОНЯТЬ МОЖНО ЛИ СДЕЛАТЬ ЧТОБ САНТИМЕТРЫ УДАЛЕНИЯ ОТ ТОЧКИ ПИСАЛА ГДЕ НИТЬ ЛИБО В ЭДИТЕ либо ещё лучше под курсором?
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

TextOut выводит ТЕКСТ. Если ты хочешь построить прямую, то надо использовать метод Line/LineTo (надо смотреть)
editы используются для *ввода* текста, для отображения лучше использовать TLabel.
сантиметры придётся пересчитывать из пикселей.
Изображение
Volk
Сообщения: 31
Зарегистрирован: 01 апр 2005, 16:01
Откуда: Новочеркасск

Помоему Игорь ты немного недопонял. LineTo это я знаю и её поставлю после того ка у меня будит две точки разных одна с координатами X, Y а другая с координатами X2, Y2 и тогда я напишу
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Pen.Style:=psSolid;
Canvas.MoveTo(X,Y);
Canvas.LineTo(X2,Y2);
И оно построет мне прямую через две разнве по координатам точки которые я поставил. Как это сделать? И как лучше?
А вот ты пишиш сантиметры придётся пересчитывать из пикселей. Как вообше в Edit3 мне отобразить хоть пиксели отступленные курсором от точки?(Лучше кодом). А и ещё у меня на форме стоит SavePictureDialog1 и Button1 так вот как мне сделать так чтоб при нажатии на Button1 вылетал диалог и я мог сохранить изображение PaintBox1 в bmp формате, ну как в Paint(е) короче? (тоже лучше кодом)
Зарание спасибо!
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

конечно недопонял, и продолжаю... т.к. не могу понять *зачем* ставить 2 текстовые точки при рисовании прямой? это будут координаты символа, толи левого верхнего толи нижнего угла
С кодом пока тяжело (нет под рукой)
Про диалог - на метод OnClick кнопки вешаешь Dialog.Execute и посмотри в справке свойства этого диалога, там можно и формат по умолчанию задать и разные всякие другие параметры (дома гляну)
Изображение
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Немного кода:

Код: Выделить всё

...
    sb: TStatusBar;
    Button1: TButton;
  private
    SX, SY, PrevX, PrevY: integer;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SX := X;
  SY := Y;
  PrevX := X;
  PrevY := Y;
  Canvas.MoveTo(X, Y);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  c: double;
begin
  if ssLeft in Shift then
  begin
    PrevX := Canvas.PenPos.X;
    PrevY := Canvas.PenPos.Y;
    Canvas.MoveTo(SX, SY);
    Canvas.LineTo(PrevX, PrevY);
    Canvas.MoveTo(SX, SY);
    Canvas.LineTo(X, Y);
    SB.Panels[0].Text := format('Start %d:%d', [SX, SY]);
    SB.Panels[1].Text := format('Curr %d:%d', [X, Y]);
    c := Sqr(Sqrt(Abs(X-SX))+Sqrt(Abs(Y-SY)));
    SB.Panels[2].Text := format('Length: %.2f', [c]);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Canvas.Pen.Mode := pmNot;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Canvas.Brush.Color := clBtnFace;
  Canvas.FillRect(ClientRect);
end;
Всю доп. инфу вывожу в статусбар
расстояние рассчитывается по Пифагору с^2 = a^2+b^2
С сантиметрами, думаю, заморачиваться не стоит... ибо... :)
Изображение
Volk
Сообщения: 31
Зарегистрирован: 01 апр 2005, 16:01
Откуда: Новочеркасск

АААГАГА! Ну как? Я в потерях! Мне надо как в паинте проводить прямую. Шёлк по PaintBox один раз шёлк другой и вот те два кордината для прямой и прямая и прямая раз нарисовалась и вот те чертёж. КАК? Я думал через текстовые точки провести а тыговориш нет ну раз так неполучится тогда как же? А вот Dialog.Execute попробую. Ну доскорого Игорь.
Volk
Сообщения: 31
Зарегистрирован: 01 апр 2005, 16:01
Откуда: Новочеркасск

О так вот код! а я не заматил блин....
Volk
Сообщения: 31
Зарегистрирован: 01 апр 2005, 16:01
Откуда: Новочеркасск

Да код я увидел а толку!? Всё периписал как у тебя получилось вот чё проверь.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
SB: TStatusBar;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
SX, SY, PrevX, PrevY: integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SX := X;
SY := Y;
PrevX := X;
PrevY := Y;
Canvas.MoveTo(X, Y);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
c: double;
begin
if ssLeft in Shift then
begin
PrevX := Canvas.PenPos.X;
PrevY := Canvas.PenPos.Y;
Canvas.MoveTo(SX, SY);
Canvas.LineTo(PrevX, PrevY);
Canvas.MoveTo(SX, SY);
Canvas.LineTo(X, Y);
SB.Panels[0].Text := format('Start %d:%d', [SX, SY]);
SB.Panels[1].Text := format('Curr %d:%d', [X, Y]);
c := Sqr(Sqrt(Abs(X-SX))+Sqrt(Abs(Y-SY)));
SB.Panels[2].Text := format('Length: %.2f', [c]);
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Canvas.Pen.Mode := pmNot;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(ClientRect);
end;

end.

Запускаю и НИЧЁ в Баре не чё не пишит кликаю, вожу по форме курсором и ни фига а потом вылетает окошко с ошикой "List index out of bounds (0)" Чё за канитель????? Или давай ты мне мыло оставиш а я те всю прогу скину она всего 250 кило весит. Или как чё?
RoKon
Сообщения: 82
Зарегистрирован: 27 мар 2005, 12:24
Откуда: Saransk City
Контактная информация:

Ошибка в этой

Код: Выделить всё

SB.Panels[0].Text := format('Start %d:%d', [SX, SY]); 
строке?
В статус баре панели создал? (Три штуки как минимум)
The trurh is out there...
Закрыто