. 一个文本编辑器服务器
3.1 服务器功能
我们在Protel中可以新建一个文本文件,系统提供对文本的简单编辑功能,可是不能输入中文,我们能否建立一个类似原理图或印制板服务器一样的文本编辑器,本小节详细分析DemoText服务器,DemoText服务器建立一个文本编辑服务器,虽然简单,但是基本功能都具有了。
请见代码例子\SAMPLES\NO7\Servers\DemoText。
3.2 代码分析
3.2.1 main单元
这个main单元中有一点复杂,定义了TDemoTextServerModule类,此类从TServerModule类继承。此类实现CreateServer和DestroyServer方法,在CreateServer中,创建类的实例并加载命令表。
Procedure CreateServer;
Begin
ServerModule := TDemoTextServerModule.Create;
LoadCommandLauncherTable;
End;
{....................................................................................}
DestroyServer方法析构类的实例。
{....................................................................................}
Procedure DestroyServer;
Begin
If ServerModule <> Nil ThenServerModule.Free;
End;
{....................................................................................}
GetState_ModuleName设置服务器的名称为“DemoText”,即此文本编辑器服务器名称为“DemoText”。
{....................................................................................}
Function TDemoTextServerModule.GetState_ModuleName : String;
Begin
Result := 'DemoText';//服务器名称。
End;
{....................................................................................}
此类除了定义了以上一般服务器都有的两个方法和一个函数外,还定义了如下几个过程或函数:
Procedure CreatePanels;OverRide;
FunctionReturnWindowKindForFile (FileName: String) : String;OverRide;
FunctionReturnNewWindow(WindowKind : String) : TServerWindow; OverRide;
Procedure ReturnIconsAndBitmaps(WindowKind: String;
Var StandardBitmap: HBitmap;
Var TopLevelBitmap: HBitmap;
Var MainInstanceBitmap : HBitmap;
Var DocumentIcon : HIcon ); OverRide;
这几个过程或函数是起什么作用呢?
·CreatePanels
我们先看一看过程CreatePanels。创建CreateDemoTextPanel对象。
Procedure TDemoTextServerModule.CreatePanels;
Begin
CreateDemoTextPanel;
End;
此过程调用过程CreateDemoTextPanel,CreateDemoTextPanel是做什么呢?下面再分析。
·ReturnWindowKindForFile
//注意:此函数将根据参数FileName返回您想要加载的文件的类型。
Function TDemoTextServerModule.ReturnWindowKindForFile(FileName : String) : String;
Begin
Result := '';
If Pos('TXT',UpperCase(ExtractFileExtFromPath(FileName))) <> 0 ThenResult := 'DEMOTEXT';
//如果文件的扩展名称是TXT,则返回DEMOTEXT,否则返回空。
End;
·ReturnNewWindow
//建立一个从TServerWindow类继承的TDemoTextWindow类对象的实例。
Function TDemoTextServerModule.ReturnNewWindow(WindowKind : String) : TServerWindow;
Var
DemoTextWindow : TDemoTextWindow;
Begin
Result := Nil;
If StringsEqual(WindowKind ,'DEMOTEXT') Then
Begin
DemoTextWindow := TDemoTextWindow.Create(Application);
If DemoTextWindow <> Nil Then
Begin
DemoTextWindow.Show; //把窗体显示出来。
Result := DemoTextWindow; //返回实例句柄。
End;
End;
End;
ReturnNewWindow函数乍看不起眼,实际上,这就是整个服务器的核心入口,正是在此函数中,建立一个文本编辑器服务器类TDemoTextWindow的实例,此类是带有窗体的,所以使用TDemoTextWindow.Create(Application)来创建实例,DemoTextWindow.Show把窗体显示出来。具体TDemoTextWindow类是如何定义的,其中提供什么方法,我们下面再详细分析。