Componentes.Terceros.RemObj.../internal/5.0.24.615/1/RemObjects SDK for Delphi/Samples/RODL/RODLMain.pas

365 lines
10 KiB
ObjectPascal

unit RODLMain;
interface
uses
Windows, Messages, SysUtils, {$IFDEF VER140}Variants, {$ENDIF}Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw, ExtCtrls, uRODL, ComCtrls;
type
TRODLMainForm = class(TForm)
GenerateButton: TButton;
LoadButton: TButton;
ConvertButton: TButton;
cbWriters: TComboBox;
Memo: TMemo;
OpenDialog: TOpenDialog;
Label1: TLabel;
StatusBar: TStatusBar;
cbServices: TComboBox;
lServices: TLabel;
SaveButton: TButton;
SaveDialog: TSaveDialog;
Panel1: TPanel;
TreeView: TTreeView;
Splitter1: TSplitter;
procedure GenerateButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ConvertButtonClick(Sender: TObject);
procedure LoadButtonClick(Sender: TObject);
procedure cbWritersChange(Sender: TObject);
procedure SaveButtonClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
fLibrary: TRODLLibrary;
function CheckLibrary(AShowMessage: Boolean): Boolean;
procedure FillLibrary;
public
end;
var
RODLMainForm: TRODLMainForm;
implementation
uses uRODLToXML, uRODLToPascalInvk, uRODLToPascalIntf, uRODLToPascalImpl,
uRODLGenTools, uRODLToWSDL, uRODLToPascalAsync, uROClasses;
{$R *.dfm}
const
Writers: array[0..5] of TRODLConverterClass =
(TRODLToInvk, TRODLToIntf, TRODLToImpl, TRODLToXML, TRODLToWSDL, TRODLToPascalAsync);
procedure TRODLMainForm.GenerateButtonClick(Sender: TObject);
var
struct: TRODLStruct;
stelem: TRODLTypedEntity;
arr: TRODLArray;
svc: TRODLService;
enum: TRODLEnum;
eval: TRODLEnumValue;
intf: TRODLServiceInterface;
op: TRODLOperation;
par: TRODLOperationParam;
// ent: TRODLEntity;
// emsg: string;
begin
Memo.Clear;
if fLibrary <> nil then fLibrary.Free;
fLibrary := TRODLLibrary.Create;
fLibrary.Info.Name := 'TestLibrary';
fLibrary.Info.UID := NewGuid;
fLibrary.Info.Attributes.Values['Test'] := 'a library attribute';
svc := TRODLService.Create;
svc.Info.Name := 'Gadget';
svc.Default.Info.UID := NewGuid;
svc.Default.Info.Documentation := 'Default interface for Gadget';
svc.Default.Info.Attributes.Values['TestName1'] := 'TestValue1';
svc.Default.Info.Attributes.Values['TestName2'] := 'TestValue2';
intf := svc.Default;
op := intf.Add;
op.Info.Name := 'Sum';
op.Info.UID := NewGuid;
op.Info.Documentation := 'Sum message';
op.Info.Attributes.Values['TestAttr1'] := 'TestAttrValue2';
op.Info.Attributes.Values['TestAttr2'] := 'TestAttrValue2';
par := op.Add;
par.Name := 'A';
par.DataType := 'integer';
par.Flag := fIn;
par := op.Add;
par.Name := 'B';
par.DataType := 'integer';
par.Flag := fIn;
par.Attributes.Values['Test'] := 'a parameter attribute';
par.Attributes.Values['Test'] := 'a parameter attribute #2';
par := op.AddResult;
// par.Name := 'result';
par.DataType := 'integer';
// par.Flag := fResult;
op := intf.Add;
op.Name := 'GetServerTime';
op.Attributes.Values['TestAttr1'] := 'TestAttrValue2';
op.Attributes.Values['TestAttr2'] := 'TestAttrValue2';
op.UID := NewGuid;
op.Documentation := 'GetServerTime message';
par := op.AddResult;
// par.Name := 'result';
par.DataType := 'datetime';
// par.Flag := fResult;
fLibrary.Add(svc);
svc := TRODLService.Create;
svc.Name := 'Test2';
svc.Default.UID := NewGuid;
svc.Default.Documentation := 'Default interface for Test2';
intf := svc.Default;
op := intf.Add;
op.Name := 'GetNumber';
op.UID := NewGuid;
op.Documentation := 'GetNumber message';
par := op.AddResult;
// par.Name := 'result';
par.DataType := 'integer';
// par.Flag := fResult;
fLibrary.Add(svc);
struct := TRODLStruct.Create;
struct.Attributes.Values['TestAttr1'] := 'TestAttrValue2';
struct.Attributes.Values['TestAttr2'] := 'TestAttrValue2';
struct.Name := 'TAddress';
struct.UID := NewGuid;
struct.Documentation := 'An address';
stelem := struct.Add;
stelem.Name := 'Street1';
stelem.DataType := 'string';
stelem := struct.Add;
stelem.Name := 'Street2';
stelem.DataType := 'string';
fLibrary.Add(struct);
struct := TRODLStruct.Create;
struct.Name := 'TPerson';
struct.UID := NewGuid;
struct.Documentation := 'A person';
stelem := struct.Add;
stelem.Name := 'FullName';
stelem.DataType := 'string';
stelem := struct.Add;
stelem.Name := 'Age';
stelem.DataType := 'integer';
fLibrary.Add(struct);
enum := TRODLEnum.Create;
enum.Name := 'TColor';
enum.UID := NewGuid;
enum.Documentation := 'This is TColor';
enum.Attributes.Values['TestAttr1'] := 'TestAttrValue2';
enum.Attributes.Values['TestAttr2'] := 'TestAttrValue2';
eval := enum.Add;
eval.Name := 'clRed';
eval := enum.Add;
eval.Name := 'clBlue';
fLibrary.Add(enum);
enum := TRODLEnum.Create;
enum.Name := 'TSex';
enum.UID := NewGuid;
enum.Documentation := 'This is TSex';
eval := enum.Add;
eval.Name := 'Male';
eval := enum.Add;
eval.Name := 'Female';
fLibrary.Add(enum);
arr := TRODLArray.Create;
arr.Name := 'TIntegerArray';
arr.Documentation := 'Thisis an integer array';
arr.UID := NewGuid;
arr.ElementType := 'integer';
arr.Attributes.Values['TestAttr1'] := 'TestAttrValue2';
arr.Attributes.Values['TestAttr2'] := 'TestAttrValue2';
fLibrary.Add(arr);
{if not fLibrary.Validate(ent, emsg)
then Caption := 'Libary is NOT valid: '+ent.Name+', '+emsg
else Caption := 'Libary is valid'}
FillLibrary;
StatusBar.SimpleText := 'Test RODL generated.';
end;
procedure TRODLMainForm.FormCreate(Sender: TObject);
var
i: integer;
begin
for i := 0 to High(Writers) do
cbWriters.Items.Add(Writers[i].ClassName);
cbWriters.ItemIndex := cbWriters.Items.Count - 1;
cbWriters.OnChange(cbWriters);
end;
procedure TRODLMainForm.ConvertButtonClick(Sender: TObject);
begin
with Writers[cbWriters.ItemIndex].Create(fLibrary, cbServices.Text) do try
Memo.Lines.Text := Buffer.Text
finally
Free;
end;
end;
procedure TRODLMainForm.LoadButtonClick(Sender: TObject);
var
fs: TFileStream;
begin
if not OpenDialog.Execute then Exit;
FreeAndNIL(fLibrary);
Memo.Clear;
FillLibrary;
fs := TFileStream.Create(OpenDialog.FileName, fmOpenRead);
with TXMLToRODL.Create do try
fLibrary := Read(fs);
finally
Free;
fs.Free;
end;
FillLibrary;
StatusBar.SimpleText := ExtractFileName(OpenDialog.FileName) + ' loaded. Please specify the convertor and click ''Convert''';
// ConvertButton.Click;
end;
procedure TRODLMainForm.cbWritersChange(Sender: TObject);
var
i: integer;
begin
cbServices.Clear;
if Writers[cbWriters.ItemIndex] = TRODLToImpl then begin
if fLibrary <> nil then
for i := 0 to fLibrary.ServiceCount - 1 do
cbServices.Items.Add(fLibrary.Services[i].Name);
if cbServices.Items.Count > 0 then cbServices.ItemIndex := 0;
end
else if Writers[cbWriters.ItemIndex] = TRODLToWSDL then begin
cbServices.Items.Add('');
if fLibrary <> nil then
for i := 0 to fLibrary.ServiceCount - 1 do
cbServices.Items.Add(fLibrary.Services[i].Name);
cbServices.ItemIndex := 0;
end;
lServices.Enabled := (Writers[cbWriters.ItemIndex] = TRODLToImpl) or (Writers[cbWriters.ItemIndex] = TRODLToWSDL);
cbServices.Enabled := lServices.Enabled;
if cbServices.Enabled then
cbServices.Color := clWindow
else
cbServices.ParentColor := True;
end;
procedure TRODLMainForm.SaveButtonClick(Sender: TObject);
var
FFileName: string;
begin
if not CheckLibrary(True) then Exit;
ConvertButton.Click;
fFileName := Writers[cbWriters.ItemIndex].GetTargetFileName(fLibrary, cbServices.Text);
if FFileName = '' then FFileName := ChangeFileExt(fLibrary.Name, '.xml');
SaveDialog.FileName := fFileName;
SaveDialog.DefaultExt := ExtractFileExt(SaveDialog.FileName);
if SaveDialog.Execute then Memo.Lines.SaveToFile(SaveDialog.FileName);
end;
function TRODLMainForm.CheckLibrary(AShowMessage: Boolean): Boolean;
begin
Result := fLibrary <> nil;
if not result then ShowMessage('Please load or generate a RODL library');
end;
procedure TRODLMainForm.FillLibrary;
var
FRootNode, tempNode: TTreeNode;
i: integer;
begin
with TreeView do begin
Items.Clear;
if fLibrary = nil then Exit;
FRootNode := Items.AddChild(nil, fLibrary.Name);
tempNode := Items.AddChild(FRootNode, 'Structs');
for i := 0 to fLibrary.StructCount - 1 do
Items.AddChild(tempNode, fLibrary.Structs[i].Name);
tempNode := Items.AddChild(FRootNode, 'Arrays');
for i := 0 to fLibrary.ArrayCount - 1 do
Items.AddChild(tempNode, fLibrary.Arrays[i].Name);
tempNode := Items.AddChild(FRootNode, 'Enums');
for i := 0 to fLibrary.EnumCount - 1 do
Items.AddChild(tempNode, fLibrary.Enums[i].Name);
tempNode := Items.AddChild(FRootNode, 'Services');
for i := 0 to fLibrary.ServiceCount - 1 do begin
Items.AddChild(tempNode, fLibrary.Services[i].Name);
end;
tempNode := Items.AddChild(FRootNode, 'Exceptions');
for i := 0 to fLibrary.ExceptionCount - 1 do
Items.AddChild(tempNode, fLibrary.Exceptions[i].Name);
tempNode := Items.AddChild(FRootNode, 'Use');
for i := 0 to fLibrary.UseCount - 1 do
Items.AddChild(tempNode, fLibrary.Use[i].Name);
tempNode := Items.AddChild(FRootNode, 'Groups');
for i := 0 to fLibrary.GroupCount - 1 do
Items.AddChild(tempNode, fLibrary.Groups[i].Name);
tempNode := Items.AddChild(FRootNode, 'Event Sinks');
for i := 0 to fLibrary.EventSinkCount - 1 do
Items.AddChild(tempNode, fLibrary.EventSinks[i].Name);
FRootNode.Expand(True);
FRootNode.Selected := True;
FRootNode.MakeVisible;
end;
end;
procedure TRODLMainForm.FormDestroy(Sender: TObject);
begin
if fLibrary <> nil then fLibrary.Free;
end;
end.