Autor Beitrag
exploblob
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 13.08.11 12:45 
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):
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Sa 13.08.11 12:57 
Hallo und :welcome: ,

OnClick ist keine Methode sondern ein Event. Für dieses Event musst du einfach nur den Methodennamen (ohne Parameterliste) übergeben. Du hast auch schon darauf geachtet, dass die Parameter gleich sind.

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


Viele Grüße
Regan

Für diesen Beitrag haben gedankt: exploblob
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Sa 13.08.11 13:01 
Ich habe das bei einem Projekt etwa so umgesetzt:
ausblenden volle Höhe 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;

Für diesen Beitrag haben gedankt: exploblob
exploblob Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
self.OnClick := @ChangePicture;