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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.10.2013, 00:39
Delphi_Source Delphi_Source вне форума
Прохожий
 
Регистрация: 01.10.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
Восклицание Устройства ввода

Доброго времени суток, уважаемые пользователи!
Помогите разработать приложение, рисующее при нажатии левой кнопки мыши на форме красную горизонтальную линию, перемещающуюся при нажатии клавиш y,g,h,j с зажатой клавишей ctrl. Клавиша z — очистка формы.
Спасибо за внимание!
Ответить с цитированием
  #2  
Старый 01.10.2013, 01:34
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Ну и уже по традиции:

В чём именно нужна помощь? Помощь ли?
Или необходимо написать программу?
Может быть, тогда стоит написать в раздел работа?
Ответить с цитированием
  #3  
Старый 05.10.2013, 17:07
Delphi_Source Delphi_Source вне форума
Прохожий
 
Регистрация: 01.10.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Нужна помощь в написании программы. Именно помощь.
Если можно - почему бы и нет?!
Не думаю, что стоит переносить тему в тот раздел.
Ответить с цитированием
  #4  
Старый 05.10.2013, 17:37
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Нужна помощь в написании программы. Именно помощь.
Хорошо. И в чем же, по Вашему мнению, помощь должна заключаться? Если ответ "Расскажите все от начала до конца" или "напишите программу" - вперед в Работу. Иначе - прикладывайте свои наработки, задавайте конкретные вопросы.
Цитата:
Если можно - почему бы и нет?!
Не думаю, что стоит переносить тему в тот раздел.
Не стоит путать форумы с богадельнями.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Freeman (05.10.2013)
  #5  
Старый 06.10.2013, 13:24
Delphi_Source Delphi_Source вне форума
Прохожий
 
Регистрация: 01.10.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не получается нарисовать горизонтальную линию.

Код:
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  
Старый 06.10.2013, 13:25
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

LineTo и MoveTo поменяйте местами.
MoveTo перемещает условный "курсор", LineTo чертит линию от "курсора" до переданных координат.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
Delphi_Source (06.10.2013)
  #7  
Старый 06.10.2013, 19:57
Delphi_Source Delphi_Source вне форума
Прохожий
 
Регистрация: 01.10.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо. Помогло.
Теперь рисует, как нужно.

Возник еще один вопрос.
Теперь нужно сделать ее перемещение при нажатии клавиш y,g,h,j с зажатой клавишей ctrl.
Пробовал переместить их посредством константы vk, но она работает только для клавиш-указателей (Up, Down, Left, Right). Когда пытаюсь писать буквенные символы - оператор их просто не распознает.
Попробовал заменить на ord. Клавиши стали распознаваться, но не знаю как сделать перемещение. Что нужно прописать?
Ответить с цитированием
  #8  
Старый 06.10.2013, 20:23
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Чтоб передвигать такую линию нужно "затирать" старую, рисуя на её месте линию цвета фона и затем делать новую прибавив к старым координатам нужное для перемещения кол-во пикселей. Вероятно проще применить компонент шейп - его "двигать" намного удобней и веселей. Среда ведь всётаки визуальная, этим и надо пользоваться
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Delphi_Source (06.10.2013)
  #9  
Старый 06.10.2013, 20:25
Delphi_Source Delphi_Source вне форума
Прохожий
 
Регистрация: 01.10.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Чтоб передвигать такую линию нужно "затирать" старую, рисуя на её месте линию цвета фона и затем делать новую прибавив к старым координатам нужное для перемещения кол-во пикселей. Вероятно проще применить компонент шейп - его "двигать" намного удобней и веселей. Среда ведь всётаки визуальная, этим и надо пользоваться

А на примере кода можно это увидеть?
Ответить с цитированием
  #10  
Старый 06.10.2013, 20:39
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
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  
Старый 06.10.2013, 20:49
Delphi_Source Delphi_Source вне форума
Прохожий
 
Регистрация: 01.10.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of
 37: Shape1.Left:= Shape1.Left - 1;
 38: Shape1.Top:= Shape1.Top - 1;
 39: Shape1.Left:= Shape1.Left + 1;
 40: Shape1.Top:= Shape1.Top + 1;
end;

end;

Не пропускает.



Код:
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?

Цитата:
Сообщение от Alegun
Код:
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;

З.Ы. Только сейчас увидел что нужны не стрелки, а кнопки с буковками и с зажатым шифтом. Исправил

Подобную ошибку выдает
Цитата:
[Error]Unit1.pas[54]: Undeclared identifier: 'Shape1'

Перемещение вверх должно осуществляться при нажатии клавиши Y с зажатой клавишей ctrl

Последний раз редактировалось M.A.D.M.A.N., 06.10.2013 в 21:13.
Ответить с цитированием
  #12  
Старый 06.10.2013, 21:22
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Предложен самый простой вариант - лишь нужно бросить на форму компонент 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  
Старый 06.10.2013, 21:48
Delphi_Source Delphi_Source вне форума
Прохожий
 
Регистрация: 01.10.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Бросил на форму компонент Shape. Там появился квадратик. Его уменьшил до размеров 1х1. У KeyPreview поставил true

Цитата:
скопипастить для формы KeyDown

Что нужно скопипастить? Код?


Попробовал его скопипастить. Теперь появились новые ошибки:

Цитата:
[Error]Unit1.pas[54]: Statement expectedbut 'PROCEDURE' found

Последний раз редактировалось Delphi_Source, 06.10.2013 в 22:31.
Ответить с цитированием
  #14  
Старый 06.10.2013, 21:52
Delphi_Source Delphi_Source вне форума
Прохожий
 
Регистрация: 01.10.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

На данный момент у меня имеется рисование линий и очистка формы клавишей 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  
Старый 06.10.2013, 22:34
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Понятно, как обычно. Что должно происходить при нажатии каких клавиш? У меня уже рисуется линия мышкой и двигается вверх-вниз, Z очистка. Другими словами - опишите логику работы полностью, и может всё получится
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Delphi_Source (06.10.2013)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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