![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение координат курсора в динамически созданном TImage [D7]
mnj © (2012-11-01 13:17:00)Как можно поучить координаты курсора на TImage, если у меня TImage создается динамически в TScrollBox? Спасибо.
constructor TPage.Create(Owner: TWinControl);
begin
FImage:= TImage.Create(Owner);
FImage.Parent:= Owner;
end;
mnj (2012-11-03 01:35:00) [1]Дошло - я пытался присвоить наоборот: обработчику мыши формы обработчик мыши Image. Конечно, ничего не получалось. Всем спасибо!!!!!
mnj (2012-11-03 01:22:00) [2]пока не вижу...
Leonid Troyanovsky (2012-11-03 00:51:00) [3]
> 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-02 22:12:00) [4]
> Германн © (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;
icWasya (2012-11-02 09:30:00) [5]Для такого не обязательно делать наследника 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;
брат Птибурдукова (2012-11-02 08:56:00) [6]
> 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;
...
Германн (2012-11-02 02:01:00) [7]
> mnj (02.11.12 01:44) [13]
>
> Ни Scrollbox, ни форма не видят движение мыши по Image.
Что значит "ни Scrollbox, ни форма не видят движение мыши по Image"? В приведенном коде нет ничего относящегося ни к Scrollbox, ни к форме где хоть как-то учитывалось/использовалось изменение координат указателя мыши.
mnj (2012-11-02 01:44:00) [8]Ни Scrollbox, ни форма не видят движение мыши по Image. Но ведь Image должен каким-то образом ее ловить! Глобальные XPos и YPos в обработчике ничего не дают - я не знаю, где их нужно вызывать, в каком обработчике главного окна, чтобы вывести в статусбаре.
mnj (2012-11-02 01:36:00) [9]
> 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 не могу...
Leonid Troyanovsky (2012-11-01 21:07:00) [10]
> mnj (01.11.12 15:53) [3]
> Понятно, что Image должен быть потомком стандартного, но
> дело в том, что создаваемый Image входит в состав другого
> класса:
FImage:= TMyImage.Create(Owner);
--
Regards, LVT.
mnj (2012-11-01 17:57:00) [11]Запомню. Так как про получение координат из моего Image?
brother (2012-11-01 17:41:00) [12]> destroys the object and deallocates its memory
дестрой <> нил, запомни!
чтобы стало: дестрой = нил, надо использовать FreeAndNil вместо free
mnj (2012-11-01 17:37:00) [13]В хелпе написано: destroys the object and deallocates its memory. Разве это не присваивание переменной nil? Но речь пока все равно о получении X и Y...
Dmitriy (2012-11-01 17:22:00) [14]
> > > if Page <> nil then Page.Free;
> > Нет смысла так делать, Free не обнуляет Page
>
> А что же он делает, как не освобождает ресурсы, занятые
> переменной?
ресурсы освобождает, значению поинтера nil не присваивает.
а если вместо Page.Free использовать FreeAndNil(Page) то тогда в Page после освобождения будет лежать nil
mnj (2012-11-01 17:19:00) [15]
>
> Назначить динамически созданному TImage обработчик события
> OnMouseMove, как же иначе-то?
procedure MouseMove(Shift: TShiftState; X, Y: Integer) - это не он? А как из него получить в классе TMyPage координаты?
> > if Page <> nil then Page.Free;
> Нет смысла так делать, Free не обнуляет Page
А что же он делает, как не освобождает ресурсы, занятые переменной?
MBo (2012-11-01 16:04:00) [16]> if Page <> nil then Page.Free;
Нет смысла так делать, Free не обнуляет Page
Ega23 (2012-11-01 15:58:00) [17]
> понятно, что нужно использовать OnMouseMove, определенный
> в TImage, но как?
Назначить динамически созданному TImage обработчик события OnMouseMove, как же иначе-то?
mnj (2012-11-01 15:53:00) [18]
> 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, но как?
Leonid Troyanovsky (2012-11-01 14:35:00) [19]
> mnj (01.11.12 13:17)
> Как можно поучить координаты курсора на TImage, если у меня
> TImage создается динамически
TMyImage = class(Timage)
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
end;
--
Regards, LVT.
MBo (2012-11-01 13:45:00) [20]А как получаешь координаты в статически созданном?
Скорее всего - в одном из обработчиков событий. Вот и для динамического можно обработчик события назначить
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=342