Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2008, 14:35   #1
Rusl92
Форумчанин
 
Аватар для Rusl92
 
Регистрация: 30.03.2008
Сообщений: 392
По умолчанию рисование в TImage

Здравствуйте, помогите мне пожалуйста, по идее, с помощью программы можно было бы рисовать в TImage1 c помощью карандашика, а при отведении курсора от TImage, он должен становиться обычным:
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

var
downkey: boolean = false;

procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.Cursors[1]:=LoadCursorFromFile('Cursor1.cur') ;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursor:=1;
Image1.Canvas.MoveTo(X,Y);
if Button = mbLeft then downkey:=true;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
downkey:=false;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Screen.Cursor:=1;
if downkey then Image1.Canvas.LineTo(X,Y);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Canvas.FillRect(Rect(0,0,Ima ge1.Width,Image1.Height));
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Button1Click(Sender);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Screen.Cursor:=0;
end;

end.
но прогамма работает некорректно, в чем ошибка?
Программирование - это великое искусство... Такое же как например и живопись!
Rusl92 вне форума Ответить с цитированием
Старый 01.05.2008, 14:44   #2
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Лично я делал так:
Код:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursor:=1;
Image1.Canvas.Pixels[X,Y]:=clBlack;
if Button = mbLeft then downkey:=true;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if downkey then 
Image1.Canvas.Pixels[X,Y]:=clBlack;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Canvas.FillRect(Rect(0,0,Image1.Width,Image 1.Height));
end;
Я не говорю что это самый лучший вариант, но линия рисуется по пути карандаша, один минус это когда карандаш ведёш слишком быстро появляются пробелы.
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 01.05.2008, 14:48   #3
Rusl92
Форумчанин
 
Аватар для Rusl92
 
Регистрация: 30.03.2008
Сообщений: 392
По умолчанию

У меня вопрос то другой: нужно чтобы при отведении курсора от ТИмаге он становился обычным! А когда подводишь на ТИмаге - он карандашик!
Программирование - это великое искусство... Такое же как например и живопись!
Rusl92 вне форума Ответить с цитированием
Старый 02.05.2008, 16:15   #4
Rusl92
Форумчанин
 
Аватар для Rusl92
 
Регистрация: 30.03.2008
Сообщений: 392
По умолчанию

Так кто-нибудь мне подскажет?
Программирование - это великое искусство... Такое же как например и живопись!
Rusl92 вне форума Ответить с цитированием
Старый 02.05.2008, 16:28   #5
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

есть такое свойство MouseMove

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if (x>Image1.width) or (y>Image1.height) or (x<Image1.left) or (y<Image1.Top) then
begin
сделать маус обычным
end;
end;
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 02.05.2008, 17:57   #6
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Не получится.
OnMouseMove выполняется, когда мышь на компоненте, когда мышь уйдет событие не выполняется. Придется ставить hook на WM_MOUSEMOVE, ну или анализировать в Таймере.
В предыдущем вопросе об изменении курсора на карандаш, восстановление стандартного вида происходит в OnMouseMove соседнего компонента.
http://www.programmersforum.ru/showthread.php?t=16332
_Dmitry вне форума Ответить с цитированием
Старый 02.05.2008, 18:05   #7
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Сверх бредовая идея посетила меня

В событии MouseMove пишем:
x := x + 1;
If x := 100 Then x := 0;

Кидаем на Форму Таймер. Ево задача за два такта запоминать значение x.
Затем надо их сравнить. Ели они равны, значит событие MouseMove невыполняется. Меняем курсор.
Если значения различны, значит событие MouseMove выполняется

Гениально !
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 02.05.2008, 19:43   #8
juden
Пользователь
 
Аватар для juden
 
Регистрация: 28.03.2007
Сообщений: 67
По умолчанию

а ты не побывал менять свойство Cursor у имейджа, мож поможет
Проблема не в том могут ли машины думать, а в том - делают ли это люди?
B. F. Skinner
juden вне форума Ответить с цитированием
Старый 02.05.2008, 20:23   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от juden Посмотреть сообщение
а ты не побывал менять свойство Cursor у имейджа, мож поможет
Самый оптимальный вариант, только карандашика среди стандартных курсоров нет, придется свой подгрузить.

Насчет мышиных событий, в новых версиях Дельфи появились события MouseEnter и MouseLeave. В версиях где их нет, их аналог легко можно написать самому используя события MouseMove тех компонентов по к-рым ходит мышь, и таймер там не нужен.
Ключевая фраза уже тут прозвучала даже
Цитата:
восстановление стандартного вида происходит в OnMouseMove соседнего компонента
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 02.05.2008 в 20:35.
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TImage Killbrum Помощь студентам 8 27.08.2008 22:40
Timage RealSHELS Общие вопросы Delphi 7 05.05.2008 20:12
Timage RealSHELS Общие вопросы Delphi 2 03.05.2008 23:23
Рисование... HunterMan Win Api 10 30.04.2008 23:46
TImage Andrey9392 Компоненты Delphi 6 06.04.2007 10:43