Toon posts:

[delphi] alt+enter net als bij media programmas

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Hoe kan ik het beste alt+enter opvangen om mijn media speler fullscreen te zetten? Ik heb al een antal geprobeerd maar het resultaat was: er gebeurd niks. Ik zal natuurlijk weer iets vergeten zijn. Kan iemand mij erbij helpen?

Eerdere code:

if (Key = #13) and (Key = #254) then begin
VideoWindow.FullScreen := not VideoWindow.FullScreen;
btFullScreen.Down := VideoWindow.FullScreen;
end;


Alvast bedankt, Stefan Oostwegel

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:24

Reptile209

- gers -

Dit schiet natuurlijk niet op qua code he: je checkt in één statement of een variabele de ene èn de andere waarde heeft. Nooit dus... ;)
Wat jij zoekt zit in het OnKeyDown en OnKeyUp event van je form: de TShiftState geeft de status van Ctrl, Alt en Delete Shift weer. Kijk daar eens naar en kies één van beiden om mee te werken (Down of Up dus, Down is meestal het makkelijkst denk ik)

offtopic:
Code staat makkelijker tussen [ code] en [ /code] blokken, hoi en je naam moet je maar eens in de algemene FAQ's zoeken ;)

[ Voor 13% gewijzigd door Reptile209 op 16-03-2005 20:42 ]

Zo scherp als een voetbal!


Verwijderd

Topicstarter
ok, ik zal er naar zoeken


offtopic:
Lol ok...zal ik doen

Verwijderd

Topicstarter
Ik heb nu de volgende code:

code:
1
2
3
4
5
6
7
8
procedure TFormDVDPlayer.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=#13 and ssalt:=true then begin
      VideoWindow.FullScreen := not VideoWindow.FullScreen;
  btFullScreen.Down := VideoWindow.FullScreen;
   end;
end;


maar hij geeft een probleem met ssalt:

code:
1
2
[Error] Unit1.pas(308): Operator not applicable to this operand type
[Fatal Error] dvdplayer.dpr(6): Could not compile used unit 'Unit1.pas'


Wat heb ik fout gedaan?

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:24

Reptile209

- gers -

Verwijderd schreef op woensdag 16 maart 2005 @ 20:56:
Ik heb nu de volgende code:

Delphi:
1
2
3
4
5
6
7
8
procedure TFormDVDPlayer.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=#13 and ssalt:=true then begin
      VideoWindow.FullScreen := not VideoWindow.FullScreen;
  btFullScreen.Down := VideoWindow.FullScreen;
   end;
end;


maar hij geeft een probleem met ssalt:

code:
1
2
[Error] Unit1.pas(308): Operator not applicable to this operand type
[Fatal Error] dvdplayer.dpr(6): Could not compile used unit 'Unit1.pas'


Wat heb ik fout gedaan?
Er klopt - met alle respect - geen deuk van je code :)
Probeer dit eens (en ook te snappen...):
Delphi:
1
2
3
4
5
6
7
8
procedure TFormDVDPlayer.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (Key=#13) and ([ssAlt] in Shift) then begin
    VideoWindow.FullScreen := not VideoWindow.FullScreen;
    btFullScreen.Down := VideoWindow.FullScreen;
  end;
end;

Die Shift (als TShiftState) is een set, en met in bekijk je - als ik me niet vergis - of de waarde in blokhaken daarvoor in die set voorkomt. Zok maar eens op de "set operators" of "in" in de Delphi help. En een := is een toewijzing, geen boolean test voor in een if.

offtopic:
Als je [code=Delphi] gebruikt, krijg je ook nog de juiste highlighting ;)

[ Voor 6% gewijzigd door Reptile209 op 16-03-2005 21:09 ]

Zo scherp als een voetbal!


Verwijderd

Topicstarter
Ik heb dus nu de volgende code
Delphi:
1
2
3
4
5
6
7
8
procedure TFormDVDPlayer.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (Key=#13) and ([ssAlt] in Shift) then begin
      VideoWindow.FullScreen := not VideoWindow.FullScreen;
  btFullScreen.Down := VideoWindow.FullScreen;
   end;
end;

Ik begin nu te snappen wat je bedoeld met het hele tshift gebeuren, maar ik krijg bij de key=#13 en bij ([ssAlt] in Shift een foutmelding:

Delphi:
1
2
3
[Error] Unit1.pas(308): Incompatible types
[Error] Unit1.pas(308): Incompatible types: 'Set' and 'Enumeration'
[Fatal Error] dvdplayer.dpr(6): Could not compile used unit 'Unit1.pas'

[ Voor 5% gewijzigd door Verwijderd op 16-03-2005 21:11 ]


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:24

Reptile209

- gers -

My wrong, je moet de blokhaken rond ssAlt weglaten. Dus alleen if ... and (ssAlt in Shift) ... gebruiken.

Edit:
Trouwens, ik gebruik nu in zodat Delphi kijkt of dat ene specifieke element in de set voorkomt. Shift kan dan bijvoorbeeld ook de waarde (ssAlt, ssControl) hebben en toch goed door de if heenkomen. Als je wil dat alleen alt actief is, kan je ook gewoon Shift = ssAlt gebruiken. Ik raad je aan om voor dit soort dingen toch eens een goed boek over Delphi open te slaan, of eens wat te google'n (danwel F1-en) bij dingen waar het mis gaat. Dit is op zich allemaal vrij basic werk.

[ Voor 69% gewijzigd door Reptile209 op 16-03-2005 21:19 ]

Zo scherp als een voetbal!


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

NMe

Quia Ego Sic Dico.

Reptile209 schreef op woensdag 16 maart 2005 @ 21:14:
My wrong, je moet de blokhaken rond ssAlt weglaten. Dus alleen if ... and (ssAlt in Shift) ... gebruiken.

Edit:
Trouwens, ik gebruik nu in zodat Delphi kijkt of dat ene specifieke element in de set voorkomt. Shift kan dan bijvoorbeeld ook de waarde (ssAlt, ssControl) hebben en toch goed door de if heenkomen. Als je wil dat alleen alt actief is, kan je ook gewoon Shift = ssAlt gebruiken. Ik raad je aan om voor dit soort dingen toch eens een goed boek over Delphi open te slaan, of eens wat te google'n (danwel F1-en) bij dingen waar het mis gaat. Dit is op zich allemaal vrij basic werk.
Volgens mij moet je dan juist wel weer blokhaken gebruiken. ;)
Delphi:
1
Shift = [ssAlt]

'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.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 04:01

Tomatoman

Fulltime prutser

Wat ook helpt is logisch inspringen. Voor de compiler maakt het niets uit, maar voor jou als programmeur wel. Het vergroot de leesbaarheid namelijk en verkleint daarmee de kans op programmeerfouten.

Delphi:
1
2
3
4
5
6
7
8
9
procedure TFormDVDPlayer.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_RETURN) and (ssAlt in Shift) then
  begin
    VideoWindow.FullScreen := not VideoWindow.FullScreen;
    btFullScreen.Down := VideoWindow.FullScreen;
  end;
end;
Ik kan me trouwens goed indenken dat je dat gedoe met Key en Shift verwarrend vindt. Let bij Key goed op het datatype. Het is hier een Word, oftewel een 16-bits Integer. Als je wilt checken of Key gelijk is aan de entertoets moet je voor de entertoets dus ook een representatie vinden in de vorm van een Word:
Delphi:
1
if Key = 13 then // 13 is de numerieke code van de entertoets 

of wat duidelijker
Delphi:
1
if Key = VK_RETURN then
Eerst maar eens een trucje toepassen. Typ de regel code hierboven in de Code Explorer van Delphi (je tekstscherm :)), ga met de cursor bovenop VK_RETURN staan en druk tegelijk op Ctrl. Je ziet dan een hyperlink ontstaan naar de plaats waar de waarde van VK_RETURN is gedefinieerd.

Je kunt het natuurlijk ook anders aanpakken, namelijk door karakters te vergelijken:
Delphi:
1
if Chr(Key) = #13 then
Je vergelijkt hier geen waarden van het type Word, maar van het type Char.

Om het nog iets verwarrender te maken is de parameter Key in OnKeyDown en OnKeyUp een Word en in OnKeyPress een Char. In OnKeyPress pak je het daarom een beetje anders aan, waarbij je weer een Word met een Word vergelijkt of een Char met een Char:
Delphi:
1
if Ord(Key) = VK_RETURN then

of
Delphi:
1
if Key = Chr(VK_RETURN) then

of
Delphi:
1
if Key = #13 then

Een goede grap mag vrienden kosten.

Pagina: 1