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?
- Rejestracja:ponad 10 lat
- Ostatnio:około 10 lat
- Postów:4
0

- Rejestracja:prawie 17 lat
- Ostatnio:około 3 lata
- Lokalizacja:Szczecin
- Postów:4191
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;
//...
lightinside
Nick mówi że nauczy się korzystać z google :P Nie że umie :D