From 95a306f0b192bb76668a6e65df42918ae267a61b Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Wed, 20 Feb 2008 06:52:00 +0000 Subject: [PATCH] Initial commit --- Forms/MainFrm.dfm | 180 +++++++++++++++++++++ Forms/MainFrm.pas | 92 +++++++++++ Units/DelphiXMLDataBindingGenerator.pas | 202 ++++++++++++++++++++++++ Units/XMLDataBindingGenerator.pas | 198 +++++++++++++++++++++++ Units/XMLDataBindingHelpers.pas | 128 +++++++++++++++ X2XMLDataBinding.bdsproj | 172 ++++++++++++++++++++ X2XMLDataBinding.dpr | 31 ++++ X2XMLDataBinding.res | Bin 0 -> 4396 bytes 8 files changed, 1003 insertions(+) create mode 100644 Forms/MainFrm.dfm create mode 100644 Forms/MainFrm.pas create mode 100644 Units/DelphiXMLDataBindingGenerator.pas create mode 100644 Units/XMLDataBindingGenerator.pas create mode 100644 Units/XMLDataBindingHelpers.pas create mode 100644 X2XMLDataBinding.bdsproj create mode 100644 X2XMLDataBinding.dpr create mode 100644 X2XMLDataBinding.res diff --git a/Forms/MainFrm.dfm b/Forms/MainFrm.dfm new file mode 100644 index 0000000..12b442d --- /dev/null +++ b/Forms/MainFrm.dfm @@ -0,0 +1,180 @@ +object MainForm: TMainForm + Left = 238 + Top = 81 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsDialog + Caption = 'X'#178'Software XML Data Binding Wizard for Delphi' + ClientHeight = 244 + ClientWidth = 438 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + DesignSize = ( + 438 + 244) + PixelsPerInch = 96 + TextHeight = 13 + object lblSchema: TLabel + Left = 8 + Top = 11 + Width = 58 + Height = 13 + Caption = 'Schema file:' + end + object feSchema: TJvFilenameEdit + Left = 99 + Top = 8 + Width = 331 + Height = 21 + AddQuotes = False + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Text = 'F:\XTxXSD\Offerte.xsd' + end + object gbOutput: TGroupBox + Left = 8 + Top = 43 + Width = 422 + Height = 162 + Anchors = [akLeft, akTop, akBottom] + Caption = ' Output ' + TabOrder = 1 + DesignSize = ( + 422 + 162) + object rbFile: TRadioButton + Left = 7 + Top = 21 + Width = 126 + Height = 17 + Caption = 'Output to &single file' + Checked = True + TabOrder = 0 + TabStop = True + end + object rbFolder: TRadioButton + Left = 8 + Top = 44 + Width = 149 + Height = 17 + Caption = 'Output to separate &files' + Enabled = False + TabOrder = 1 + end + object plOutput: TJvPageList + Left = 3 + Top = 72 + Width = 416 + Height = 87 + ActivePage = spFile + PropagateEnable = False + ShowDesignCaption = sdcBottomRight + Anchors = [akLeft, akTop, akRight, akBottom] + object spFile: TJvStandardPage + Left = 0 + Top = 0 + Width = 416 + Height = 87 + object lblFile: TLabel + Left = 8 + Top = 7 + Width = 55 + Height = 13 + Caption = 'Output file:' + end + object feFile: TJvFilenameEdit + Left = 88 + Top = 3 + Width = 321 + Height = 21 + AddQuotes = False + TabOrder = 0 + Text = 'F:\XTxXSD\Output\xml_Offerte.pas' + end + end + object spFolder: TJvStandardPage + Left = 0 + Top = 0 + Width = 416 + Height = 87 + DesignSize = ( + 416 + 87) + object lblFolder: TLabel + Left = 8 + Top = 7 + Width = 69 + Height = 13 + Caption = 'Output folder:' + end + object lblFolderPrefix: TLabel + Left = 8 + Top = 34 + Width = 51 + Height = 13 + Caption = 'File prefix:' + end + object lblFolderPostfix: TLabel + Left = 8 + Top = 60 + Width = 56 + Height = 13 + Caption = 'File postfix:' + end + object deFolder: TJvDirectoryEdit + Left = 88 + Top = 3 + Width = 321 + Height = 21 + DialogKind = dkWin32 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Text = 'F:\XTxXSD\Output\' + end + object edtFolderPrefix: TEdit + Left = 88 + Top = 30 + Width = 121 + Height = 21 + TabOrder = 1 + Text = 'xml_' + end + object edtFolderPostfix: TEdit + Left = 88 + Top = 57 + Width = 121 + Height = 21 + TabOrder = 2 + end + end + end + end + object btnGenerate: TButton + Left = 274 + Top = 211 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '&Generate' + Default = True + TabOrder = 2 + OnClick = btnGenerateClick + end + object btnClose: TButton + Left = 355 + Top = 211 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Cancel = True + Caption = '&Close' + TabOrder = 3 + OnClick = btnCloseClick + end +end diff --git a/Forms/MainFrm.pas b/Forms/MainFrm.pas new file mode 100644 index 0000000..54f03d9 --- /dev/null +++ b/Forms/MainFrm.pas @@ -0,0 +1,92 @@ +unit MainFrm; + +interface +uses + Classes, + Controls, + Forms, + Mask, + StdCtrls, + + JvComponent, + JvExControls, + JvExMask, + JvPageList, + JvToolEdit; + + +type + TMainForm = class(TForm) + btnClose: TButton; + btnGenerate: TButton; + deFolder: TJvDirectoryEdit; + edtFolderPostfix: TEdit; + edtFolderPrefix: TEdit; + feFile: TJvFilenameEdit; + feSchema: TJvFilenameEdit; + gbOutput: TGroupBox; + lblFile: TLabel; + lblFolder: TLabel; + lblFolderPostfix: TLabel; + lblFolderPrefix: TLabel; + lblSchema: TLabel; + plOutput: TJvPageList; + rbFile: TRadioButton; + rbFolder: TRadioButton; + spFile: TJvStandardPage; + spFolder: TJvStandardPage; + + procedure btnCloseClick(Sender: TObject); + procedure btnGenerateClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + end; + + +implementation +uses + SysUtils, + Windows, + + DelphiXMLDataBindingGenerator, + XMLDataBindingGenerator; + + +{$R *.dfm} + + +{ TMainForm } +procedure TMainForm.FormCreate(Sender: TObject); +begin + plOutput.ActivePageIndex := 0; +end; + + +procedure TMainForm.btnGenerateClick(Sender: TObject); +begin + if not FileExists(feSchema.FileName) then + begin + MessageBox(Self.Handle, 'Please specify a valid schema file.', + 'Schema file does not exist', MB_OK or MB_ICONERROR); + + ActiveControl := feFile; + Exit; + end; + + with TDelphiXMLDataBindingGenerator.Create() do + try + OutputType := otSingle; + OutputPath := feFile.FileName; + + Execute(feSchema.FileName); + finally + Free(); + end; +end; + + +procedure TMainForm.btnCloseClick(Sender: TObject); +begin + Close(); +end; + +end. diff --git a/Units/DelphiXMLDataBindingGenerator.pas b/Units/DelphiXMLDataBindingGenerator.pas new file mode 100644 index 0000000..dfa055a --- /dev/null +++ b/Units/DelphiXMLDataBindingGenerator.pas @@ -0,0 +1,202 @@ +unit DelphiXMLDataBindingGenerator; + +interface +uses + Classes, + XMLSchema, + + XMLDataBindingGenerator, + XMLDataBindingHelpers; + +type + TGetFileNameEvent = procedure(Sender: TObject; const SchemaName: String; var Result: String) of object; + + TDelphiXMLDataBindingGenerator = class(TXMLDataBindingGenerator) + private + FOnGetFileName: TGetFileNameEvent; + protected + procedure GenerateDataBinding(); override; + procedure GenerateSingleDataBinding(); + procedure GenerateMultipleDataBinding(); + + function DoGetFileName(const ASchemaName: String): String; + + procedure WriteUnitHeader(AStream: TStreamHelper; const AFileName: String); + procedure WriteSchemaInterfaces(AStream: TStreamHelper; ASchemaDef: IXMLSchemaDef; AForward: Boolean); + procedure WriteElementInterface(AStream: TStreamHelper; AElement: IXMLElementDef; AForward: Boolean); + procedure WriteElements(AStream: TStreamHelper; AType: IXMLTypeDef); + procedure WriteImplementation(AStream: TStreamHelper); + procedure WriteUnitFooter(AStream: TStreamHelper); + public + property OnGetFileName: TGetFileNameEvent read FOnGetFileName write FOnGetFileName; + end; + +implementation +uses + SysUtils; + + +{ TDelphiXMLDataBindingGenerator } +procedure TDelphiXMLDataBindingGenerator.GenerateDataBinding(); +begin + case OutputType of + otSingle: GenerateSingleDataBinding(); + otMultiple: GenerateMultipleDataBinding(); + end; +end; + + +procedure TDelphiXMLDataBindingGenerator.GenerateSingleDataBinding(); +var + unitName: String; + unitStream: TStreamHelper; + schemaIndex: Integer; + +begin + unitName := DoGetFileName(Schema[0].SchemaName); + unitStream := TStreamHelper.Create(TFileStream.Create(unitName, fmCreate), soOwned); + try + WriteUnitHeader(unitStream, unitName); + unitStream.WriteLn('type'); + + for schemaIndex := 0 to Pred(SchemaCount) do + begin + unitStream.WriteLn(' { Forward declarations for ' + Schema[schemaIndex].SchemaName + ' }'); + WriteSchemaInterfaces(unitStream, Schema[schemaIndex].SchemaDef, True); + end; + + for schemaIndex := 0 to Pred(SchemaCount) do + begin + unitStream.WriteLn(' { Interfaces for ' + Schema[schemaIndex].SchemaName + ' }'); + WriteSchemaInterfaces(unitStream, Schema[schemaIndex].SchemaDef, False); + end; + + WriteImplementation(unitStream); + WriteUnitFooter(unitStream); + finally + FreeAndNil(unitStream); + end; +end; + + +procedure TDelphiXMLDataBindingGenerator.GenerateMultipleDataBinding(); +begin +end; + + +procedure TDelphiXMLDataBindingGenerator.WriteUnitHeader(AStream: TStreamHelper; const AFileName: String); +begin + // #ToDo1 (MvR) 14-4-2007: if outputtype = multiple, use include files + + AStream.WriteLn('{'); + AStream.WriteLn(' X2Software XML Data Binding Wizard'); + AStream.WriteLn(' Generated from: ' + SourceFileName); + AStream.WriteLn('}'); + AStream.WriteLn('unit ' + ChangeFileExt(ExtractFileName(AFileName), '') + ';'); + AStream.WriteLn(); + AStream.WriteLn('interface'); + AStream.WriteLn('uses'); + AStream.WriteLn(' XMLDoc,'); + AStream.WriteLn(' XMLIntf;'); + AStream.WriteLn(); +end; + + +procedure TDelphiXMLDataBindingGenerator.WriteSchemaInterfaces(AStream: TStreamHelper; ASchemaDef: IXMLSchemaDef; AForward: Boolean); + + procedure ProcessElementDefs(AElements: IXMLElementDefList); + var + elementIndex: Integer; + element: IXMLElementDef; + + begin + for elementIndex := 0 to Pred(AElements.Count) do + begin + element := AElements[elementIndex]; + + if element.DataType.IsComplex then + begin + WriteElementInterface(AStream, element, AForward); + ProcessElementDefs(element.ChildElements); + end; + end; + end; + +var + elementIndex: Integer; + element: IXMLElementDef; + complexTypeIndex: Integer; + complexType: IXMLComplexTypeDef; + +begin + for elementIndex := 0 to Pred(ASchemaDef.ElementDefs.Count) do + begin + element := ASchemaDef.ElementDefs[elementIndex]; + + WriteElementInterface(AStream, element, AForward); + if element.DataType.IsComplex then + begin + ProcessElementDefs(element.ChildElements); + end; + end; + + for complexTypeIndex := 0 to Pred(ASchemaDef.ComplexTypes.Count) do + begin + complexType := ASchemaDef.ComplexTypes[complexTypeIndex]; + + if AForward then + begin + AStream.WriteLn(' IXML' + complexType.Name + ' = interface; { ComplexType }'); + end else + begin + AStream.WriteLn(' IXML' + complexType.Name + ' = interface'); + AStream.WriteLn(' {TODO:GUID}'); + + WriteElements(complexType); + + AStream.WriteLn(' end;'); + AStream.WriteLn(); + end; + + ProcessElementDefs(complexType.ElementDefList); + end; +end; + + +procedure TDelphiXMLDataBindingGenerator.WriteElementInterface(AStream: TStreamHelper; AElement: IXMLElementDef; AForward: Boolean); +begin + if AForward then + begin + AStream.WriteLn(' IXML' + AElement.Name + ' = interface; { ElementDef }'); + end else + begin + // #ToDo1 (MvR) 14-4-2007: output element interface + end; +end; + + +procedure TDelphiXMLDataBindingGenerator.WriteImplementation(AStream: TStreamHelper); +begin +end; + + +procedure TDelphiXMLDataBindingGenerator.WriteUnitFooter(AStream: TStreamHelper); +begin + AStream.WriteLn(); + AStream.WriteLn('end.'); +end; + + +function TDelphiXMLDataBindingGenerator.DoGetFileName(const ASchemaName: String): String; +begin + Result := OutputPath; + + if OutputType = otMultiple then + begin + Result := IncludeTrailingPathDelimiter(Result) + ASchemaName + '.pas'; + if Assigned(FOnGetFileName) then + FOnGetFileName(Self, ASchemaName, Result); + end; +end; + +end. diff --git a/Units/XMLDataBindingGenerator.pas b/Units/XMLDataBindingGenerator.pas new file mode 100644 index 0000000..388a0aa --- /dev/null +++ b/Units/XMLDataBindingGenerator.pas @@ -0,0 +1,198 @@ +unit XMLDataBindingGenerator; + +interface +uses + Classes, + Contnrs, + XMLSchema; + +type + TXMLDataBindingSchema = class(TObject) + private + FSchemaDef: IXMLSchemaDef; + FSchemaName: String; + public + property SchemaDef: IXMLSchemaDef read FSchemaDef write FSchemaDef; + property SchemaName: String read FSchemaName write FSchemaName; + end; + + TXMLDataBindingOutputType = (otSingle, otMultiple); + + TXMLDataBindingGenerator = class(TObject) + private + FIncludePaths: TStrings; + FOutputPath: string; + FOutputType: TXMLDataBindingOutputType; + FSourceFileName: String; + + FSchemas: TObjectList; + + function GetSchemaCount(): Integer; + function GetSchema(Index: Integer): TXMLDataBindingSchema; + protected + function LoadSchema(const AStream: TStream; const ASchemaName: String): IXMLSchemaDef; + function FindSchema(const ALocation: String): TStream; + + procedure GenerateDataBinding(); virtual; abstract; + + property SourceFileName: String read FSourceFileName write FSourceFileName; + property SchemaCount: Integer read GetSchemaCount; + property Schema[Index: Integer]: TXMLDataBindingSchema read GetSchema; + public + constructor Create(); + destructor Destroy(); override; + + procedure Execute(const AStream: TStream; const ASchemaName: String); overload; + procedure Execute(const AFileName: String); overload; + + property IncludePaths: TStrings read FIncludePaths; + property OutputType: TXMLDataBindingOutputType read FOutputType write FOutputType; + property OutputPath: string read FOutputPath write FOutputPath; + end; + + +implementation +uses + SysUtils, + + XMLDoc, + XMLIntf; + + +{ TXMLDataBindingGenerator } +constructor TXMLDataBindingGenerator.Create(); +begin + inherited; + + FIncludePaths := TStringList.Create(); + FSchemas := TObjectList.Create(True); + + with TStringList(FIncludePaths) do + begin + CaseSensitive := False; + Duplicates := dupIgnore; + end; +end; + + +destructor TXMLDataBindingGenerator.Destroy(); +begin + FreeAndNil(FSchemas); + FreeAndNil(FIncludePaths); + + inherited; +end; + + +procedure TXMLDataBindingGenerator.Execute(const AStream: TStream; const ASchemaName: String); +//var +// schemaIndex: Integer; +// +begin + FSchemas.Clear(); + LoadSchema(AStream, ASchemaName); + + if SchemaCount > 0 then + GenerateDataBinding(); +end; + + +procedure TXMLDataBindingGenerator.Execute(const AFileName: String); +var + currentDir: String; + fileStream: TFileStream; + +begin + currentDir := GetCurrentDir(); + try + ChDir(ExtractFilePath(AFileName)); + + fileStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone); + try + FSourceFileName := AFileName; + IncludePaths.Add(ExtractFilePath(AFileName)); + + Execute(fileStream, ChangeFileExt(ExtractFileName(AFileName), '')); + finally + FreeAndNil(fileStream); + end; + finally + ChDir(currentDir); + end; +end; + + + +function TXMLDataBindingGenerator.LoadSchema(const AStream: TStream; const ASchemaName: String): IXMLSchemaDef; +var + includeIndex: Integer; + includes: IXMLSchemaIncludes; + includeStream: TStream; + location: String; + schema: TXMLDataBindingSchema; + schemaDoc: IXMLSchemaDoc; + +begin + schemaDoc := TXMLSchemaDoc.Create(nil); + schemaDoc.LoadFromStream(AStream); + Result := schemaDoc.SchemaDef; + + schema := TXMLDataBindingSchema.Create(); + schema.SchemaDef := Result; + schema.SchemaName := ASchemaName; + FSchemas.Add(schema); + + { Handle includes } + includes := Result.SchemaIncludes; + for includeIndex := 0 to Pred(includes.Count) do + begin + location := includes[includeIndex].SchemaLocation; + includeStream := FindSchema(location); + + if Assigned(includeStream) then + try + location := ChangeFileExt(ExtractFileName(location), ''); + LoadSchema(includeStream, location); + finally + FreeAndNil(includeStream); + end; + end; +end; + + +function TXMLDataBindingGenerator.FindSchema(const ALocation: String): TStream; +var + includeIndex: Integer; + includePath: String; + +begin + Result := nil; + + // #ToDo3 (MvR) 31-1-2007: support more locations than just a filename ? + + for includeIndex := 0 to Pred(IncludePaths.Count) do + begin + includePath := IncludeTrailingPathDelimiter(IncludePaths[includeIndex]); + + if FileExists(includePath + ALocation) then + begin + Result := TFileStream.Create(includePath + ALocation, fmOpenRead or fmShareDenyNone); + break; + end; + end; +end; + + +function TXMLDataBindingGenerator.GetSchemaCount(): Integer; +begin + Result := FSchemas.Count; +end; + + +function TXMLDataBindingGenerator.GetSchema(Index: Integer): TXMLDataBindingSchema; +begin + Result := TXMLDataBindingSchema(FSchemas[Index]); +end; + +end. + diff --git a/Units/XMLDataBindingHelpers.pas b/Units/XMLDataBindingHelpers.pas new file mode 100644 index 0000000..473b1dc --- /dev/null +++ b/Units/XMLDataBindingHelpers.pas @@ -0,0 +1,128 @@ +unit XMLDataBindingHelpers; + +interface +uses + Classes; + +type + TStreamHelper = class(TObject) + private + FOwnership: TStreamOwnership; + FStream: TStream; + public + constructor Create(AStream: TStream; AOwnership: TStreamOwnership = soReference); + destructor Destroy(); override; + + function ReadString(ASize: Integer = -1): String; + function ReadInteger(): Integer; + function ReadDateTime(): TDateTime; + function ReadBoolean(): Boolean; + + procedure Write(const ASource: String); + procedure WriteLn(const ASource: String = ''); + + procedure WriteString(const ASource: String); + procedure WriteInteger(const ASource: Integer); + procedure WriteDateTime(const ASource: TDateTime); + procedure WriteBoolean(const ASource: Boolean); + end; + + +implementation +uses + SysUtils; + + +{ TStreamHelper } +constructor TStreamHelper.Create(AStream: TStream; AOwnership: TStreamOwnership); +begin + FOwnership := AOwnership; + FStream := AStream; + + inherited Create(); +end; + + +destructor TStreamHelper.Destroy(); +begin + if FOwnership = soOwned then + FreeAndNil(FStream); + + inherited; +end; + + +function TStreamHelper.ReadString(ASize: Integer): String; +var + iSize: Integer; + +begin + if ASize = -1 then + iSize := ReadInteger() + else + iSize := ASize; + + SetLength(Result, iSize); + FStream.Read(PChar(Result)^, iSize); +end; + + +function TStreamHelper.ReadInteger(): Integer; +begin + FStream.Read(Result, SizeOf(Integer)); +end; + + +function TStreamHelper.ReadDateTime(): TDateTime; +begin + FStream.Read(Result, SizeOf(TDateTime)); +end; + + +function TStreamHelper.ReadBoolean(): Boolean; +begin + FStream.Read(Result, SizeOf(Boolean)); +end; + + +procedure TStreamHelper.Write(const ASource: String); +begin + FStream.Write(PChar(ASource)^, Length(ASource)); +end; + + +procedure TStreamHelper.WriteLn(const ASource: String); +begin + Write(ASource + #13#10); +end; + + +procedure TStreamHelper.WriteString(const ASource: String); +var + iSize: Integer; + +begin + iSize := Length(ASource); + WriteInteger(iSize); + FStream.Write(PChar(ASource)^, iSize); +end; + + +procedure TStreamHelper.WriteInteger(const ASource: Integer); +begin + FStream.Write(ASource, SizeOf(Integer)); +end; + + +procedure TStreamHelper.WriteDateTime(const ASource: TDateTime); +begin + FStream.Write(ASource, SizeOf(TDateTime)); +end; + + +procedure TStreamHelper.WriteBoolean(const ASource: Boolean); +begin + FStream.Write(ASource, SizeOf(Boolean)); +end; + +end. diff --git a/X2XMLDataBinding.bdsproj b/X2XMLDataBinding.bdsproj new file mode 100644 index 0000000..572148e --- /dev/null +++ b/X2XMLDataBinding.bdsproj @@ -0,0 +1,172 @@ + + + + + + + + + + + + X2XMLDataBinding.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 3 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10 + + madExcept + + False + + + + + + False + + + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1043 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + diff --git a/X2XMLDataBinding.dpr b/X2XMLDataBinding.dpr new file mode 100644 index 0000000..6ddf861 --- /dev/null +++ b/X2XMLDataBinding.dpr @@ -0,0 +1,31 @@ +program X2XMLDataBinding; + +{$WARN SYMBOL_PLATFORM OFF} + +uses + madExcept, + madLinkDisAsm, + madListHardware, + madListProcesses, + madListModules, + Forms, + MainFrm in 'Forms\MainFrm.pas' {MainForm}, + XMLDataBindingGenerator in 'Units\XMLDataBindingGenerator.pas', + DelphiXMLDataBindingGenerator in 'Units\DelphiXMLDataBindingGenerator.pas', + XMLDataBindingHelpers in 'Units\XMLDataBindingHelpers.pas'; + +{$R *.res} + +var + MainForm: TMainForm; + +begin + {$IFDEF VER180} + ReportMemoryLeaksOnShutdown := (DebugHook <> 0); + {$ENDIF} + + Application.Initialize; + Application.Title := 'X²Software XML Data Binding Wizard for Delphi'; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/X2XMLDataBinding.res b/X2XMLDataBinding.res new file mode 100644 index 0000000000000000000000000000000000000000..ba1ed6e151e5e787e35091eb756b27acae821152 GIT binary patch literal 4396 zcmbW5y^ice5QS^CNMx`Q>OhncYij4bkxI`SUKc$3L2~0G z4YcQTpML1=@$u27Qd~1m`TfHO>$~2t3H`7cZ|8G;)&Iu_jKogOT=JO4$=9oRO{KR< z9Jb;r0;xCR}WxtJm8Xnv>Vt-cbiktZ1FiOkc<%53&Y;wHhS>xp3 zTJLU$Kl$`gG1!i*9w@DrX!}{(3e(c#p-ye$v@+KZ`w94sukAENCp7^IS`8)ZxqB>wRfSnxB4fhON9C+7S;u9;r(avLTvEx&7{Sa}x z%^Y)Z;GOzA_9*NFJf#Qe1N$O=E8Ez?m#|i-dHDJC*B`-Q4i0{1i~LAz0AD@!R2NL% z;p+IKY_J`qyAbl@@ynmbJHkQZS=fm7XYT7s^_rh8Ilu|bz{YRGmmPf%CVdcNa@=?x zq&w{!f&(#v;q_14xp7c`vgSFh)!^V`oe$>8p>qHmIYj*(Q{3Ui7_OcJVR| zjg@=t1BWxbV9Q_Bw8ftsx;1`sZt_d~Q-9N#GKq{u4LO zbKC(DzxM_>$Qo&Rv&%UHd*M)GOfI$$>zu3CI4nJX00S;teU43z*L#-n$^op)hdE^LEF>pt zgpJ=bUE-}ee)k%V`XRp~Q)j=sk4pl2XC6tstNIkbCG-X{k~i)|-r?xIr1|Z)oY%kQ zUS^x9iQwvMTuNhj-258El+ZItsh?Sg73oPshvqUybnA1B?q*} z_J%yT-Q04axT#J0Nx$#axgSkFUgh%i+kk&k9y%J