打印本文 打印本文 关闭窗口 关闭窗口
Web Application 開 發 利 器 - WebSnap(七)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数3040  更新时间:2009/4/23 18:40:09  文章录入:mintao  责任编辑:mintao
function TMySessionPagedAdapter.AddToList(Value:string):Boolean;

begin

  Result:=True;

  if not FindSession(Value,foNothing) then

    begin

      if not FindSession('''''''',foNothing,Value) then

       begin

        try

         VarArrayUnLock(FSessionVariant);

         VarArrayRedim(FSessionVariant,FDeleteArraySize+1);

         FDeleteArray:=VarArrayLock(FSessionVariant);

         FDeleteArray[FDeleteArraySize+1]:=Value;

         Inc(FDeleteArraySize);

        except

         Result:=False;

        end;

       end;

    end;

end;

 

function TMySessionPagedAdapter.FindSession(Value:string;FindOperation:TFindOperation;AddValue:string=''''''''):Boolean;

var

 I:Integer;

 bFind:Boolean;

begin

 bFind:=False;

 if FDeleteArraySize <> -1 then

    begin

     for I:=0 to FDeleteArraySize do

       begin

        if (not VarIsEmpty(FDeleteArray[I])) and (Value = FDeleteArray[I]) then

         begin

           bFind:=True;

           if FindOperation = foDelete then

              FDeleteArray[I]:=Unassigned;

           break;

         end;

        if (Value = '''''''') and (AddValue <> '''''''') and (VarIsEmpty(FDeleteArray[I])) then

         begin

          bFind:=True;

          FDeleteArray[I]:=AddValue;

          break;

         end;

       end;

    end;

 Result:=bFind;

end;

 

AddToList 及 FindSession 是 用 來 處 理 Session 的 程 式 , 我 們 利 用 了 一 個 Variant Array 來 儲 存 使 用 者 所 挑 選 的 檔 案 名 稱 , FDeleteArray 是 一 個 陣 列 指 標 , 我 們 在 操 作 Variant Array 之 前 會 先 使 用 VarArrayLock 來 加 快 處 理 Variant Array 的 速 度 .

procedure TMySessionPagedAdapter.WebPageModuleBeforeDispatchPage(

  Sender: TObject; const PageName: String; var Handled: Boolean);

begin

  InitializeList(AppPath+''''\*.*'''');

  FSessionVariant:=Session.Values[''''DeleteList''''];

  if VarIsEmpty(FSessionVariant) then

   begin

     FSessionVariant:=VarArrayCreate([0,0],varVariant);

     FSessionVariant[0]:=Unassigned;

     Session.Values[''''DeleteList'''']:=FSessionVariant;

     FDeleteArraySize:=0;

   end

  else

     FDeleteArraySize:=VarArrayHighBound(FSessionVariant,1);

  FDeleteArray:=VarArrayLock(FSessionVariant);

end;

 

我 們 選 擇 了 在 BeforeDispatchPage 事 件 中 將 Session 取 出 並 Lock 後 對 應 至 FDeleteArray 中 。

 

procedure TMySessionPagedAdapter.WebPageModuleAfterDispatchPage(

  Sender: TObject; const PageName: String);

begin

  VarArrayUnLock(FSessionVariant);

  Session.Values[''''DeleteList'''']:=FSessionVariant;

end;

 

 

在 Dispatch 之 後 我 們 將 Variant UnLock 後 存 回 Session 中 。

 

procedure TMySessionPagedAdapter.AdaptDeleteGetValue(Sender: TObject;

  var Value: Boolean);

begin

  Value:=FindSession(AdaptFileName.Value,foNothing);

end;

 

 

我 們 在 這 個 範 例 中 提 供 一 個 checkbox 在 每 一 筆 資 料 後 面 , 這 個 值 必 須 由 Session 中 取 出 。

 

procedure TMySessionPagedAdapter.AdaptDeleteUpdateValue(Sender: TObject;

  Value: Boolean);

begin

  AddToList(FStrings.Names[OrpEditablePagedAdapter1.CurrentUpdateIndex])

end;

 

當 使 用 者 選 定 檔 案 或 是 切 換 至 其 它 的 Page 時 , 我 們 要 執 行 Adapter 的 UpdateRecords 函 式 , 她 會 觸 發 AdapterField 的 UpdateValue 事 件 , 這 裡 我 們 使 用 了 TOrpEditablePagedAdapter 的 特 有 屬 性 :CurrentUpdateIndex , 這 個 屬 性 會 告 知 我 們 目 前 更 新 的 記 錄 位 置 , 我 們 再 由 FStrings 取 出 對 應 的 檔 名 . 

procedure TMySessionPagedAdapter.ActionPrevPageBeforeExecute(

  Sender: TObject; Params: TStrings; var Handled: Boolean);

var

  I,iClearStart,iClearEnd:Integer;

begin

  FSessionVariant:=Session.Values[''''DeleteList''''];

  FDeleteArray:=VarArrayLock(FSessionVariant);

  iClearStart:=OrpEditablePagedAdapter1.RecordIndex;

  iClearEnd:=OrpEditablePagedAdapter1.PageSize +

                  OrpEditablePagedAdapter1.RecordIndex;

  if iClearEnd > (FStrings.Count-1) then

     iClearEnd:=FStrings.Count-1;

  for I:=iClearStart to iClearEnd do

     FindSession(FStrings.Names[I],foDelete);

  OrpEditablePagedAdapter1.UpdateRecords((WebContext.AdapterRequest as IActionRequest));

  VarArrayUnlock(FSessionVariant);

  Session.Values[''''DeleteList'''']:=FSessionVariant;

end;

 

你 可 以 在 範 例 程 式 中 發 現 我 將 Goto , Prev , NextPage 三 個 Action 的 BeforeExecute 事 件 都 指 向 了 這 個 事 件 , 這 是 為 了 讓 使 用 者 操 作 方 便 , 不 需 要 再 按 另 一 個 按 紐 來 更 新 所 選 擇 的 檔 案 。 

procedure TMySessionPagedAdapter.AdaptDeleteFileExecute(Sender: TObject;

 Params: TStrings);

 var

  I:Integer;

begin

  FSessionVariant:=Session.Values[''''DeleteList''''];

  FDeleteArray:=VarArrayLock(FSessionVariant);

  OrpEditablePagedAdapter1.UpdateRecords((WebContext.AdapterRequest as IActionRequest));

  for I:=0 to FDeleteAr

上一页  [1] [2] [3] [4]  下一页

打印本文 打印本文 关闭窗口 关闭窗口