Browse Source

* Close dataset again when its not necessary anymore
* Implemented THTMLPageProducer
* Fixed possible AV regarding UseValues
* Renamed THTMLCustomEntityProducer.OnWritePage to OnWriteEntity
* Fixed some visibility notes (protected/public)

git-svn-id: trunk@12780 -

joost 16 năm trước cách đây
mục cha
commit
60d4f81cfa
1 tập tin đã thay đổi với 114 bổ sung17 xóa
  1. 114 17
      packages/fcl-web/src/fphtml.pp

+ 114 - 17
packages/fcl-web/src/fphtml.pp

@@ -57,25 +57,69 @@ type
 
   THTMLCustomEntityProducer = class (THTMLContentProducer)
   private
-    FOnWritePage: TWriterEvent;
+    FOnWriteEntity: TWriterEvent;
     FEntity: THtmlEntities;
   protected
-    function WriteContent (aWriter : THTMLWriter) : THTMLCustomElement; override;
-    procedure DoWritePage (aWriter : THTMLWriter); virtual;
+    procedure DoWriteEntity (aWriter : THTMLWriter); virtual;
+    Property OnWriteEntity : TWriterEvent read FOnWriteEntity write FOnWriteEntity;
+    Property Entity : THtmlEntities read FEntity write FEntity default heHtml;
   public
     constructor Create(AOwner: TComponent); override;
-    Property OnWritePage : TWriterEvent read FOnWritePage write FOnWritePage;
-    Property Entity : THtmlEntities read FEntity write FEntity default heHtml;
+    function WriteContent (aWriter : THTMLWriter) : THTMLCustomElement; override;
   end;
 
-  { THTMLCustomPagContentProducer }
+  { THTMLEntityContentProducer }
 
   THTMLEntityProducer = class (THTMLCustomEntityProducer)
   published
-    Property OnWritePage;
+    Property OnWriteEntity;
     Property Entity;
   end;
 
+  { THTMLCustomPageProducer }
+
+  THTMLCustomPageProducer = class (THTMLCustomEntityProducer)
+  private
+    FHeaderProducer : THTMLContentProducer;
+    FOnWriteHeader: TWriterEvent;
+    FOnWriteVisualBody: TWriterEvent;
+    FOnWriteVisualFooter: TWriterEvent;
+    FOnWriteVisualHeader: TWriterEvent;
+    FVisualHeaderProducer : THTMLContentProducer;
+    FVisualBodyProducer : THTMLContentProducer;
+    FVisualFooterProducer : THTMLContentProducer;
+  protected
+    procedure DoWriteEntity (aWriter : THTMLWriter); override;
+    procedure DoWriteHeader (aWriter : THTMLWriter); virtual;
+    procedure DoWriteVisualHeader (aWriter : THTMLWriter); virtual;
+    procedure DoWriteVisualBody (aWriter : THTMLWriter); virtual;
+    procedure DoWriteVisualFooter (aWriter : THTMLWriter); virtual;
+    Property HeaderProducer : THTMLContentProducer read FHeaderProducer write FHeaderProducer;
+    Property VisualHeaderProducer : THTMLContentProducer read FVisualHeaderProducer write FVisualHeaderProducer;
+    Property VisualBodyProducer : THTMLContentProducer read FVisualBodyProducer write FVisualBodyProducer;
+    Property VisualFooterProducer : THTMLContentProducer read FVisualFooterProducer write FVisualFooterProducer;
+    Property OnWriteHeader : TWriterEvent read FOnWriteHeader write FOnWriteHeader;
+    Property OnWriteVisualHeader : TWriterEvent read FOnWriteVisualHeader write FOnWriteVisualHeader;
+    Property OnWriteVisualBody : TWriterEvent read FOnWriteVisualBody write FOnWriteVisualBody;
+    Property OnWriteVisualFooter : TWriterEvent read FOnWriteVisualFooter write FOnWriteVisualFooter;
+  public
+    constructor Create(AOwner: TComponent); override;
+  end;
+
+  { THTMLPageProducer }
+
+  THTMLPageProducer = class (THTMLCustomPageProducer)
+  published
+    property OnWriteHeader;
+    property OnWriteVisualHeader;
+    property OnWriteVisualBody;
+    property OnWriteVisualFooter;
+    Property HeaderProducer;
+    Property VisualHeaderProducer;
+    Property VisualBodyProducer;
+    Property VisualFooterProducer;
+  end;
+
   { THTMLCustomDatasetContentProducer }
 
   THTMLCustomDatasetContentProducer = class (THTMLContentProducer)
@@ -88,11 +132,11 @@ type
     procedure WriteFooter (aWriter : THTMLWriter);
     procedure WriteRecord (aWriter : THTMLWriter);
   protected
-    function WriteContent (aWriter : THTMLWriter) : THTMLCustomElement; override;
     procedure DoWriteHeader (aWriter : THTMLWriter; var el : THTMLCustomElement); virtual;
     procedure DoWriteFooter (aWriter : THTMLWriter); virtual;
     procedure DoWriteRecord (aWriter : THTMLWriter); virtual;
   public
+    function WriteContent (aWriter : THTMLWriter) : THTMLCustomElement; override;
     Property OnWriteHeader : TWriterElementEvent read FOnWriteHeader write FOnWriteHeader;
     Property OnWriteFooter : TWriterEvent read FOnWriteFooter write FOnWriteFooter;
     Property OnWriteRecord : TWriterEvent read FOnWriteRecord write FOnWriteRecord;
@@ -119,11 +163,10 @@ type
     FSize: integer;
     FUseValues: boolean;
     procedure SetItems(const AValue: TStrings);
-  protected
-    function WriteContent (aWriter : THTMLWriter) : THTMLCustomElement; override;
   public
     constructor create (aOwner : TComponent); override;
     destructor destroy; override;
+    function WriteContent (aWriter : THTMLWriter) : THTMLCustomElement; override;
   published
     property Items : TStrings read FItems write SetItems;
     property UseValues : boolean read FUseValues write FUseValues default false;
@@ -318,7 +361,7 @@ begin
               next;
               end;
           finally
-            if opened then
+            if not opened then
               close;
           end;
     finally
@@ -401,8 +444,11 @@ begin
     with aWriter.Option(FItem.asstring) do
       begin
       if FUseValues then
-        sel := (FValue.AsString = FPreSelected)
-      else
+        begin
+        if assigned(FValue) then
+          sel := (FValue.AsString = FPreSelected)
+        end
+      else if assigned(FItem) then
         sel := (FItem.AsString = FPreSelected);
       if assigned (FIsPreSelected) then
         FIsPreSelected (self, sel);
@@ -514,14 +560,14 @@ function THTMLCustomEntityProducer.WriteContent(aWriter: THTMLWriter
   ): THTMLCustomElement;
 begin
   result := aWriter.StartElement(THtmlEntitiesClasses[FEntity]);
-  DoWritePage(aWriter);
+  DoWriteEntity(aWriter);
   aWriter.EndElement(THtmlEntitiesClasses[FEntity]);
 end;
 
-procedure THTMLCustomEntityProducer.DoWritePage(aWriter: THTMLWriter);
+procedure THTMLCustomEntityProducer.DoWriteEntity(aWriter: THTMLWriter);
 begin
-  if assigned (FOnWritePage) then
-    FOnWritePage (self, aWriter);
+  if assigned (FOnWriteEntity) then
+    FOnWriteEntity (self, aWriter);
 end;
 
 constructor THTMLCustomEntityProducer.Create(AOwner: TComponent);
@@ -530,5 +576,56 @@ begin
   FEntity := heHtml;
 end;
 
+{ THTMLCustomPageProducer }
+
+procedure THTMLCustomPageProducer.DoWriteEntity(aWriter: THTMLWriter);
+begin
+  inherited DoWriteEntity(aWriter);
+  DoWriteHeader(aWriter);
+  aWriter.Startbody;
+  DoWriteVisualHeader(aWriter);
+  DoWriteVisualBody(aWriter);
+  DoWriteVisualFooter(aWriter);
+  awriter.Endbody;
+end;
+
+procedure THTMLCustomPageProducer.DoWriteHeader(aWriter: THTMLWriter);
+begin
+  if assigned(FOnWriteHeader) then
+    FOnWriteHeader(self,aWriter);
+  if assigned(FHeaderProducer) then
+    aWriter.AddElement(FHeaderProducer.WriteContent(aWriter));
+end;
+
+procedure THTMLCustomPageProducer.DoWriteVisualHeader(aWriter: THTMLWriter);
+begin
+  if assigned(FOnWriteVisualHeader) then
+    FOnWriteVisualHeader(self,aWriter);
+  if assigned(FVisualHeaderProducer) then
+    aWriter.AddElement(FVisualHeaderProducer.WriteContent(aWriter));
+end;
+
+procedure THTMLCustomPageProducer.DoWriteVisualBody(aWriter: THTMLWriter);
+begin
+  if assigned(FOnWriteVisualBody) then
+    FOnWriteVisualBody(self,aWriter);
+  if assigned(FVisualBodyProducer) then
+    aWriter.AddElement(FVisualBodyProducer.WriteContent(aWriter));
+end;
+
+procedure THTMLCustomPageProducer.DoWriteVisualFooter(aWriter: THTMLWriter);
+begin
+  if assigned(FOnWriteVisualFooter) then
+    FOnWriteVisualFooter(self,aWriter);
+  if assigned(FVisualFooterProducer) then
+    aWriter.AddElement(FVisualFooterProducer.WriteContent(aWriter));
+end;
+
+constructor THTMLCustomPageProducer.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  Entity := heHtml;
+end;
+
 end.