Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.06.02;
Скачать: CL | DM;

Вниз

Получение координат курсора в динамически созданном 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
2-1351936642
Очень Злой
2012-11-03 13:57
2013.06.02
Получить текст под мышкой из чужого окна


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


15-1358856295
Пинта Виски
2013-01-22 16:04
2013.06.02
Изменить чарсет сервера (Oracle)


2-1351748364
braza
2012-11-01 09:39
2013.06.02
потоки->логи


15-1358877111
Дмитрий С
2013-01-22 21:51
2013.06.02
Почтовый ретранслятор.