Помощь - Поиск - Пользователи - Календарь
Полная версия: Событие OnMouseMove
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Cheburashka
Пытаюсь сделать так, чтобы при наведении мышки на картинку, она изменялась на другую.
Правильно ли то, что я использую OnMouseMove? Как это сделать? smile.gif
Client
OnMouseEnter мне кажется будет лучше. Так при малейшем движении мыши над компонентом будет меняться
Cheburashka
Допустим даже так. Приведите пример пожалуйста, а то у меня не получается ее изменить.
Image1.Picture := ????????;

Что нужно написать?
Client
Можно хранить в массиве адрес рисунка и загружать рисунок Image1.Picture.LoadFromFile(путь)
Cheburashka
Как проверить наличие того или иного изображения на форме?
Если 1.jpg тогда ...
иначе ...
Client
из Image нельзя вытянуть название файла. работая с файлами через массив, список можно по номерам легко обращаться к нужному файлу
Cheburashka
В таком случае массив типа TPicture создавать?
И как тогда в него загрузить изображение?
volvo
Цитата
В таком случае массив типа TPicture создавать?
В таком случае лучше описать задачу как следует, а не так, как понятно только тебе. Напоминаю: изначально вопрос стоял так:
Цитата
Пытаюсь сделать так, чтобы при наведении мышки на картинку, она изменялась на другую.
Никакого упоминания о том, что у тебя несколько картинок, никакого упоминания о том, что тебе надо отслеживать, какие картинки на форме присутствуют в настоящий момент, НИЧЕГО... Тебе сказали, как решать то, о чем ты спросил. Дал бы сразу всю информацию - подсказали бы правильное решение твоей проблемы. А так...

Максимум, чего могу посоветовать - это прочитать вот это
Cheburashka
Просто напросто тут одна проблема вытекает из другой.
У меня есть две картинки. Как мне уже сказали, мне нужно создать массив для их хранения. Как мне сделать это? И как мне обращаться к тому или иному изображению?
Unconnected
Самый простой вариант - сделать массив из путей к картинкам (понятное дело, картинки должны существовать по указанным путям).

var
Form1: TForm1;
pics:array[1..piccount] of string=('pictures\1.jpg','pictures\2.jpg');

implementation

{$R *.dfm}

procedure TForm1.Image1MouseEnter(Sender: TObject);
begin
image1.Picture.LoadFromfile(pics[1]);
end;

procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
image1.Picture.LoadFromfile(pics[2]);
end;

end.



Только в Uses надо добавить модуль Jpeg. Ещё можно загружать из ресурсов.
И ещё, если в программе используются Dialogs (TOpenDialog или что-то подобное), то желательно указывать абсолютные пути.
Cheburashka
А у меня нету MouseEnter and MouseLeave blink.gif
Unconnected
А у экземпляра TImage такое событие есть smile.gif

//ты же кинул его на форму?
Cheburashka
Изображение
Вот скриншот, посмотрите.
Unconnected
Аа, в Delphi 7 нету, значит... Тогда - всё тоже самое - только берём обработчики OnMove имаджа и формы.


var mmove:boolean=false;

implementation
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if mmove then begin
mmove:=false;
image1.Picture.LoadFromFile(pics[2]);
end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not(mmove) then begin
mmove:=true;
image1.Picture.LoadFromFile(pics[1]);
end;
end;
Cheburashka
Я поместил изображения в папку с проектом, но он пишет что не может их найти. С чем это может быть связано?
Client
пора бы уже код привести...
возможно надо указать путь ".\1.jpg"
Cheburashka
Код ничем ни отличается от вашего.
var
Form1: TForm1;
pics:array[1..2] of string=('.\1.jpg', '.\2.jpg');
mmove:boolean=false;

implementation

{$R *.dfm}

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not(mmove) then begin
mmove:=true;
image1.Picture.LoadFromFile(pics[1]);
end;

end;


procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if mmove then begin
mmove:=false;
image1.Picture.LoadFromFile(pics[2]);
end;
end;


Но все равно пишет тоже самое, что не может найти изображение.
volvo
var
pics:array[1..2] of string=('1.jpg', '2.jpg');

// ...
function FullPath(p: string): string;
begin
result := ExtractFilePath(Application.ExeName) + p;
end;

// ...
image1.Picture.LoadFromFile(FullPath(pics[1]));

Не надо думать, что рабочая папка останется таковой всегда. Как только вызывается любой диалог сохранения/открытия файла - это может привести к тому, что текущая (рабочая) папка изменится. Единственный вариант - отслеживать местоположение EXE-файла.
Client
а GetCurrentDir возвращает же тоже папку с ЕХЕ ?
создал файлы с ЕХЕ в одной папке и все работает
Cheburashka
Тогда что мне делать? Заново пересоздал проект, и ничего... Все тоже самое sad.gif
volvo
Нет, как раз GetCurrentDir вернет текущую папку (странно правда?) и программа будет работать ровно до того момента, как она захочет воспользоваться функциями, которые в качестве эффекта (основного или побочного) эту папку меняют.

А может и с самого начала не сработать (если проект был открыт в IDE, но до его запуска средствами Windows или самой системой было произведено действие, которое меняет текущую папку).

Добавлено через 2 мин.
Цитата
Тогда что мне делать?
Я тебе написал, что делать... Ориентироваться на каталог, в котором расположен EXE, а не на какую-то мифическую "текущую директорию". Ты ответы-то читай, а то больше ответов может и не быть совсем. Кому на фиг интересно отвечать, когда то, что пишешь уходит "в пустоту"?
Cheburashka
Причем тут вообще изменение текущей папки? blink.gif
Client
указывай полный путь к файлам и все.
P.S. спасибо, volvo smile.gif
Cheburashka
  pics:array[1..2] of string=('D:\Pr\1.jpeg', 'D:\Pr\2.jpg');

Как-то странно, одну картинку запрашивает с *.jpeg, а другую *.jpg
Но полный путь писать не обзяательно...
Теперь все работает. Спасибо.
TarasBer
Цитата

procedure TForm1.Image1MouseEnter(Sender: TObject);
begin
image1.Picture.LoadFromfile(pics[1]);
end;

procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
image1.Picture.LoadFromfile(pics[2]);
end;


А зачем каждый раз винт теребить?

procedure TForm1.Image1MouseEnter(Sender: TObject);
begin
image1.Picture := Buf1.Picture;
end;

procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
image1.Picture := Buf2.Picture;
end;


Buf1 и Buf2 - невидимые компоненты типа TImage с заранее загруженными картинками.
Client
хм, у автора темы вроде как нету этих обработчиков... да еще если картинок много, то что, придется форму TImage'ами заполянять и скрывать?
TarasBer
> да еще если картинок много, то что

Ну тогда создавать их при старте программы, и там же и грузить картинки. Только один раз, при старте.
Cheburashka
Unconneсted, Вы писали следующее:
var
Form1: TForm1;
pics:array[1..piccount] of string=('pictures\1.jpg','pictures\2.jpg');

implementation

{$R *.dfm}

procedure TForm1.Image1MouseEnter(Sender: TObject);
begin
image1.Picture.LoadFromfile(pics[1]);
end;

procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
image1.Picture.LoadFromfile(pics[2]);
end;

end.



я делаю в принципе тоже самое:
  NameS[1] := 'Pictures/1.bmp';
NameS[2] := 'Pictures/2.bmp';
NameS[3] := 'Pictures/3.bmp';
Sprite.LoadFromFile(NameS[1]);

Изображения находятся в папке Pictures вместе с проектом. Выполняю на лазарусе, и выдает ошибку External: SIGSEGV. Помогите пожалуйста (срочно) как это исправить?
Загружаю формат *.bmp
volvo
NameS как описано? Sprite - это что? Если Timage - значит, нужно
Sprite.Picture.LoadFromFile(NameS[1]);

(это работает, только что проверил в Лазарусе)
Cheburashka
Sprite - TBitMap
NameS : array [1..3] of string;
Вот с ним у меня и проблемы возникают) Загружать Picture не получается
volvo
Цитата
Sprite - TBitMap
Стоп. Тогда вопрос - в другом. TBitmap не присутствует на палитре компонентов. Его надо создавать вручную. Ты это делаешь? Как именно? Дальше, а собственно ГДЕ именно (вот меня интересует, при каком событии) ты делаешь подгрузку изображения в TBitmap (тот самый LoadFromFile)? У TBitmap-а НЕТ событий OnMouseEnter/OnMouseLeave. Создал? Как именно? Так что ты либо показывай проект как положено, либо обращайся к гадалкам. Больше на подобные вопросы я отвечать не буду. Никто не должен из тебя клещами вытягивать информацию. Это нужно ТОЛЬКО тебе, описать проблему так, чтобы не надо было переспрашивать.

P.S. (Показать/Скрыть)
Cheburashka
Извините, что сразу не дал полную процедуру... Просто я сначала создал проект... написал тут... в итоге мне тот проект стал не нужен я его удалил. Но вопрос всё равно остается в силе. Сейчас постараюсь воспроизвести:
Я создаю вручную битовую матрицу:
Sprite := TBitMap.Create;
Вызываю я процедуру OnClick кнопки, после чего происходит загрузка всех изображений. Что-то еще я сказать не могу. Далее я просто забиваю массив именами, и пытаюсь загрузить одну из БМ. Ошибка как раз таки выдается на строке загрузки изображения из файла (папка со всеми изображениями присутствовала).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.