Toon posts:

[Delphi] case Sender of ...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heb dus een probleempje in delphi me deze code:

Delphi:
1
2
3
4
5
6
7
8
9
procedure TFrame3.SelectFolder(Sender: TObject);
 var
  chosenDirectory : string;
begin
case Sender of //ik heb ook al longword(Sender) geprobeerd
  btnOpen:inppath.Text:=chosenDirectory;
  btnOpen2:inpSub.Text:=chosenDirectory;
  end;
end;


dit schijnt dus niet te werken (de case of Sender) =>[Error] frame_o.pas(205): Ordinal type required.Na wat zoeken op google kwam ik op een forum terecht waar men na enkele posts uiteindelijk besluit om het toch maar met if...then..else te doen ([url]http://http://www.mail-archive.com/delphi@delphi.org.nz/msg16643.html[/url] -> forum) Ik heb ook niets gevonden op GoT over dit item, is dit uberhaupt dan wel mogelijk of moet het echt allemaal me if..then...else ?

Dank bij voorbaat
edit:typo

[ Voor 3% gewijzigd door Verwijderd op 23-05-2005 20:13 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Is er iets mis met de error message? Sender is een TObject, en TObject is geen Ordinal type. Ordinal types zijn in goed nederlands aftelbare types, een twee veel.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:15
Je zult het met een ifje moeten doen:

code:
1
2
3
4
5
6
7
8
9
var
  theButton : TButton;
begin
if sender is TButton then begin
  theButton = (TButton)sender;
end;

if theButton.Name = 'btnOpen' then
...


Of misschien kan je dan wel beter doen:
code:
1
if theButton = btnOpen then

Indien dit mogelijk is.

[ Voor 22% gewijzigd door whoami op 23-05-2005 20:24 ]

https://fgheysels.github.io/


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Als aanvulling op Whoami, je kan het ook zo doen

Delphi:
1
2
3
4
5
if (Sender is TButton) then
  if (Sender as TButton).Name = 'btnOpen' then
  begin
    ...
  end;


Je hoeft dan niet een knop toe te wijzen aan een variabele.

[ Voor 4% gewijzigd door FendtVario op 23-05-2005 21:39 ]

www.fendt.com | Nikon D7100 | PS5


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:15
FendtVario schreef op maandag 23 mei 2005 @ 21:39:
Als aanvulling op Whoami, je kan het ook zo doen

Delphi:
1
2
3
4
5
if (Sender is TButton) then
  if (Sender as TButton).Name = 'btnOpen' then
  begin
    ...
  end;


Je hoeft dan niet een knop toe te wijzen aan een variabele.
Nee, dan ga je bij iedere if typecasten..... lijkt me niet leuk.

https://fgheysels.github.io/


Verwijderd

Topicstarter
zoals ik dus had verwacht, er blijkt geen manier te bestaan om dit met een 'case... of' te doen, spijtig... dan worden het maar if..then's

opm: IMHO maareuh, dit lijkt me toch een foutje van de ontwikkelaars,het zou toch mogelijk moeten kunnen zijn, of zie ik dit verkeerd ?( waarschijnlijk :p )

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op maandag 23 mei 2005 @ 22:26:
opm: IMHO maareuh, dit lijkt me toch een foutje van de ontwikkelaars,het zou toch mogelijk moeten kunnen zijn, of zie ik dit verkeerd ?( waarschijnlijk :p )
Een foutje? Waarom? Switch-statements werken in de meeste talen die ik ken alleen op ordinale types.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 06-05 23:07

Klippy

Still Game

Je kan ook iets al dit doen als je liever een case gebruikt.

Delphi:
1
2
3
4
5
6
7
8
var knopnummer : char;

knopnummer := (Sender as TButton).Name[8];

case knopnummer of
   '1': //doe iets;
   '2': //doe iets anders
end;


Mijn Delphi kwaliteiten zijn nogal laag geworden, maar je snapt wel wat ik bedoel denk ik.
Moet je wel zorgen dat je die functie alleen aan je TButtons koppelt natuurlijk, maar dat zal wel zo zijn.

Je neemt dus gewoon het 8e karakter, wat in dit geval het nummer van je knop is en daar vergelijk je op.
Evenyueel nog even een StrToInt er op loslaten en je kan doornummeren tot boven de tien, al moet je dan even 2 karakters nemen, 01 t/m 99 etc..

Weet niet of dit erg netjes is, maar zo zou ik het doen als ik heel veel knopjes had, spaart een hoop tijd :p

[ Voor 6% gewijzigd door Klippy op 23-05-2005 23:10 ]

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Klippy: ook strings zijn geen ordinals, dus een dergelijke oplossing zou ook nog vereisen dat je de StrToInt-functie gebruikt. ;)

Ik heb de jury er even bijgeroepen, het schijnt idd te mogen, mits de Name van een object géén AnsiString is. :+

[ Voor 34% gewijzigd door NMe op 23-05-2005 23:45 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 06-05 23:07

Klippy

Still Game

-NMe- schreef op maandag 23 mei 2005 @ 23:21:
Klippy: ook strings zijn geen ordinals, dus een dergelijke oplossing zou ook nog vereisen dat je de StrToInt-functie gebruikt. ;)
karakters toch wel?

In elk geval in C++... heb niet zo'n verstand van Delphi :P

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 06-05 23:47

Delphi32

Heading for the gates of Eden

Als het allemaal knopjes zijn (of controls van (ongeveer) dezelfde class) kan je natuurlijk ook overwegen de Tag property te gaan gebruiken. Daar stop je gewoon een integer in en hop, je case statement mag blijven:
Delphi:
1
2
3
4
5
case (Sender as TButton).Tag of
  1: DoeJeDing; 
  2: DoeEenAnderDing;
  else ForgetAboutIt;
end;

  • Paul
  • Registratie: September 2000
  • Laatst online: 02-05 07:01
Zo lelijk hoeft een geneste if..else toch ook niet te zijn dat er hier allemaal omwegen worden gezocht?
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if      Sender = myFirstButtonTM  then
  begin
    DoeIets;
  end
else if Sender = MySecondButton   then
  begin
    DoeIetsAnders;
  end;
else if Sender = HeleAndereButton then
  begin
    DoeNogWeerIetsAnders;
  end
else
  begin
    // Zou niet voor mogen komen daar de programmeur de enige
    // is die eventhandlers aan events hangt
    raise Exception.Create('Onbekende sender');
  end;

Als er steeds slechts 1 aanroep gedaan wordt zou je zelfs de begin en de end weg kunnen halen,

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Verwijderd

Topicstarter
Een foutje? Waarom? Switch-statements werken in de meeste talen die ik ken alleen op ordinale types.
@-NMe-: ben dus nog niet zolang met delphi aan het werk, zo leer je ook ineens wat bij :p
(wist dus niet wat ordinale types waren ,heb het even opgezocht :p)

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:15
Klippy schreef op maandag 23 mei 2005 @ 23:08:
Je kan ook iets al dit doen als je liever een case gebruikt.

Delphi:
1
2
3
4
5
6
7
8
var knopnummer : char;

knopnummer := (Sender as TButton).Name[8];

case knopnummer of
   '1': //doe iets;
   '2': //doe iets anders
end;


Dit is echt een bagger oplossing.
Je verplicht jezelf om iedere button dezelfde naam te geven, gevolgd door een nummer.
Wat als je nu eens 11 buttons hebt ?
Mijn Delphi kwaliteiten zijn nogal laag geworden, maar je snapt wel wat ik bedoel denk ik.
Moet je wel zorgen dat je die functie alleen aan je TButtons koppelt natuurlijk, maar dat zal wel zo zijn.

Je neemt dus gewoon het 8e karakter, wat in dit geval het nummer van je knop is en daar vergelijk je op.
Evenyueel nog even een StrToInt er op loslaten en je kan doornummeren tot boven de tien, al moet je dan even 2 karakters nemen, 01 t/m 99 etc..

Weet niet of dit erg netjes is, maar zo zou ik het doen als ik heel veel knopjes had, spaart een hoop tijd :p

https://fgheysels.github.io/

Pagina: 1