{ > Yes, event oriented Programming is very easy using OOP, but as it > comes to TVision, if you need to add your own events, you're stuck. I > just wanted to implement the Windows-style ALT-Press-ALT-Release > event, that activates the Window menu, and I'd had to modify the > Drivers.pas sourceFile to implement it, so I have to find other keys > to activate the menu bar :-( this Really stimulated me so I sat down and implemented the following *without* messing around in DRIVERS.PAS in -believe it or not- 15 minutes! :-))) } Program tryalt; Uses drivers,Objects,views,menus,app,Crt; Const altmask = $8; Var k4017 : Byte Absolute $40:$17; Type tmyapp = Object (TApplication) AltPressed, IgnoreAlt: Boolean; Constructor Init; Procedure InitMenuBar; Virtual; Procedure GetEvent (Var Event: TEvent); Virtual; Procedure Idle; Virtual; end; { low-level Function; returns True when is being pressed } Function AltDown: Boolean; begin AltDown := (k4017 and altmask) = altmask end; Constructor tmyapp.Init; begin inherited init; AltPressed := False; IgnoreAlt := False end; Procedure Tmyapp.InitMenuBar; Var R: TRect; begin GetExtent(R); R.B.Y := R.A.Y + 1; MenuBar := New (PMenuBar, Init(R, NewMenu ( NewSubMenu ('~ð~', hcNoConText, NewMenu ( NewItem ('~A~bout LA-Copy...', '', kbNoKey, cmQuit, hcNoConText, NewLine ( NewItem ('~D~OS Shell', '', kbNoKey, cmQuit, hcNoConText, NewItem ('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoConText, nil))))), NewSubMenu ('~R~ead', hcNoConText, NewMenu ( NewItem ('~D~isk...', 'F5', kbF5, cmQuit, hcNoConText, NewItem ('~I~mage File...', 'F6', kbF6, cmQuit, hcNoConText, NewItem ('~S~ector...', 'F7', kbF7, cmQuit, hcNoConText, NewLine ( NewItem ('~F~ree up used memory', 'F4', kbF4, cmQuit, hcNoConText, nil)))))), (* more menus in the original :-) *) nil))))); end; { modified GetEvent to allow direct usage of Alt-Hotkey } Procedure tmyapp.GetEvent (Var Event: TEvent); begin inherited GetEvent (Event); if (Event.What and (evKeyboard or evMessage)) <> evnothing then IgnoreAlt := True { in Case of keypress or command ignore } end; { Until next time released } Procedure tmyapp.Idle; Var Event: TEvent; begin inherited Idle; if AltDown then { key is down } AltPressed := True { remember this } else begin { is released (again?) } if AltPressed then begin { yes, again. } if not IgnoreAlt then begin { but: did they use Alt-Hotkey? } Event.What := evCommand; { no, let's activate the menu! } Event.Command := cmMenu; PutEvent (Event) end; end; AltPressed := False; { however, is up again } IgnoreAlt := False { so we don't need to ignore it } end; { the next time is released } end; Var myapp: tmyapp; { create an Object of class 'tmyapp' } begin myapp.init; { you know these three lines, don't you? } myapp.run; myapp.done; end. { For convenience I copied the first three menus from my diskcopy clone so don't get confused about the items :-). This Program does not emulate Completely Windows' behaviour, however, it's a good start. Tell me if this is what you wanted! I didn't test it excessively but it does work in this fairly simple Program For activating menus by . The only thing not implemented is 'closing' the menu bar by a second stroke. }