Odwołanie do pozycji własnego komponentu

0

Witam!
Próbuję stworzyć własny komponent, który będzie oparty na TImage. Jego celem będzie wyświetlenie się obrazka w losowej pozycji po kliknięciu na niego. Problem pojawia się, kiedy chcę się odwołać do jego właściwości top i left w procedurze OnClick. Komunikat mówi, że ta właściwość nie jest dostępna w tym miejscu. W jaki sposób można się odwołać do położenia własnego komponentu?

2

Poprzez Top i Left w metodach zaś w innych funkcjach/procedurach poprzez obj.Top i obj.Left.

1

Wypadało by pokazać kod, który nie działa. Od razu było by wiadomo co tam robisz. Niby nick Twój wskazuje, że z Google korzystasz, ale TBrain nie używasz już przy tym niestety. Poniższy kod działa bez problemów. Nie wiem czy tak do końca się powinno robić, ale imo działa jak należy. Zawsze możesz pozmieniać kod do swoich potrzeb. Ale korzystaj z TBrain!

unit Unit1;

interface

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

type
  TBrainImage = class(TImage)
  private
    FOwner : TWinControl;
    OriginalWndProc : TWndMethod;
    procedure MyOnLeftClick(Sender : TObject);
    procedure SubClassWndProc(var AMessage : TMessage);
  public
    constructor Create(AOwner : TComponent); override;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender : TObject);
  private
    procedure AdditionalOnImageClick(Sender : TObject);
  public
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TBrainImage.MyOnLeftClick(Sender : TObject);
begin
  Left := RandomRange(0, FOwner.ClientWidth - Self.Width);
  Top := RandomRange(0, FOwner.ClientHeight - Self.Height);
end;

procedure TBrainImage.SubClassWndProc(var AMessage : TMessage);
begin
  if AMessage.Msg = WM_LBUTTONDOWN then
  begin
    MyOnLeftClick(Self);
    if Assigned(OnClick) then
    begin
      OnClick(Self);
    end;
  end;
  OriginalWndProc(AMessage);
end;

constructor TBrainImage.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FOwner := TWinControl(AOwner);
  OriginalWndProc := WndProc;
  WindowProc := SubClassWndProc;
end;

procedure TForm1.AdditionalOnImageClick(Sender : TObject);
var
  Img : TBrainImage;
begin
  Img := TBrainImage(Sender);
  if Img <> nil then
  begin
    Caption := Format('X: %d / Y: %d', [Img.Left, Img.Top]);
  end;
end;

procedure TForm1.FormCreate(Sender : TObject);
var
  Test : TBrainImage;
begin
  Randomize;
  Test := TBrainImage.Create(Self);
  with Test do
  begin
    Parent := Self;
    AutoSize := True;
    Cursor := crHandPoint;
    Picture.Icon := Application.Icon;
    OnClick := AdditionalOnImageClick;
  end;
end;
//...

1 użytkowników online, w tym zalogowanych: 0, gości: 1