[Back to OOP SWAG index] [Back to Main SWAG index] [Original]
{
> 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 <Alt> 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 <Alt> next time released }
Procedure tmyapp.Idle;
Var Event: TEvent;
begin
inherited Idle;
if AltDown then { <Alt> key is down }
AltPressed := True { remember this }
else begin { <Alt> 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, <Alt> is up again }
IgnoreAlt := False { so we don't need to ignore it }
end; { the next time <Alt> is released }
end;
Var myapp: tmyapp; { create an Object of class 'tmyapp' }
begin
myapp.init; { you know these three lines, don't you? <g> }
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 <Alt>. The only thing not implemented is
'closing' the menu bar by a second <Alt> stroke.
}
[Back to OOP SWAG index] [Back to Main SWAG index] [Original]