Форум: "Начинающим";
Текущий архив: 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