Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];

Вниз

Получение координат курсора в динамически созданном TImage   Найти похожие ветки 

 
mnj   (2012-11-01 13:17) [0]

Как можно поучить координаты курсора на TImage, если у меня TImage создается динамически в TScrollBox? Спасибо.

constructor TPage.Create(Owner: TWinControl);
begin
   FImage:= TImage.Create(Owner);
   FImage.Parent:= Owner;
end;


 
MBo ©   (2012-11-01 13:45) [1]

А как получаешь координаты в статически созданном?
Скорее всего - в одном из обработчиков событий. Вот и для динамического можно обработчик события назначить
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=342


 
Leonid Troyanovsky ©   (2012-11-01 14:35) [2]


> mnj   (01.11.12 13:17)

> Как можно поучить координаты курсора на TImage, если у меня
> TImage создается динамически


 TMyImage = class(Timage)
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
 end;

--
Regards, LVT.


 
mnj   (2012-11-01 15:53) [3]


> TMyImage = class(Timage)
>     procedure MouseMove(Shift: TShiftState; X, Y: Integer);
>  override;
>  end;

Понятно, что Image должен быть потомком стандартного, но дело в том, что создаваемый Image входит в состав другого класса:

type
TMyPage = class
 FImage: TMyImage;
  ...
constructor Create(AOwner: TWinControl);
 end;

 TMainForm = class(TForm)
   ...
     sbImage: TScrollBox;
   ...
end;
var
 MainForm: TMainForm;
 Page: TMyPage;

implementation

{$R *.dfm}

procedure TMainForm.acNewExecute(Sender: TObject);
begin
   if Page <> nil then Page.Free;
   Page:= TMyPage.Create(sbImage);
end;


понятно, что нужно использовать OnMouseMove, определенный в TImage, но как?


 
Ega23 ©   (2012-11-01 15:58) [4]


> понятно, что нужно использовать OnMouseMove, определенный
> в TImage, но как?

Назначить динамически созданному TImage обработчик события OnMouseMove, как же иначе-то?


 
MBo ©   (2012-11-01 16:04) [5]

>   if Page <> nil then Page.Free;
Нет смысла так делать, Free не обнуляет Page


 
mnj   (2012-11-01 17:19) [6]


>
> Назначить динамически созданному TImage обработчик события
> OnMouseMove, как же иначе-то?

procedure MouseMove(Shift: TShiftState; X, Y: Integer) - это не он? А как из него получить в классе TMyPage координаты?

> >   if Page <> nil then Page.Free;
> Нет смысла так делать, Free не обнуляет Page

А что же он делает, как не освобождает ресурсы, занятые переменной?


 
Dmitriy   (2012-11-01 17:22) [7]


> > >   if Page <> nil then Page.Free;
> > Нет смысла так делать, Free не обнуляет Page
>
> А что же он делает, как не освобождает ресурсы, занятые
> переменной?


ресурсы освобождает, значению поинтера nil не присваивает.
а если вместо Page.Free использовать FreeAndNil(Page) то тогда в Page после освобождения будет лежать nil


 
mnj   (2012-11-01 17:37) [8]

В хелпе написано: destroys the object and deallocates its memory. Разве это не присваивание переменной nil? Но речь пока все равно о получении X и Y...


 
brother ©   (2012-11-01 17:41) [9]

> destroys the object and deallocates its memory

дестрой <> нил, запомни!
чтобы стало: дестрой = нил, надо использовать FreeAndNil вместо free


 
mnj   (2012-11-01 17:57) [10]

Запомню. Так как про получение координат из моего Image?


 
Leonid Troyanovsky ©   (2012-11-01 21:07) [11]


> mnj   (01.11.12 15:53) [3]

> Понятно, что Image должен быть потомком стандартного, но
> дело в том, что создаваемый Image входит в состав другого
> класса:

 FImage:= TMyImage.Create(Owner);

--
Regards, LVT.


 
mnj   (2012-11-02 01:36) [12]


> FImage:= TMyImage.Create(Owner);

Да, я так и делал:
type TFImage = class(TImage)
     procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
    end;


TPage = class
    private
     FImage: TFImage;
     FNumber: integer;
     function GetNumber: integer;
     procedure SetNumber(ANumber: integer);
    public
     property Number: integer read GetNumber write SetNumber;
     constructor Create(Owner: TWinControl);
    end;


var XPos, YPos: integer;

constructor TPage.Create(Owner: TWinControl);
begin
   FImage:= TFImage.Create(Owner);
   FImage.Parent:= Owner;
   ....
end;


procedure TFImage.MouseMove(Shift: TShiftState; X,Y: integer);
begin
   inherited;
   XPos:= X;
   YPos:= Y;
end;


потом:

 TMainForm = class(TForm)
   tbButtons: TToolBar;
   stBar: TStatusBar;
   sbImage: TScrollBox;
   acList: TActionList;
   imButtons: TImageList;
   Separator1: TToolButton;
   tbNew: TToolButton;
   acNew: TAction;
   procedure acNewExecute(Sender: TObject);
end;

var MainForm: TMainForm;
    Page: TPage;

procedure TMainForm.acNewExecute(Sender: TObject);
begin
   if Page <> nil then FreeAndNil(Page);
   Page:= TPage.Create(sbImage);
end;


но получить движение мыши по свежеиспеченному Image не могу...


 
mnj   (2012-11-02 01:44) [13]

Ни Scrollbox, ни форма не видят движение мыши по Image. Но ведь Image должен каким-то образом ее ловить! Глобальные XPos и YPos в обработчике ничего не дают - я не знаю, где их нужно вызывать, в каком обработчике главного окна,  чтобы вывести в статусбаре.


 
Германн ©   (2012-11-02 02:01) [14]


> mnj   (02.11.12 01:44) [13]
>
> Ни Scrollbox, ни форма не видят движение мыши по Image.

Что значит "ни Scrollbox, ни форма не видят движение мыши по Image"? В приведенном коде нет ничего относящегося ни к Scrollbox, ни к форме где хоть как-то учитывалось/использовалось изменение координат указателя мыши.


 
брат Птибурдукова   (2012-11-02 08:56) [15]


> mnj   (02.11.12 01:36) [12]
Не-не-не.


> TPage = class

public
 property XPos: Integer read FXPos write FXPos;
...


> constructor TPage.Create(Owner: TWinControl);begin    FImage:
> = TFImage.Create(Owner);    FImage.Parent:= Owner;    ..
> ..end;
FImage := TFImage.Create(Self);


> procedure TFImage.MouseMove(Shift: TShiftState; X,Y: integer);
(Owner as TPage).XPos := X;
...


 
icWasya ©   (2012-11-02 09:30) [16]

Для такого не обязательно делать наследника TImage.


TPage = class
   private
    FImage: TImage;
    FNumber: integer;
    function GetNumber: integer;
    procedure SetNumber(ANumber: integer);
    procedure ImageMouseMove(Shift: TShiftState; X,Y: integer);
   public
    property Number: integer read GetNumber write SetNumber;
    constructor Create(Owner: TWinControl);
   end;

var XPos, YPos: integer;

constructor TPage.Create(Owner: TWinControl);
begin
  FImage:= TImage.Create(Owner);
  FImage.Parent:= Owner;
  FImage.OnMouseMove:=ImageMouseMove; //<<======
  ....
end;

procedure TPage.ImageMouseMove(Shift: TShiftState; X,Y: integer);
begin
  // inherited; -- убрать
  XPos:= X;
  YPos:= Y;
end;

потом:

TMainForm = class(TForm)
  tbButtons: TToolBar;
  stBar: TStatusBar;
  sbImage: TScrollBox;
  acList: TActionList;
  imButtons: TImageList;
  Separator1: TToolButton;
  tbNew: TToolButton;
  acNew: TAction;
  procedure acNewExecute(Sender: TObject);
end;

var MainForm: TMainForm;
   Page: TPage;

procedure TMainForm.acNewExecute(Sender: TObject);
begin
  if Page <> nil then FreeAndNil(Page);
  Page:= TPage.Create(sbImage);
end;


 
mnj   (2012-11-02 22:12) [17]


> Германн ©   (02.11.12 02:01) [14]
>
>
> > mnj   (02.11.12 01:44) [13]
> >
> > Ни Scrollbox, ни форма не видят движение мыши по Image.
>
>
> Что значит "ни Scrollbox, ни форма не видят движение мыши
> по Image"? В приведенном коде нет ничего относящегося ни
> к Scrollbox, ни к форме где хоть как-то учитывалось/использовалось
> изменение координат указателя мыши.

Это верно
если я правильно понимаю, то:
В обработчике мыши для формы выводимые параметры не буду меняться в статусбаре, когда курсор находится на панели (и любом другом элементе), расположенной на форме:

type
 TForm1 = class(TForm)
   StatusBar1: TStatusBar;
   Panel1: TPanel;
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
   StatusBar1.Panels[0].Text:= IntToStr(X);
   StatusBar1.Panels[1].Text:= IntToStr(Y);
   StatusBar1.Panels[2].Text:= Sender.ClassName;
end;


Можно, конечно добавить такой же обработчик и для панели:

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
    StatusBar1.Panels[0].Text:= IntToStr(X);
    StatusBar1.Panels[1].Text:= IntToStr(Y);
    StatusBar1.Panels[2].Text:= Sender.ClassName;
end;

и получать координаты в локальной системе координат панели.
но в моем случае, хоть и присваивается FImage.OnMouseMove:=ImageMouseMove (код, приведенный icWasya я попробовал) -  и обработчик ImageMouseMove присутствует (как у icWasya, только добавлен Sender),  экземпляр Page создается, а в нем создается Image, но это не работает все равно - я не вижу способа вывести в статусбаре координаты созданного Image;


 
Leonid Troyanovsky ©   (2012-11-03 00:51) [18]


> mnj   (02.11.12 22:12) [17]


type
 TForm1 = class(TForm)
   Panel1: TPanel;
   StatusBar1: TStatusBar;
   Button1: TButton;
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   Image1: TImage;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
  StatusBar1.Panels[0].Text:= IntToStr(X);
  StatusBar1.Panels[1].Text:= IntToStr(Y);
  StatusBar1.Panels[2].Text:= Sender.ClassName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Image1 := TImage.Create(Panel1);
 Image1.Parent := Panel1;
 Image1.Align := alClient;
 Image1.OnMouseMove := FormMouseMove;
end;

--
Regards, LVT.


 
mnj   (2012-11-03 01:22) [19]

пока не вижу...


 
mnj   (2012-11-03 01:35) [20]

Дошло - я пытался присвоить наоборот: обработчику мыши формы обработчик мыши Image. Конечно, ничего не получалось. Всем спасибо!!!!!



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.003 c
15-1358837752
Дмитрий С
2013-01-22 10:55
2013.06.02
Зачем delphi свой менеджер памяти?


15-1359311215
Jimmy
2013-01-27 22:26
2013.06.02
Оценочные функции игр на доске


2-1351266946
FIL-23
2012-10-26 19:55
2013.06.02
Как обновить данные в DBGrid


15-1358278949
masha
2013-01-15 23:42
2013.06.02
беговые лыжи


15-1358765049
vxxv
2013-01-21 14:44
2013.06.02
Создать определенный класс.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский