Toon posts:

[delphi] Objecten runtime creëeren, hoe een event aanroepen?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Goedenavond!

Ik heb met Delphi een variabel aantal plaatjes gemaakt. Dus de gebruiker voert runtime in hoeveel plaatjes ie op één form wil hebben, en die worden vervolgens gecreëerd in een array...
Alles goed en wel, de plaatjes verschijnen. Maar hoe kan ik nu opvangen wanneer de gebruiker op zo'n plaatje klikt en daar een reactie op geven (plaatje uitvergroten bijvoorbeeld)? In design-time schrijf je daar gewoon een on-click event voor, maar hoe doe je dat met een object dat je runtime creëert? Ik heb al gezocht, maar nergens echt duidelijk hoe ik dat moet doen, terwijl het toch best een veelgebruikte functie is lijkt me? Alvast bedankt!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Als je een object at-runtime creeërt kan je er ook een event aanhangen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  aButton           : TButton;
begin
   aButton := TButton.Create (Self);
   aButton.Caption := 'Test';
   aButton.OnClick := anOkEventHandler;
end;

procedure anOkEventHandler ( sender  : TObject )
begin

  MessageDlg ( TButton(sender).Caption, mtInformation, [mbOk], 0);

end;

https://fgheysels.github.io/


  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 20-08 11:58
Ok, mijn Delphi is een beetje roestig aan het worden, maar het moet ongeveer zo. Je geeft gewoon aan dat het onclick event een functie uitvoert:

TImage1.OnClick := Functie1(... parameters ...);

De parameters van Functie1 moeten hetzelfde zijn als die van een 'echt' onclick event. Dus je moet even opzoeken welke parameters er met een onclick event van een TImage (of wat je ook gebruikt) worden doorgegeven en die gebruik je dan ook hier in je zelf geschreven functie.

Functie1 moet je natuurlijk nog even schrijven he, maar dat lijkt me duidelijk.

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
[quote]Schmoove schreef op 10 June 2003 @ 21:35:
De parameters van Functie1 moeten hetzelfde zijn als die van een 'echt' onclick event. Dus je moet even opzoeken welke parameters er met een onclick event van een TImage (of wat je ook gebruikt) worden doorgegeven en die gebruik je dan ook hier in je zelf geschreven functie.
Functie1 is dan ook een 'echte' event handler voor het OnClick event.
Het is niet omdat je die handler niet creeërt via de IDE (object inspector), dat het daarom geen 'echte' event-handler is.

Delphi is Object Oriented. De buttons en andere controls enzo die je ziet zijn classes. Die classes hebben properties , methods en events. Om het de programmeur wat makkelijker te maken, kan je die properties en events at design time mbhv de object inspector instellen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Hmmm... Maar nu heb ik ook nog dezelfde situatie met een stel trackbars en daar heb ik de onchange event voor nodig. De help geeft aan dat ik daarvoor iets moet doen met een tnotifyevent. Ik heb de bovenstaande code geprobeerd, maar dan krijg ik de melding:
Incompatible types: 'method pointer and regular procedure'
Wat nu?
Oh ja: (offtopic) weet iemand hoe ik de control kan gebruiken die ook gebruikt wordt bij de windows-volume instellingen (het zijn een soort van trackbars, maar toch weer niet)

  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 20-08 11:58
Hence the quotes :P, niet zo miereneuken jonge.....
Tuurlijk is het net zo echt.... ik bedoel alleen, als je een onclick event pakt die de IDE genereert en daar de parameters van kopieert zit je goed.

[ Voor 3% gewijzigd door Schmoove op 10-06-2003 21:42 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Verwijderd schreef op 10 June 2003 @ 21:40:
Hmmm... Maar nu heb ik ook nog dezelfde situatie met een stel trackbars en daar heb ik de onchange event voor nodig. De help geeft aan dat ik daarvoor iets moet doen met een tnotifyevent. Ik heb de bovenstaande code geprobeerd, maar dan krijg ik de melding:
Welk stukje relevante code heb je dan nu?

OnChange is property van het type TNotifyEvent.
Als je daar dus een eventhandler wilt aan hangen, zul je er een procedure moeten aanhangen die voldoet aan dat type TNotifyEvent:

dat wil zeggen: een procedure (geen function) die een parameter neemt van het type object.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Het werkt al... Ik heb de procedure boven aan de unit toegevoegd in de private section en hij heet nu niet:
procedure slider_change(sender: Tobject);

maar:
procedure Tfrm_scenemixer.slider_change(sender: Tobject);

En nu werkt het dus! Bedankt voor de hulp, ik heb weer wat geleerd vandaag :)!

Verwijderd

Topicstarter
Owja. Weet iemand hoe ik de control kan gebruiken die ook gebruikt wordt bij de windows-volume instellingen? (het zijn een soort van trackbars, maar toch weer niet)

Verwijderd

Topicstarter
Hmmm... Ik zit al weer met een volgend probleem. Ik heb dus die trackbars, met daarboven een textbox waarin de waarde weergegeven wordt van de trackbar. Alles wordt runtime aangemaakt en inmiddels weet ik hoe ik moet reageren op een trackbar onchange event. Maar hoe kan ik nu de waarde van die ene trackbar uitlezen en in de goede textbox (die erboven) zetten. De waarde uitlezen is niet zo lastig, ik moet dus eigenlijk gewoon de index hebben van de array waarin de trackbar zit (die is nl. hetzelfde als de index van de bijbehorende textbox). Hoe doe ik dit? (Ik hoop dat dit niet al te vaag is...)

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Alle componenten hebben een Tag property waar je informatie in kwijt kunt....
Je kunt bv. die index in die Tag property bewaren.

https://fgheysels.github.io/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

whoami schreef op 10 June 2003 @ 21:44:
[...]

Welk stukje relevante code heb je dan nu?

OnChange is property van het type TNotifyEvent.
Als je daar dus een eventhandler wilt aan hangen, zul je er een procedure moeten aanhangen die voldoet aan dat type TNotifyEvent:

dat wil zeggen: een procedure (geen function) die een parameter neemt van het type object.
Ikzelf heb nog nooit een normale procedure (of functie) als eventhandler zien werken. Als je dezelfde (niet werkende) procedure als method van een object gebruikt, werkt het wel. Dit komt omdat bijv. de TNotify event een "procedure of object" is, waarbij dus word afgedwongen dat de procedure die word aangeroepen een method moet zijn van een object.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1