Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - OOP -> self


exploblob - Sa 13.08.11 12:45
Titel: OOP -> self
Hallo!
Ich bin ein echter Delphi Neuling!
Zurzeit beschäftige ich mich mit OOP (in Delphi).
Nun stehe ich vor folgendem Problem:
Ich habe eine Kind Klasse von TImage erstellt.
Diese Kindklasse lädt automatisch ein Bild und zeigt es auf dem Bildschirm an.
Wenn nun auf dieses Bild drauf geclickt werden soll (OnClick), soll das Bild "ein anderes Werden",
sprich es wird ein anderes Bild geladen und ausgegeben.
Probleme habe ich nun bei der Realisierung!

Im Konstruktor müsste so weit ich weiß die Prozedur für OnClick festgelegt sein, das habe ich mit folgendem Code realisiert (vereinfacht dargestellt):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//steht im Konstruktor
self.OnClick := self.ChangePicture(Form1);


procedure TMyImage.ChangePicture(Sender: TObject);
begin
  //anderes Bild laden, usw.
end;


Leider scheint das ganze gar nicht zu funktionieren!
Auch weiß ich nicht, wie ich hier self ein zu setzen habe.


Regan - Sa 13.08.11 12:57

Hallo und :welcome: ,

OnClick ist keine Methode sondern ein Event [http://www.delphi-treff.de/tutorials/vcl/komponenten-entwicklen/ereignisse-events/]. Für dieses Event musst du einfach nur den Methodennamen (ohne Parameterliste) übergeben. Du hast auch schon darauf geachtet, dass die Parameter gleich sind.


Delphi-Quelltext
1:
2:
//steht im Konstruktor
self.OnClick := self.ChangePicture;


Viele Grüße
Regan


Andreas L. - Sa 13.08.11 13:01

Ich habe das bei einem Projekt etwa so umgesetzt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
  TMyImage = class(TImage)
  private
    FPicture: TPicture;
    FClickPicture: TPicture;
    FOnClick: TNotifyEvent;
    FClicked: Boolean;
  protected
    procedure SetPicture(Value: TPicture);
    procedure SetClickPicture(Value: TPicture);
    procedure HandleClick(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Picture: TPicture read FPicture write SetPicture;
    property ClickPicture: TPicture read FClickPicture write SetClickPicture; 
    property OnClick: TNotifyEvent read FOnClick write FOnClick;
  end;

constructor TMyImage.Create(AOwner: TComponent); 
begin
  inherited Create(AOwner);

  FPicture := TPicture.Create;
  FClickPicture := TPicture.Create;

  inherited OnClick := HandleClick;
end;

procedure TMyImage.HandleClick(Sender: TObject);
begin
  FClicked := not FClicked;

  if FClicked then
    inherited Picture := FClickPicture
  else
    inherited Picture := FPicture;

  if Assigned(FOnClick)
    OnClick(Sender);
end;


exploblob - Sa 13.08.11 13:06

Leider sagt er mir dann, dass ich zu wenig Parameter übergebe...

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Wahrscheinlich liegt es daran, dass ich Lazarus benutze,
auf jeden Fall habe ich das Problem aber folgendermaßen gelöst:

Delphi-Quelltext
1:
self.OnClick := @ChangePicture;