![]() |
|
#1
|
|||
|
|||
![]() Доброго времени суток, уважаемые пользователи!
Помогите разработать приложение, рисующее при нажатии левой кнопки мыши на форме красную горизонтальную линию, перемещающуюся при нажатии клавиш y,g,h,j с зажатой клавишей ctrl. Клавиша z — очистка формы. Спасибо за внимание! |
#3
|
|||
|
|||
![]() Нужна помощь в написании программы. Именно помощь.
Если можно - почему бы и нет?! Не думаю, что стоит переносить тему в тот раздел. |
#4
|
||||
|
||||
![]() Цитата:
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Freeman (05.10.2013)
|
#5
|
|||
|
|||
![]() Не получается нарисовать горизонтальную линию.
Код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Form1.Canvas.Brush.Style:=bsSolid; Form1.Canvas.Brush.Color:=clBtnFace; Form1.Canvas.FillRect(Rect(0,0,Form1.ClientWidth,Form1.ClientHeight)); Form1.Canvas.Pen.Color:=clRed; Form1.Canvas.Brush.Style:=bsHorizontal; Form1.Canvas.Brush.Color:=clred; Form1.Canvas.LineTo(100,y); Form1.Canvas.MoveTo(500,y); end; При нажатии левой кнопки на мыше линии возникают в произвольном порядке - иногда горизонтально, иногда со сдвигом на диагональ. Как исправить это? |
#6
|
||||
|
||||
![]() LineTo и MoveTo поменяйте местами.
MoveTo перемещает условный "курсор", LineTo чертит линию от "курсора" до переданных координат. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Delphi_Source (06.10.2013)
|
#7
|
|||
|
|||
![]() Спасибо. Помогло.
Теперь рисует, как нужно. Возник еще один вопрос. Теперь нужно сделать ее перемещение при нажатии клавиш y,g,h,j с зажатой клавишей ctrl. Пробовал переместить их посредством константы vk, но она работает только для клавиш-указателей (Up, Down, Left, Right). Когда пытаюсь писать буквенные символы - оператор их просто не распознает. Попробовал заменить на ord. Клавиши стали распознаваться, но не знаю как сделать перемещение. Что нужно прописать? |
#8
|
||||
|
||||
![]() Чтоб передвигать такую линию нужно "затирать" старую, рисуя на её месте линию цвета фона и затем делать новую прибавив к старым координатам нужное для перемещения кол-во пикселей. Вероятно проще применить компонент шейп - его "двигать" намного удобней и веселей. Среда ведь всётаки визуальная, этим и надо пользоваться
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Delphi_Source (06.10.2013)
|
#9
|
|||
|
|||
![]() Цитата:
А на примере кода можно это увидеть? |
#10
|
||||
|
||||
![]() Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Shift = [ssCtrl] then case Key of 72: Shape1.Left:= Shape1.Left - 1; 89: Shape1.Top:= Shape1.Top -1; 74: Shape1.Left:= Shape1.Left + 1; 71: Shape1.Top:= Shape1.Top + 1; end; end; З.Ы. Только сейчас увидел что нужны не стрелки, а кнопки с буковками и с зажатым шифтом. Исправил Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 06.10.2013 в 20:54. |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Delphi_Source (06.10.2013)
|
#11
|
|||
|
|||
![]() Цитата:
Не пропускает. Код:
if Key=ord('Y') and (ssctrl in Shift) then begin Form1.Canvas.Brush.Style:=bsSolid; Form1.Canvas.Brush.Color:=clBtnFace; Form1.Canvas.FillRect(Rect(0,0,Form1.ClientWidth,Form1.ClientHeight)); Form1.Canvas.Pen.Color:=clRed; Form1.Canvas.Brush.Style:=bsSolid; Form1.Canvas.Brush.Color:=clred; Начало у меня такое. Клавишей Y нужно перемещать вверх. Что-то нужно тут дописать. Пытался задавать значения по координатам (в выше приведенном тексте код отсутствует, т.к. при нажатии на клавишу Y идет очистка формы, хотя сама очистка прописана под клавишу Z таким образом: Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var X, Y: Integer; begin if Key=ord('Z') then begin Form1.Canvas.Pen.Color:=Form1.Color; Form1.Canvas.Brush.Style:=bsSolid; Form1.Canvas.Brush.Color:=Form1.Color; Form1.Canvas.FillRect(Rect(0,0,Form1.Width,Form1.Height)); end; Как же все-таки можно заставить эту линию двигаться вверх при нажатии клавиши Y с зажатой клавишей ctrl? Цитата:
Подобную ошибку выдает Цитата:
Перемещение вверх должно осуществляться при нажатии клавиши Y с зажатой клавишей ctrl Последний раз редактировалось M.A.D.M.A.N., 06.10.2013 в 21:13. |
#12
|
||||
|
||||
![]() Предложен самый простой вариант - лишь нужно бросить на форму компонент Shape лежащий на вкладке Additional, задать ему высоту (или длину) в 1 пиксель, у формы свойство KeyPreview задать как true, скопипастить для формы KeyDown (подправьте коды клавиш, если не так: Y > 89, G > 71, H > 72, J > 74)
З.Ы. Ну или если такой вариант не катит, покажите тогда как вы линию рисуете в полный размер (приведена лишь очистка полотна), попробую под это дело код доработать Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 06.10.2013 в 21:44. |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Delphi_Source (06.10.2013)
|
#13
|
|||
|
|||
![]() Бросил на форму компонент Shape. Там появился квадратик. Его уменьшил до размеров 1х1. У KeyPreview поставил true
Цитата:
Что нужно скопипастить? Код? Попробовал его скопипастить. Теперь появились новые ошибки: Цитата:
Последний раз редактировалось Delphi_Source, 06.10.2013 в 22:31. |
#14
|
|||
|
|||
![]() На данный момент у меня имеется рисование линий и очистка формы клавишей Z. Осталось их только заставить перемещать вверх, вниз, влево, вправо указанными клавишами.
Привожу код: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation var xg,yg,a,b:integer; {$R *.dfm} procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Form1.Canvas.Brush.Style:=bsSolid; Form1.Canvas.Brush.Color:=clBtnFace; Form1.Canvas.FillRect(Rect(0,0,Form1.ClientWidth,Form1.ClientHeight)); Form1.Canvas.Pen.Color:=clRed; Form1.Canvas.Brush.Style:=bsHorizontal; Form1.Canvas.Brush.Color:=clred; Form1.Canvas.MoveTo(500,y); Form1.Canvas.LineTo(100,y); end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var X, Y: Integer; begin if Key=ord('Z') then begin Form1.Canvas.Pen.Color:=Form1.Color; Form1.Canvas.Brush.Style:=bsSolid; Form1.Canvas.Brush.Color:=Form1.Color; Form1.Canvas.FillRect(Rect(0,0,Form1.Width,Form1.Height)); end; end. |
#15
|
||||
|
||||
![]() Понятно, как обычно. Что должно происходить при нажатии каких клавиш? У меня уже рисуется линия мышкой и двигается вверх-вниз, Z очистка. Другими словами - опишите логику работы полностью, и может всё получится
![]() Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Delphi_Source (06.10.2013)
|