Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Delphi | Image | OnMouseMove


Автор: ReZuS 12.7.2010, 12:32
Народ подскажите пожалуйста как сделать чтобы при наведении курсора на компоненту image она исчезала, или при убирание корсара появлялась! Или наоборот при наведении курсора в определенные координаты появлялась и исчезала! Я вот думал с помощью свойства visibla и события OnMouseMove! Но что-то не выходит...
P.S. Только если можно поподробнее пожалуйста!!!

Автор: Keeper89 12.7.2010, 14:13
1) Запомнить координаты и размеры изображения.
2) В MouseMove у Image убирать картинку, В MouseMove у объекта, на котором она находится проверять координаты для ее отобажения.

Автор: ReZuS 12.7.2010, 14:20
1) Ну вот допустим размер изображенииея 89х89,а координаты 0,360!
2) А здесь бы поподробнее пожалуйста! А то я совсем новичок:(

Автор: Frees 12.7.2010, 14:36
Код

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  x := x - Image1.Left;
  y := y - Image1.Top;
  if not((X in [0..10]) and (y in [0..10])) then
    Image1.Visible := true

end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (X in [0..10]) and (y in [0..10]) then
    Image1.Visible := False;
end;

Автор: PsiMagistr 12.7.2010, 14:37
Ну например так:

Код

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if X < 200 then Image.Visible := false
 else
   Image.Visible := true;
end;


Х - переменная хранящая горизонтальную координату мышки. Таким образом, если горизонталь превысит 200 единиц, картинка исчезнет. Во всех других случаях будем ее показывать. 

Автор: Frees 12.7.2010, 14:40
~FoX~, если Image виден и возить над ним мышкой то MouseMove форме не будет приходить

Автор: ~FoX~ 12.7.2010, 14:45
Frees, Сори, я думал наобарот надо... )))) Удалил пост...

Автор: ReZuS 12.7.2010, 14:51
Frees, все сделал как ты мне написал, но рекации ни какой:(

Автор: Frees 12.7.2010, 14:54
Цитата(ReZuS @  12.7.2010,  17:51 Найти цитируемый пост)
Frees, все сделал как ты мне написал, но рекации ни какой:(

Image у тебя непосредственно на форме лежит? если нет то FormMouseMove должен быть у того контрола на котором лежит Image

Добавлено @ 14:55
эффект от моего примера такой - наводишь на левый верхний угол мышь картинка исчезла, убираешь мышь появляется

Автор: ReZuS 12.7.2010, 15:06
Хм...чтоб не путаться у себя в коде, даже создал новую чистую форму, добавил картинку в верхний левый угол и прописал твой код, и всё равно ни чего:(:(

Автор: PsiMagistr 12.7.2010, 15:10
Код

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if (x >= Img.Left) and (X<=Img.Left + Img.Width) and (Y>=Img.Top) and (Y<=Img.Top+img.Height)   then Img.Visible := true
  else Img.Visible := false;
end;


Вот. Если я правильно понял, что вы хотите. Теперь если мышь будет попадать в площадь картинки, она будет становиться видимой. Иначе - нет.

Можно даже так сделать:

Код

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 Img.Visible := (x >= Img.Left) and (X<=Img.Left + Img.Width) and (Y>=Img.Top) and (Y<=Img.Top+img.Height);

end;

Автор: PsiMagistr 12.7.2010, 16:07
Вот еще один вариант. теперь если:

Навести мышь на картинку - она исчезает. Убрать мышь из координатной "зоны" невидимой картинки - она появляется.

Автор: ReZuS 12.7.2010, 16:54
Вообщем все полусилось, спасибо за помощь! Но появилась проблема, у меня на форме три компонента image, одна на всю форму и две других маленькие одинаковых размеров, и одна компонента под другой! И вот чтобы при наведение курсора верхняя компонента image исчезала, но я делаю все как надо но она почему то не исчезает!!! Посмотрите и помогите еще пожалуйста!!!

Автор: PsiMagistr 12.7.2010, 17:23
Погодите немного. Я постараюсь Вам помочь.

Просмотрите этот вариант. Так же я убрал из описания один модуль. В дельфи 6 он не открывается.

Итак:

При наведении мыши на картинку она исчезает.

При убирании указателя с зоны невидимой картинки она появляется

RezuS, скачайте исполняемый файл со второй страницы.


Автор: ReZuS 12.7.2010, 17:35
Цитата(PsiMagistr @ 12.7.2010,  17:23)
Погодите немного. Я постараюсь Вам помочь.

Просмотрите этот вариант. Так же я убрал из описания один модуль. В дельфи 6 он не открывается.

Итак:

При наведении мыши на картинку она исчезает.

При убирании указателя с зоны невидимой картинки она появляется.

А почему архив такой маленький? Он у меня не открывается:(

Автор: PsiMagistr 12.7.2010, 17:47
Давайте сделаем так. Запустите этот исполняемый файл. Просмотрите как ведет себя картинка. Если Вас устроит я дам Вам код.

Автор: ReZuS 12.7.2010, 18:12
Цитата(PsiMagistr @ 12.7.2010,  17:47)
Давайте сделаем так. Запустите этот исполняемый файл. Просмотрите как ведет себя картинка. Если Вас устроит я дам Вам код.

Ага устраивает, если я правильно понимаю то моя затея получится!!! Вроде... Выложи код я проверю! И спасибо за помощь!!!

Автор: PsiMagistr 12.7.2010, 18:24
Хорошо. Итак приступим. Найдите у себя в проекте то изображение которое должно исчезать. В инспекторе объектов отыщите обработчик для этого изображения OnMouseMove. Туда запишите:


Код

Img2.Visible := False; //Img2 это имя изображения, которое должно исчезать.


Таким образом должно получиться:

Код

procedure TForm1.Img2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);//Начало обработчика.
begin
Img2.Visible := False; //Это мы написали сами
end; //Конец обработчика


Теперь отыщите OnMouseMove изображения фона. (обратите внимание, не формы (!) а самого изображения-фона, с единорогом которое!) и впишите туда:

Код

if  (y < Img2.top) or (y >img.Top+img.Height) or (x < img2.Left) or (x > img2.Left+img2.Width)  then Img2.Visible := true; //img2 это по прежнему имя исчезающего изображения.


У вас должно получится:

Код

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer); //Начало обработчика.
begin
  if  (y < Img2.top) or (y >img.Top+img.Height) or (x < img2.Left) or (x > img2.Left+img2.Width)  then Img2.Visible := true; //Это мы написали сами.
end; //Конец обработчика



Надеюсь все у Вас получится. Отпишитесь в любом случае.




Автор: ReZuS 12.7.2010, 18:31
PsiMagistr, да, да, да, да, всё получилосьsmilesmile Спасибо тебе большое за помощь, я б не знаю что без твоей помощи делал!!!

Автор: PsiMagistr 12.7.2010, 18:34
Всего Вам доброго! Обращайтесь.

Автор: ReZuS 12.7.2010, 18:41
А если мне еще нужно аналогичную картинку добавить я в изоброжение фона добавляю? 

Код


begin
  if  (y < Img3.top) or (y >img3.Top+img3.Height) or (x < img3.Left) or (x > img3.Left+img3.Width)  then Img3.Visible := true // Где img3 новое исчезавшое изображение


Автор: PsiMagistr 12.7.2010, 18:47
Если Вам нужны аналогичные операции для второй картинки и если эта вторая я картинка лежит на изображении-фоне, то да. 

Автор: ReZuS 12.7.2010, 18:51
Цитата(PsiMagistr @ 12.7.2010,  18:47)
Если Вам нужны аналогичные операции для второй картинки и если эта вторая я картинка лежит на изображении-фоне, то да.

Код

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if  (y < Img2.top) or (y >img2.Top+img2.Height) or (x < img2.Left) or (x > img2.Left+img2.Width)  then Img2.Visible := true
end;
 begin
if  (y < Img3.top) or (y >img3.Top+img3.Height) or (x < img3.Left) or (x > img3.Left+img3.Width)  then Img3.Visible := true
end;


Что я не так делаю? Он на этой строке ругается 
Код

if  (y < Img3.top) or (y >img3.Top+img3.Height) or (x < img3.Left) or (x > img3.Left+img3.Width)  then Img3.Visible := true

Автор: PsiMagistr 12.7.2010, 19:00
Для начала проверьте есть ли у Вас картинка с именем (Name) img3. Скорей всего у Вас нет картинки с таким именем.

В конце каждой строки должен стоять оператор точка с запятой.

Немного подправил код.

Код

if  (y < Img3.top) or (y >img3.Top+img3.Height) or (x < img3.Left) or (x > img3.Left+img3.Width)  then Img3.Visible := true;

Автор: ReZuS 12.7.2010, 19:11
Цитата(PsiMagistr @ 12.7.2010,  19:00)
Для начала проверьте есть ли у Вас картинка с именем (Name) img3. Скорей всего у Вас нет картинки с таким именем.

В конце каждой строки должен стоять оператор точка с запятой.

Да нет все на месте, имж имеется 
Вот какие ошибки выдает:
[Error] Unit1.pas(71): Undeclared identifier: 'y'
[Error] Unit1.pas(78): Missing operator or semicolon
[Error] Unit1.pas(22): Unsatisfied forward or external declaration: 'TForm1.Img3MouseMove'
[Fatal Error] Project2.dpr(7): Could not compile used unit 'Unit1.pas'

Автор: PsiMagistr 12.7.2010, 19:12
Шлите исходник - посмотрю.


Автор: ReZuS 12.7.2010, 19:21
Цитата(PsiMagistr @ 12.7.2010,  19:12)
Шлите исходник - посмотрю.

В исходнике там лишние вещи прошу на них внимания не обращать!

Автор: PsiMagistr 12.7.2010, 19:21
Так. для начала. 


Цитата(ReZuS @  12.7.2010,  18:51 Найти цитируемый пост)
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if  (y < Img2.top) or (y >img2.Top+img2.Height) or (x < img2.Left) or (x > img2.Left+img2.Width)  then Img2.Visible := true
end;
 begin
if  (y < Img3.top) or (y >img3.Top+img3.Height) or (x < img3.Left) or (x > img3.Left+img3.Width)  then Img3.Visible := true
end;



Обработчик записан неверно.

Вот как должно быть.

Код

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer); //заголовок обработчика с параметрами

begin //Начало обработчика
if  (y < Img2.top) or (y >img2.Top+img2.Height) or (x < img2.Left) or (x > img2.Left+img2.Width)  then Img2.Visible := true; //Действие первое
if  (y < Img3.top) or (y >img3.Top+img3.Height) or (x < img3.Left) or (x > img3.Left+img3.Width)  then Img3.Visible := true; //Действие второе
end; //Конец обработчика

Автор: ReZuS 12.7.2010, 19:28
Ага)) спасибо, тупанул! А изображение3 проподает но почему то не появляется!

Автор: PsiMagistr 12.7.2010, 19:32
Проверьте лежит ли это изображение именно на фоне (картинка единорог) или на каком нибудь другом изображении. Это очень важно.

Автор: ReZuS 12.7.2010, 19:39
Цитата(PsiMagistr @ 12.7.2010,  19:32)
Проверьте лежит ли это изображение именно на фоне (картинка единорог) или на каком нибудь другом изображении. Это очень важно.

Ну я так понимаю на фоновой картинке оно лежит:

Автор: PsiMagistr 12.7.2010, 19:50
Код

procedure TForm1.Img2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Img2.Visible := false;
end;


Код

procedure TForm1.Img3MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
img3.Visible :=false;
end;


Код

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if  (y < Img2.top) or (y >img2.Top+img2.Height) or (x < img2.Left) or (x > img2.Left+img2.Width)  then Img2.Visible := true;
  if  (y < Img3.top) or (y >img3.Top+img3.Height) or (x < img3.Left) or (x > img3.Left+img3.Width)  then Img3.Visible := true; //Äåéñòâèå âòîðîå
end;





Автор: ReZuS 12.7.2010, 19:56
Все робит! еще раз спасибо за помощьsmile Очень помогли!!!

Автор: PsiMagistr 13.7.2010, 08:04
а что хоть пишешь то?

Автор: ReZuS 14.7.2010, 13:04
Тест в делфи по делфиsmile Просто форму один немного нужно было пооригинальничатьsmile Вот щас мозг ломаю над кодом самого теста, милион раз уже все переделывалsmile Один маленький и один огромный осячки осталисьsmile

Автор: RedFire 5.5.2011, 14:20
Привет всем, пробую по вашему коду написать кнопки ток чет не получается((
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls;

type
  TForm1 = class(TForm)
    Img: TImage;
    Img1: TImage;
    Img2: TImage;
    Img3: TImage;
    Img4: TImage;
    Img5: TImage;
    Img6: TImage;
    Img7: TImage;
    Img8: TImage;
    Img9: TImage;
    Img10: TImage;
    Img11: TImage;
    Img12: TImage;
    Img13: TImage;
    procedure ImgMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Img2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Img1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Img1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.ImgMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Img.Visible :=false;
if Img.Visible =false then Img1.Visible :=true;
end;

procedure TForm1.Img2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Img2.Visible := false;
if Img2.Visible =false then Img3.Visible :=true;
end;


procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if  (y < Img.top)  or (y >img.Top+img.Height)   or (x < img.Left)  or (x > img.Left+img.Width)   then Img.Visible := true; if Img.Visible =true  then Img1.Visible :=false;
  if  (y < Img2.top) or (y >img2.Top+img2.Height) or (x < img2.Left) or (x > img2.Left+img.Width)  then Img2.Visible := true; if Img2.Visible =true then Img3.Visible :=false;
end;
end.


что тут не так, первая кнопка нормально при наведении пропадает появляется другая, а вторая даже пропадать не хочет...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)