Browse Source

* Additional options implemented

git-svn-id: trunk@11534 -
michael 17 years ago
parent
commit
7d845aa47e
1 changed files with 273 additions and 74 deletions
  1. 273 74
      packages/fcl-db/src/codegen/fpcgtiopf.pp

+ 273 - 74
packages/fcl-db/src/codegen/fpcgtiopf.pp

@@ -25,7 +25,8 @@ uses
 TYpe
 TYpe
   TClassOption = (caCreateClass,caConstructor,caDestructor,caCreateList,caListAddMethod,caListItemsProperty);
   TClassOption = (caCreateClass,caConstructor,caDestructor,caCreateList,caListAddMethod,caListItemsProperty);
   TClassOptions = Set of TClassOption;
   TClassOptions = Set of TClassOption;
-  TVisitorOption = (voRead,voReadList,voCreate,voDelete,voUpdate);
+  TVisitorOption = (voRead,voReadList,voCreate,voDelete,voUpdate,
+                    voCommonSetupParams,voSingleSaveVisitor);
   TVisitorOptions = set of TVisitorOption;
   TVisitorOptions = set of TVisitorOption;
   
   
   { TTiOPFCodeOptions }
   { TTiOPFCodeOptions }
@@ -33,19 +34,23 @@ TYpe
   TTiOPFCodeOptions = Class (TClassCodeGeneratorOptions)
   TTiOPFCodeOptions = Class (TClassCodeGeneratorOptions)
   Private
   Private
     FClassOptions: TClassOptions;
     FClassOptions: TClassOptions;
+    FFinalVisitors: TVisitorOptions;
     FListAncestorName: String;
     FListAncestorName: String;
     FListClassName : String;
     FListClassName : String;
     FVisitorOptions: TVisitorOptions;
     FVisitorOptions: TVisitorOptions;
     FTableName : String;
     FTableName : String;
     function GetListClassName: String;
     function GetListClassName: String;
+    procedure SetClassOptions(const AValue: TClassOptions);
     procedure SetListAncestorName(const AValue: String);
     procedure SetListAncestorName(const AValue: String);
     procedure SetListClassName(const AValue: String);
     procedure SetListClassName(const AValue: String);
+    procedure SetVisitorOptions(const AValue: TVisitorOptions);
   Public
   Public
     Constructor Create; override;
     Constructor Create; override;
     Procedure Assign(ASource : TPersistent); override;
     Procedure Assign(ASource : TPersistent); override;
   Published
   Published
-    Property ClassOptions : TClassOptions Read FClassOptions Write FClassOptions;
-    Property VisitorOptions : TVisitorOptions Read FVisitorOptions Write FVisitorOptions;
+    Property ClassOptions : TClassOptions Read FClassOptions Write SetClassOptions;
+    Property VisitorOptions : TVisitorOptions Read FVisitorOptions Write SetVisitorOptions;
+    Property FinalVisitors : TVisitorOptions Read FFinalVisitors Write FFinalVisitors;
     Property ListAncestorName : String Read FListAncestorName Write SetListAncestorName;
     Property ListAncestorName : String Read FListAncestorName Write SetListAncestorName;
     Property ListClassName : String Read GetListClassName Write SetListClassName;
     Property ListClassName : String Read GetListClassName Write SetListClassName;
     Property AncestorClass;
     Property AncestorClass;
@@ -65,15 +70,24 @@ TYpe
   private
   private
     Function CreateSQLStatement(V: TVisitorOption) : String;
     Function CreateSQLStatement(V: TVisitorOption) : String;
     function GetOpt: TTiOPFCodeOptions;
     function GetOpt: TTiOPFCodeOptions;
-    procedure WriteCreateVisitor(Strings: TStrings; const ObjectClassName: String);
-    procedure WriteDeleteVisitor(Strings: TStrings; const ObjectClassName: String);
+    Function UseCommonSetupParams : Boolean;
+    Function SingleSaveVisitor : Boolean;
+    Function VisitorClassName(V : TVisitorOption; Const ObjectClassName : String) : String;
+    // Auxiliary routines
     procedure WriteFieldAssign(Strings: TStrings; F: TFieldPropDef);
     procedure WriteFieldAssign(Strings: TStrings; F: TFieldPropDef);
     procedure WriteAssignToParam(Strings: TStrings; F: TFieldPropDef);
     procedure WriteAssignToParam(Strings: TStrings; F: TFieldPropDef);
-    procedure WriteReadListVisitor(Strings: TStrings; const ObjectClassName: String);
-    procedure WriteReadVisitor(Strings: TStrings; const ObjectClassName: String );
     procedure WriteSetSQL(Strings: TStrings; const ASQL: String);
     procedure WriteSetSQL(Strings: TStrings; const ASQL: String);
     procedure WriteSQLConstants(Strings: TStrings);
     procedure WriteSQLConstants(Strings: TStrings);
+    Procedure WriteTerminateVisitor(Strings : TStrings; V : TVisitorOption; const ObjectClassName: String);
+    procedure WriteSetupParams(Strings: TStrings; const AClassName, ObjectClassName: String);
+    // Visitors
+    procedure WriteCommonSetupVisitor(Strings: TStrings; const ObjectClassName: String);
+    procedure WriteSaveVisitor(Strings: TStrings; const ObjectClassName: String);
+    procedure WriteCreateVisitor(Strings: TStrings; const ObjectClassName: String);
+    procedure WriteDeleteVisitor(Strings: TStrings; const ObjectClassName: String);
     procedure WriteUpdateVisitor(Strings: TStrings; const ObjectClassName: String);
     procedure WriteUpdateVisitor(Strings: TStrings; const ObjectClassName: String);
+    procedure WriteReadListVisitor(Strings: TStrings; const ObjectClassName: String);
+    procedure WriteReadVisitor(Strings: TStrings; const ObjectClassName: String );
     procedure WriteVisitorDeclaration(Strings: TStrings; V: TVisitorOption; const ObjectClassName: String);
     procedure WriteVisitorDeclaration(Strings: TStrings; V: TVisitorOption; const ObjectClassName: String);
     procedure WriteVisitorImplementation(Strings: TStrings; V: TVisitorOption; const ObjectClassName: String);
     procedure WriteVisitorImplementation(Strings: TStrings; V: TVisitorOption; const ObjectClassName: String);
   Protected
   Protected
@@ -104,6 +118,14 @@ Const
   
   
 implementation
 implementation
 
 
+Function StripType(S : String) : string;
+
+begin
+  Result:=S;
+  If (Result<>'') and (Result[1]='T') then
+    Delete(Result,1,1);
+end;
+
 { TTiOPFCodeOptions }
 { TTiOPFCodeOptions }
 
 
 function TTiOPFCodeOptions.GetListClassName: String;
 function TTiOPFCodeOptions.GetListClassName: String;
@@ -113,6 +135,20 @@ begin
     Result:=ObjectClassName+'List';
     Result:=ObjectClassName+'List';
 end;
 end;
 
 
+procedure TTiOPFCodeOptions.SetClassOptions(const AValue: TClassOptions);
+
+Var
+  B : Boolean;
+
+begin
+  If AValue=FClassOptions then
+    Exit;
+  B:=Not(caCreateList in FClassOptions) and (caCreateList in AValue);
+  FClassOptions:=AValue;
+  If B then
+    Include(FVisitorOptions,voReadList);
+end;
+
 procedure TTiOPFCodeOptions.SetListAncestorName(const AValue: String);
 procedure TTiOPFCodeOptions.SetListAncestorName(const AValue: String);
 begin
 begin
   CheckIdentifier(AValue,False);
   CheckIdentifier(AValue,False);
@@ -125,6 +161,31 @@ begin
   FListClassName:=AValue;
   FListClassName:=AValue;
 end;
 end;
 
 
+procedure TTiOPFCodeOptions.SetVisitorOptions(const AValue: TVisitorOptions);
+
+Var
+  V : TVisitorOption;
+
+begin
+  FVisitorOptions:=AValue;
+  // Consistency check
+  If voSingleSaveVisitor in FVisitorOptions then
+    begin
+    Exclude(FVisitorOptions,voCommonSetupParams);
+    Exclude(FVisitorOptions,voCreate);
+    Exclude(FVisitorOptions,voUpdate);
+    Exclude(FVisitorOptions,voDelete);
+    end
+  else If voCommonSetupParams in FVisitorOptions then
+    begin
+    Include(FVisitorOptions,voCreate);
+    Include(FVisitorOptions,voUpdate);
+    end;
+  For V:=Low(TVisitorOption) to High(TVisitorOption) do
+    If Not (V in FVisitorOptions) then
+      Exclude(FFinalVisitors,V);
+end;
+
 constructor TTiOPFCodeOptions.Create;
 constructor TTiOPFCodeOptions.Create;
 begin
 begin
   inherited Create;
   inherited Create;
@@ -133,7 +194,7 @@ begin
   ObjectClassName:='MyObject';
   ObjectClassName:='MyObject';
   TableName:=SDefTableName;
   TableName:=SDefTableName;
   FVisitorOptions:=[voRead,voCreate,voDelete,voUpdate];
   FVisitorOptions:=[voRead,voCreate,voDelete,voUpdate];
-  FClassOptions:=[caCreateList,caListAddMethod,caListItemsProperty];
+  FClassOptions:=[caCreateClass,caCreateList,caListAddMethod,caListItemsProperty];
 end;
 end;
 
 
 procedure TTiOPFCodeOptions.Assign(ASource: TPersistent);
 procedure TTiOPFCodeOptions.Assign(ASource: TPersistent);
@@ -150,6 +211,7 @@ begin
     FVisitorOptions:=OC.FVisitorOptions;
     FVisitorOptions:=OC.FVisitorOptions;
     FClassOptions:=OC.FClassOptions;
     FClassOptions:=OC.FClassOptions;
     FTableName:=OC.TableName;
     FTableName:=OC.TableName;
+    FFinalVisitors:=OC.FinalVisitors;
     end;
     end;
   inherited Assign(ASource);
   inherited Assign(ASource);
 end;
 end;
@@ -186,6 +248,122 @@ begin
   Result:=CodeOptions as TTiOPFCodeOptions;
   Result:=CodeOptions as TTiOPFCodeOptions;
 end;
 end;
 
 
+function TTiOPFCodeGenerator.UseCommonSetupParams: Boolean;
+begin
+  Result:=VoCommonSetupParams in tiOPFOptions.VisitorOptions;
+end;
+
+function TTiOPFCodeGenerator.SingleSaveVisitor: Boolean;
+begin
+  Result:=voSingleSaveVisitor in tiOPFOptions.VisitorOptions;
+end;
+
+function TTiOPFCodeGenerator.VisitorClassName(V: TVisitorOption;
+  const ObjectClassName: String): String;
+
+Var
+  S : String;
+
+begin
+  Case V of
+    voRead        : S:='Read';
+    voReadList    : S:='ReadList';
+    voCreate      : S:='Create';
+    voDelete      : S:='Delete';
+    voUpdate      : S:='Update';
+    voCommonSetupParams : S:='UpdateCreate';
+    voSingleSaveVisitor : S:='Save';
+  else
+    Result:='Unknown';
+  end;
+  // Real class name
+  Result:=Format('T%s%sVisitor',[S,StripType(ObjectClassName)]);
+end;
+
+procedure TTiOPFCodeGenerator.WriteCommonSetupVisitor(Strings: TStrings;
+  const ObjectClassName: String);
+
+
+Var
+  CS,C,S : String;
+  I : Integer;
+
+begin
+  C:=VisitorClassName(voCommonSetupParams,ObjectClassName);
+  Addln(Strings,'{ %s }',[C]);
+  Addln(Strings);
+  WriteSetupParams(Strings,C,ObjectClassName);
+end;
+
+procedure TTiOPFCodeGenerator.WriteSaveVisitor(Strings: TStrings; const ObjectClassName: String);
+
+  Procedure WriteSQLCase(Const ACaselabel,ASQL : String);
+
+  begin
+    addln(Strings,ACaseLabel+':');
+    incIndent;
+    WriteSetSQL(Strings,ASQL);
+    DecIndent;
+  end;
+
+Var
+  OCN,CS,C,S : String;
+  I : Integer;
+  F : TFieldPropDef;
+
+begin
+  OCN:=StripType(ObjectClassName);
+  C:=VisitorClassName(voSingleSaveVisitor,OCN);
+  Addln(Strings,'{ %s }',[C]);
+  Addln(Strings);
+  // Init
+  S:=BeginInit(Strings,C);
+  AddLn(Strings,'Case Visited.ObjectState of');
+  IncIndent;
+  try
+    WriteSQLCase('posCreate',Format('SQLCreate%s',[OCN]));
+    WriteSQLCase('posUpdate',Format('SQLUpdate%s',[OCN]));
+    WriteSQLCase('posDelete',Format('SQLDelete%s',[OCN]));
+  finally
+    DecIndent;
+  end;
+  Addln(Strings,'end;');
+  DecIndent;
+  EndMethod(Strings,S);
+  // AcceptVisitor
+  S:=BeginAcceptVisitor(Strings,C,ObjectClassName);
+  AddLn(Strings,'Result:=Result and (Visited.ObjectState in [posCreate,posdelete,posUpdate]);');
+  DecIndent;
+  EndMethod(Strings,S);
+  S:=BeginSetupParams(Strings,C,ObjectClassName,True);
+  Addln(Strings,'With Query do',[ObjectClassName]);
+  IncINdent;
+  try
+    Addln(Strings,'begin');
+    F:=Fields.FindPropName('OID');
+    If (F<>Nil) then
+      WriteAssignToParam(Strings,F)
+    else
+      AddLn(Strings,'// No OID property found. Add delete key parameter setup code here.');
+    AddLn(Strings,'If (Visited.ObjectState<>posDelete) then');
+    IncIndent;
+    try
+      AddLn(Strings,'begin');
+      For I:=0 to Fields.Count-1 do
+        If Fields[i].Enabled and (CompareText(Fields[i].PropertyName,'OID')<>0) then
+          WriteAssignToParam(Strings,Fields[i]);
+      AddLn(Strings,'end;');
+    Finally
+      DecIndent;
+    end;
+    Addln(Strings,'end;');
+  finally
+    DecIndent;
+  end;
+  DecIndent;
+  EndMethod(Strings,S);
+end;
+
 function TTiOPFCodeGenerator.GetInterfaceUsesClause: string;
 function TTiOPFCodeGenerator.GetInterfaceUsesClause: string;
 begin
 begin
   Result:=inherited GetInterfaceUsesClause;
   Result:=inherited GetInterfaceUsesClause;
@@ -213,8 +391,10 @@ begin
     try
     try
       If caCreateList in ClassOptions then
       If caCreateList in ClassOptions then
         CreateListDeclaration(Strings,ObjectClassName,ListClassName,ListAncestorName);
         CreateListDeclaration(Strings,ObjectClassName,ListClassName,ListAncestorName);
+      If voCommonSetupParams in VisitorOptions then
+        WriteVisitorDeclaration(Strings,voCommonSetupParams,ObjectClassName);
       For V:=Low(TVisitorOption) to High(TVisitorOption) do
       For V:=Low(TVisitorOption) to High(TVisitorOption) do
-        If V in VisitorOptions then
+        If (V in VisitorOptions) and (V<>voCommonSetupParams) then
           WriteVisitorDeclaration(Strings,V,ObjectClassName);
           WriteVisitorDeclaration(Strings,V,ObjectClassName);
     Finally
     Finally
       DecIndent;
       DecIndent;
@@ -222,13 +402,6 @@ begin
     end;
     end;
 end;
 end;
 
 
-Function StripType(S : String) : string;
-
-begin
-  Result:=S;
-  If (Result<>'') and (Result[1]='T') then
-    Delete(Result,1,1);
-end;
 
 
 procedure TTiOPFCodeGenerator.WriteVisitorDeclaration(Strings : TStrings; V : TVisitorOption; Const ObjectClassName : String);
 procedure TTiOPFCodeGenerator.WriteVisitorDeclaration(Strings : TStrings; V : TVisitorOption; Const ObjectClassName : String);
 
 
@@ -236,28 +409,34 @@ Var
   S,T,A : string;
   S,T,A : string;
 
 
 begin
 begin
-  Case V of
-    voRead     : S:='Read';
-    voReadList : S:='ReadList';
-    voCreate   : S:='Create';
-    voDelete   : S:='Delete';
-    voUpdate   : S:='Update';
-  end;
-  If V in [voCreate,voDelete,voUpdate] then
-    A:='Update'
+  // Ancestor name
+  // Common setup case
+  If (V in [voCreate,voUpdate]) and (UseCommonSetupParams) then
+    A:=Format('TUpdateCreate%sVisitor',[StripType(ObjectClassName)])
+  else If (V in [voCreate,voDelete,voUpdate,voCommonSetupParams]) then
+    A:='TtiVisitorUpdate'
   else
   else
-    A:='Select';
-  S:=Format('T%s%sVisitor',[S,StripType(ObjectClassName)]);
+    A:='TtiVisitorSelect';
+  // Real class
+  S:=VisitorClassName(V,ObjectClassName);
   AddLn(Strings,'{ %s }',[S]);
   AddLn(Strings,'{ %s }',[S]);
-  AddlN(Strings,'%s = Class(TtiVisitor%s)',[S,A]);
+  AddlN(Strings,'%s = Class(%s)',[S,A]);
   AddlN(Strings,'Protected');
   AddlN(Strings,'Protected');
   IncIndent;
   IncIndent;
   Try
   Try
-    AddLn(Strings,'Procedure Init; override;');
-    AddLn(Strings,'Function AcceptVisitor : Boolean; override;');
-    AddLn(Strings,'Procedure SetupParams; override;');
-    If Not (V in [voCreate,voDelete,voUpdate]) then
+    If (V<>VoCommonSetupParams) then
+      begin
+      AddLn(Strings,'Procedure Init; override;');
+      AddLn(Strings,'Function AcceptVisitor : Boolean; override;');
+      If Not ((V in [voCreate,voUpdate]) and UseCommonSetupParams) then
+        AddLn(Strings,'Procedure SetupParams; override;');
+      end
+    else
+      AddLn(Strings,'Procedure SetupParams; override;');
+    If (V in [voRead,voReadList]) then
       AddLn(Strings,'Procedure MapRowToObject; override;');
       AddLn(Strings,'Procedure MapRowToObject; override;');
+    if (V in TiOPFOptions.FinalVisitors) then
+      Addln(Strings,'Procedure Execute(Const AData : TtiVisited); override;');
   Finally
   Finally
     DecIndent;
     DecIndent;
   end;
   end;
@@ -347,7 +526,7 @@ procedure TTiOPFCodeGenerator.WriteSQLConstants(Strings : TStrings);
 
 
 Const
 Const
   VisSQL : Array [TVisitorOption] of string
   VisSQL : Array [TVisitorOption] of string
-         = ('Read','ReadList','Create','Delete','Update');
+         = ('Read','ReadList','Create','Delete','Update','','');
 
 
 Var
 Var
   OCN,S : String;
   OCN,S : String;
@@ -359,7 +538,8 @@ begin
   try
   try
     OCN:=StripType(TiOPFOptions.ObjectClassName);
     OCN:=StripType(TiOPFOptions.ObjectClassName);
     For V:=Low(TVisitorOption) to High(TVisitorOption) do
     For V:=Low(TVisitorOption) to High(TVisitorOption) do
-      If V in TiOPFOptions.VisitorOptions then
+      If ((V in TiOPFOptions.VisitorOptions) or
+           (SingleSaveVisitor and (V in [voCreate,voUpdate,voDelete]))) and (VisSQL[V]<>'') then
         begin
         begin
         S:=CreateSQLStatement(V);
         S:=CreateSQLStatement(V);
         S:=Format('SQL%s%s = ''%s'';',[VisSQL[V],OCN,S]);
         S:=Format('SQL%s%s = ''%s'';',[VisSQL[V],OCN,S]);
@@ -371,6 +551,33 @@ begin
   AddLn(Strings,'');
   AddLn(Strings,'');
 end;
 end;
 
 
+procedure TTiOPFCodeGenerator.WriteTerminateVisitor(Strings  : TStrings;V : TVisitorOption;
+  const ObjectClassName: String);
+
+Var
+  S  : String;
+begin
+  S:=VisitorclassName(V,ObjectClassName);
+  S:=Format('Procedure %s.Execute(Const AData : TtiVisited);',[S]);
+  BeginMethod(Strings,S);
+  AddLn(Strings,'begin');
+  IncIndent;
+  try
+    AddLn(Strings,'Inherited Execute(AData);');
+    Addln(Strings,'If not AcceptVisitor then');
+    IncIndent;
+    Try
+      Addln(Strings,'Exit; // ==>');
+    Finally
+      DecIndent;
+    end;
+    AddLn(Strings,'ContinueVisiting:=False;');
+  Finally
+    DecIndent;
+  end;
+  EndMethod(Strings,S);
+end;
+
 
 
 procedure TTiOPFCodeGenerator.DoGenerateImplementation(Strings: TStrings);
 procedure TTiOPFCodeGenerator.DoGenerateImplementation(Strings: TStrings);
 
 
@@ -400,12 +607,16 @@ procedure TTiOPFCodeGenerator.WriteVisitorImplementation(Strings : TStrings; V :
 
 
 begin
 begin
   Case V of
   Case V of
-    voRead     : WriteReadVisitor(Strings,ObjectClassName);
-    voReadList : WriteReadListVisitor(Strings,ObjectClassName);
-    voCreate   : WriteCreateVisitor(Strings,ObjectClassName);
-    voDelete   : WriteDeleteVisitor(Strings,ObjectClassName);
-    voUpdate   : WriteUpdateVisitor(Strings,ObjectClassName);
+    voRead              : WriteReadVisitor(Strings,ObjectClassName);
+    voReadList          : WriteReadListVisitor(Strings,ObjectClassName);
+    voCreate            : WriteCreateVisitor(Strings,ObjectClassName);
+    voDelete            : WriteDeleteVisitor(Strings,ObjectClassName);
+    voUpdate            : WriteUpdateVisitor(Strings,ObjectClassName);
+    voCommonSetupParams : WriteCommonSetupVisitor(Strings,ObjectClassName);
+    voSingleSaveVisitor : WriteSaveVisitor(Strings,ObjectClassName);
   end;
   end;
+  If v in TiOPFOptions.FinalVisitors then
+    WriteTerminateVisitor(Strings,V,ObjectClassName);
 end;
 end;
 
 
 Function TTiOPFCodeGenerator.BeginInit(Strings : TStrings; const AClass : String) : String;
 Function TTiOPFCodeGenerator.BeginInit(Strings : TStrings; const AClass : String) : String;
@@ -477,7 +688,7 @@ Var
 begin
 begin
   OCN:=StripType(ObjectClassName);
   OCN:=StripType(ObjectClassName);
   CS:=Format('SQLRead%s',[OCN]);
   CS:=Format('SQLRead%s',[OCN]);
-  C:=Format('TRead%sVisitor',[OCN]);
+  C:=VisitorClassName(voRead,OCN);
   Addln(Strings,'{ %s }',[C]);
   Addln(Strings,'{ %s }',[C]);
   Addln(Strings);
   Addln(Strings);
   // Init
   // Init
@@ -533,13 +744,9 @@ begin
         S:='AsBoolean';
         S:='AsBoolean';
       ptShortint, ptByte,
       ptShortint, ptByte,
       ptSmallInt, ptWord,
       ptSmallInt, ptWord,
-      ptLongint, ptCardinal :
+      ptLongint, ptCardinal,
+      ptInt64:
         S:='AsInteger';
         S:='AsInteger';
-      ptInt64, ptQWord:
-        If F.FieldType=ftLargeInt then
-          R:=Format('O.%s:=(FieldByName(%s) as TLargeIntField).AsLargeInt;',[PN,SFN])
-        else
-          S:='AsInteger';
       ptShortString, ptAnsiString, ptWideString :
       ptShortString, ptAnsiString, ptWideString :
         S:='AsString';
         S:='AsString';
       ptSingle, ptDouble, ptExtended, ptComp :
       ptSingle, ptDouble, ptExtended, ptComp :
@@ -581,13 +788,9 @@ begin
         S:='AsBoolean';
         S:='AsBoolean';
       ptShortint, ptByte,
       ptShortint, ptByte,
       ptSmallInt, ptWord,
       ptSmallInt, ptWord,
-      ptLongint, ptCardinal :
+      ptLongint, ptCardinal,
+      ptInt64, ptQWord :
         S:='AsInteger';
         S:='AsInteger';
-      ptInt64, ptQWord:
-        If F.FieldType=ftLargeInt then
-          R:=Format('O.%s:=(Name(%s) as TLargeIntField).AsLargeInt;',[PN,SFN])
-        else
-          S:='AsInteger';
       ptShortString, ptAnsiString, ptWideString :
       ptShortString, ptAnsiString, ptWideString :
         S:='AsString';
         S:='AsString';
       ptSingle, ptDouble, ptExtended, ptComp :
       ptSingle, ptDouble, ptExtended, ptComp :
@@ -626,7 +829,7 @@ begin
   LN:=tiOPFOptions.ListClassName;
   LN:=tiOPFOptions.ListClassName;
   OCN:=StripType(ObjectClassName);
   OCN:=StripType(ObjectClassName);
   CS:=Format('SQLReadList%s',[OCN]);
   CS:=Format('SQLReadList%s',[OCN]);
-  C:=Format('TReadList%sVisitor',[StripType(OCN)]);
+  C:=VisitorClassName(voReadList,OCN);
   Addln(Strings,'{ %s }',[C]);
   Addln(Strings,'{ %s }',[C]);
   Addln(Strings);
   Addln(Strings);
   // Init
   // Init
@@ -676,7 +879,7 @@ Var
 begin
 begin
   OCN:=StripType(ObjectClassName);
   OCN:=StripType(ObjectClassName);
   CS:=Format('SQLCreate%s',[OCN]);
   CS:=Format('SQLCreate%s',[OCN]);
-  C:=Format('TCreate%sVisitor',[OCN]);
+  C:=VisitorClassName(voCreate,OCN);
   Addln(Strings,'{ %s }',[C]);
   Addln(Strings,'{ %s }',[C]);
   Addln(Strings);
   Addln(Strings);
   // Init
   // Init
@@ -689,8 +892,19 @@ begin
   AddLn(Strings,'Result:=Result and (Visited.ObjectState=posCreate);');
   AddLn(Strings,'Result:=Result and (Visited.ObjectState=posCreate);');
   DecIndent;
   DecIndent;
   EndMethod(Strings,S);
   EndMethod(Strings,S);
+  If Not (UseCommonSetupParams) then
+    WriteSetupParams(Strings,C,ObjectClassName);
+end;
+
+procedure TTiOPFCodeGenerator.WriteSetupParams(Strings : TStrings; Const AClassName,ObjectClassName : String);
+
+Var
+  S : String;
+  I : Integer;
+
+begin
   // SetupParams
   // SetupParams
-  S:=BeginSetupParams(Strings,C,ObjectClassName,True);
+  S:=BeginSetupParams(Strings,AClassName,ObjectClassName,True);
   Addln(Strings,'With Query do',[ObjectClassName]);
   Addln(Strings,'With Query do',[ObjectClassName]);
   IncINdent;
   IncINdent;
   try
   try
@@ -721,7 +935,7 @@ Var
 begin
 begin
   OCN:=StripType(ObjectClassName);
   OCN:=StripType(ObjectClassName);
   CS:=Format('SQLDelete%s',[OCN]);
   CS:=Format('SQLDelete%s',[OCN]);
-  C:=Format('TDelete%sVisitor',[StripType(ObjectClassName)]);
+  C:=VisitorClassName(voDelete,OCN);
   Addln(Strings,'{ %s }',[C]);
   Addln(Strings,'{ %s }',[C]);
   // Init
   // Init
   S:=BeginInit(Strings,C);
   S:=BeginInit(Strings,C);
@@ -753,7 +967,7 @@ Var
 begin
 begin
   OCN:=StripType(ObjectClassName);
   OCN:=StripType(ObjectClassName);
   CS:=Format('SQLUpdate%s',[OCN]);
   CS:=Format('SQLUpdate%s',[OCN]);
-  C:=Format('TUpdate%sVisitor',[OCN]);
+  C:=VisitorClassName(voUpdate,OCN);
   Addln(Strings,'{ %s }',[C]);
   Addln(Strings,'{ %s }',[C]);
   Addln(Strings);
   Addln(Strings);
   // Init
   // Init
@@ -766,26 +980,11 @@ begin
   AddLn(Strings,'Result:=Result and (Visited.ObjectState=posUpdate);');
   AddLn(Strings,'Result:=Result and (Visited.ObjectState=posUpdate);');
   DecIndent;
   DecIndent;
   EndMethod(Strings,S);
   EndMethod(Strings,S);
-  // SetupParams
-  S:=BeginSetupParams(Strings,C,ObjectClassName,True);
-  Addln(Strings,'With Query do',[ObjectClassName]);
-  IncINdent;
-  try
-    Addln(Strings,'begin');
-    For I:=0 to Fields.Count-1 do
-      If Fields[i].Enabled then
-        WriteAssignToParam(Strings,Fields[i]);
-    Addln(Strings,'end;');
-  finally
-    DecIndent;
-  end;
-  DecIndent;
-  EndMethod(Strings,S);
+  If Not (UseCommonSetupParams) then
+    WriteSetupParams(Strings,C,ObjectClassName);
 end;
 end;
 
 
 
 
-
-
 { ---------------------------------------------------------------------
 { ---------------------------------------------------------------------
   List object commands
   List object commands
   ---------------------------------------------------------------------}
   ---------------------------------------------------------------------}