Тем не менее, WSO можно использовать и в обычных системах программирования, например в Delphi.
Обычно в таких системах программирования нет стандартных средств для написания обработчиков событий. Для определения событий в Delphi написан простой и небольшой модуль WSO.PAS. Обработчик события передается в WSO путем создания COM-объекта (описанного в модуле WSO.PAS и реализующего частично функцию, описанную в стандарте ECMA 262) с указателем на функцию или процедуру Delphi.
Один из примеров:
//WindowSystemObject (WSO) example
//Copyright (C) Veretennikov A. B. 2004
program Test;
uses
Windows,
ComObj,
ActiveX,
SysUtils,
WSO,
WSOTest,
Variants;
{$R XP.RES}
{$R *.RES}
Var
t,f,o:OleVariant;
procedure CloseFormHandler(Sender:OleVariant);
begin
Sender.Form.Close;
end;
procedure ButtonClick(Sender:OleVariant);
begin
f.MessageBox('Button '+Sender.Text+': OnClick');
end;
procedure FormMouseLeave(Sender:OleVariant);
begin
f.StatusBar.Text := 'No Mouse in Control';
end;
procedure FormMouseMove(Sender,X,Y,Flags:OleVariant);
begin
f.StatusBar.Text:=IntToStr(X)+' x '+IntToStr(Y);
end;
procedure FormMouseDown(Sender,X,Y,Button,Flags:OleVariant);
begin
f.MessageBox(IntToStr(X)+' x '+IntToStr(Y)+', Button: '+IntToStr(Button));
end;
procedure FormKeyDown(Sender,Key,Flags:OleVariant);
begin
if (Key<>27) and (Key<>112) then f.MessageBox('OnKeyDown, Key = '+IntToStr(Key));
end;
procedure HelpAbout(Sender:OleVariant);
begin
AboutWSO(Sender,'Event Handler Sample');
end;
Var
CanClose:Boolean;
procedure OKResult(sender:OleVariant);
begin
CanClose := true;
sender.Form.Close;
end;
procedure FormCloseQuery(Sender,ResultPtr:OleVariant);
var
j,x:OleVariant;
begin
CanClose := false;
j := f.CreateDialogForm(0,0,510,100);
j.CenterControl;
j.TextOut(10,10,'Do you really want to quit this program?');
x := j.CreateButton(10,30,75,25,'Yes');
x.OnClick := TEventHandler.Create(OKResult);
x.Default := true;
x := j.CreateButton(90,30,75,25,'No');
x.OnClick := TEventHandler.Create(CloseFormHandler);
x.Cancel := true;
x := j.CreateButton(170,30,75,25,'Help');
x.OnClick := TEventHandler.Create(HelpAbout);
j.HelpButton := x;
j.Color := $FF00FF;
j.ShowModal;
j.Destroy;
ResultPtr.Put(CanClose);
end;
begin
CoInitialize(nil);
SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOGPFAULTERRORBOX or SEM_NOOPENFILEERRORBOX);
o:=CreateOleObject('Scripting.WindowSystemObject');
f:=o.CreateForm(100,100,600,400);
f.CenterControl;
t:=f.Menu.Add('File');
t.Add('Exit',27).OnExecute := TEventHandler.Create(CloseFormHandler);
t:=f.Menu.Add('Help');
t.Add('About','F1').OnExecute := TEventHandler.Create(HelpAbout);
f.CreateButton(10,10,75,25,'Demo').OnClick := TEventHandler.Create(ButtonClick);
f.CreateButton(100,10,75,25,'Close').OnClick := TEventHandler.Create(CloseFormHandler);
f.OnMouseMove := TEventHandler.Create(FormMouseMove);
f.OnMouseUp := TEventHandler.Create(FormMouseDown);
f.OnMouseLeave := TEventHandler.Create(FormMouseLeave);
f.OnKeyDown := TEventHandler.Create(FormKeyDown);
f.OnCloseQuery := TEventHandler.Create(FormCloseQuery);
t := f.TextOut(10,60,'WindowSystemObject');
t.Font.Size := 16;
t.Color := 255;
t.Font.Bold := true;
f.CreateStatusBar.Name := 'StatusBar';
f.StatusBar.Add(100).AutoSize:=true;
f.TextOut(10,100,
'This sample shows how to handle events from WindowsSystemObject using Delphi.'#13#13+
'Clicking any mouse button invokes OnMouseUp event handler.'#13#13+
'Moving mouse inside this window invokes OnMouseMove event handler.'#13#13+
'(The current mouse position is displayed in the status bar)'#13#13+
'Moving mouse outside this window invokes OnMouseLeave event handler.'#13#13+
'Clicking Demo or Close buttons invokes OnClick event handler.'#13#13+
'Pressing any key invokes OnKeyDown event handler.'#13#13+
'Try to close this window to invoke OnCloseQuery event.');
f.Show;
o.Run;
// Free global OleVariants.
o := Unassigned;
t := Unassigned;
f := Unassigned;
CoUnInitialize;
end.