亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? memtableeh.pas

?? ehlib31控件包
?? PAS
?? 第 1 頁 / 共 5 頁
字號:
    function GetBlobFromRecord(Field: TField): TMemBlobData;
    function GetBlobSize: Longint;
  public
    constructor Create(Field: TBlobField; Mode: TBlobStreamMode);
    destructor Destroy; override;
    function Read(var Buffer; Count: Longint): Longint; override;
    function Seek(Offset: Longint; Origin: Word): Longint; override;
    function Write(const Buffer; Count: Longint): Longint; override;
    procedure Truncate;
  end;

{ TMemTableEh }

  TMemTableEh = class(TCustomMemTableEh)
  published
    property Active;
    property AutoCalcFields;
    property CachedUpdates;
    property DetailFields;
    property FieldDefs;
    property Filtered;
    property FetchAllOnOpen; //FetchAllOnOpen
    property KeyFields;
    property MasterDetailSide;
    property MasterFields;
    property MasterSource;
    property Params;
    property ProviderDataSet;
    property ReadOnly;
//    property ObjectView default False;

    property BeforeOpen;
    property AfterOpen;
    property BeforeClose;
    property AfterClose;
    property BeforeInsert;
    property AfterInsert;
    property BeforeEdit;
    property AfterEdit;
    property BeforePost;
    property AfterPost;
    property BeforeCancel;
    property AfterCancel;
    property BeforeDelete;
    property AfterDelete;
    property BeforeScroll;
    property AfterScroll;
    property BeforeRefresh;
    property AfterRefresh;
    property OnCalcFields;
    property OnDeleteError;
    property OnEditError;
    property OnFetchRecord;
    property OnFilterRecord;
    property OnNewRecord;
    property OnPostError;
    property OnUpdateRecord;
  end;

procedure Register;

implementation

uses Forms, DbConsts, Math{, dbRecordFilter};

procedure Register;
begin
  RegisterComponents('EhLib', [TMemTableEh]);
end;

resourcestring
  SMemNoRecords = 'No data found';

const
  ftBlobTypes = [ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle,
    ftDBaseOle, ftTypedBinary {$IFDEF EH_LIB_5}, ftOraBlob, ftOraClob {$ENDIF}];

  ftSupported = [ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat,
    ftCurrency, ftDate, ftTime, ftDateTime, ftAutoInc, ftBCD, ftBytes,
    ftVarBytes, ftADT, ftFixedChar, ftWideString,
    ftLargeint {$IFDEF EH_LIB_5}, ftVariant, ftGuid {$ENDIF}] +
    ftBlobTypes;

  fkStoredFields = [fkData];

{$IFDEF EH_LIB_5}
  GuidSize = 38;
{$ENDIF}

type
  PRecInfo = ^TRecInfo;
  TRecInfo = packed record
    Bookmark: TRecIdEh;
    BookmarkFlag: TBookmarkFlag;
    RecordStatus: Integer;
    RecordNumber: Integer;
  end;

  TFieldValBuf = packed record
    IsNull: Boolean;
    DataValue: String;
  end;

  PFieldValBuf = ^TFieldValBuf;

//  TRecBufValues = array [0..0] of Pointer;
//  PRecBufValues = ^TRecBufValues;
  TFBRecBufValues = array of TFieldValBuf;

  TRecBuf = packed record
    RecInfo: TRecInfo;
    Values: TFBRecBufValues;
  end;

  PRecBuf = ^TRecBuf;

{ Utility routines }

function CompareFields(Data1, Data2: Pointer; FieldType: TFieldType;
  CaseInsensitive: Boolean): Integer;
begin
  Result := 0;
  case FieldType of
    ftString:
      if CaseInsensitive then
        Result := AnsiCompareText(PChar(Data1), PChar(Data2))
      else
        Result := AnsiCompareStr(PChar(Data1), PChar(Data2));
    ftSmallint:
      if SmallInt(Data1^) > SmallInt(Data2^) then
        Result := 1
      else if SmallInt(Data1^) < SmallInt(Data2^) then
        Result := -1;
    ftInteger, ftDate, ftTime, ftAutoInc:
      if Longint(Data1^) > Longint(Data2^) then
        Result := 1
      else if Longint(Data1^) < Longint(Data2^) then
        Result := -1;
    ftWord:
      if Word(Data1^) > Word(Data2^) then Result := 1
      else if Word(Data1^) < Word(Data2^) then Result := -1;
    ftBoolean:
      if WordBool(Data1^) and not WordBool(Data2^) then Result := 1
      else if not WordBool(Data1^) and WordBool(Data2^) then Result := -1;
    ftFloat, ftCurrency:
      if Double(Data1^) > Double(Data2^) then Result := 1
      else if Double(Data1^) < Double(Data2^) then Result := -1;
    ftDateTime:
      if TDateTime(Data1^) > TDateTime(Data2^) then Result := 1
      else if TDateTime(Data1^) < TDateTime(Data2^) then Result := -1;
    ftFixedChar:
      if CaseInsensitive then
        Result := AnsiCompareText(PChar(Data1), PChar(Data2))
      else
        Result := AnsiCompareStr(PChar(Data1), PChar(Data2));
    ftWideString:
      if CaseInsensitive then
        Result := AnsiCompareText(WideCharToString(PWideChar(Data1)),
          WideCharToString(PWideChar(Data2)))
      else
        Result := AnsiCompareStr(WideCharToString(PWideChar(Data1)),
          WideCharToString(PWideChar(Data2)));
    ftLargeint:
      if Int64(Data1^) > Int64(Data2^) then Result := 1
      else if Int64(Data1^) < Int64(Data2^) then Result := -1;
{$IFDEF EH_LIB_5}
    ftVariant:
      Result := 0;
    ftGuid:
      Result := AnsiCompareText(PChar(Data1), PChar(Data2));
{$ENDIF}
  end;
end;

function CalcFieldLen(FieldType: TFieldType; Size: Word): Word;
begin
  if not (FieldType in ftSupported) then
    Result := 0
  else if (FieldType in ftBlobTypes) then
    Result := SizeOf(Longint)
  else
  begin
    Result := Size;
    case FieldType of
      ftString: Inc(Result);
      ftSmallint: Result := SizeOf(SmallInt);
      ftInteger: Result := SizeOf(Longint);
      ftWord: Result := SizeOf(Word);
      ftBoolean: Result := SizeOf(WordBool);
      ftFloat: Result := SizeOf(Double);
      ftCurrency: Result := SizeOf(Double);
      ftBCD: Result := 34;
      ftDate, ftTime: Result := SizeOf(Longint);
      ftDateTime: Result := SizeOf(TDateTime);
      ftBytes: Result := Size;
      ftVarBytes: Result := Size + 2;
      ftAutoInc: Result := SizeOf(Longint);
      ftADT: Result := 0;
      ftFixedChar: Inc(Result);
      ftWideString: Result := (Result + 1) * 2;
      ftLargeint: Result := SizeOf(Int64);
{$IFDEF EH_LIB_5}
      ftVariant: Result := SizeOf(Variant);
      ftGuid: Result := GuidSize + 1;
{$ENDIF}
    end;
  end;
end;

procedure CalcDataSize(FieldDef: TFieldDef; var DataSize: Integer);
var
  I: Integer;
begin
  with FieldDef do
  begin
    if (DataType in ftSupported - ftBlobTypes) then
      Inc(DataSize, CalcFieldLen(DataType, Size) + 1);
    for I := 0 to ChildDefs.Count - 1 do
      CalcDataSize(ChildDefs[I], DataSize);
  end;
end;

procedure Error(const Msg: string);
begin
  DatabaseError(Msg);
end;

procedure ErrorFmt(const Msg: string; const Args: array of const);
begin
  DatabaseErrorFmt(Msg, Args);
end;

//{$DEBUGINFO OFF}
function VarEquals(const V1, V2: Variant): Boolean;
var i: Integer;
begin
  Result := not (VarIsArray(V1) xor VarIsArray(V2));
  if not Result then Exit;
  Result := False;
  try
    if VarIsArray(V1) and VarIsArray(V2) and
      (VarArrayDimCount(V1) = VarArrayDimCount(V2)) and
      (VarArrayLowBound(V1, 1) = VarArrayLowBound(V2, 1)) and
      (VarArrayHighBound(V1, 1) = VarArrayHighBound(V2, 1))
      then
      for i := VarArrayLowBound(V1, 1) to VarArrayHighBound(V1, 1) do
      begin
        Result := V1[i] = V2[i];
        if not Result then Exit;
      end
    else
      Result := V1 = V2;
  except
  end;
end;
//{$DEBUGINFO ON}

function GetOldFieldValue(DataSet: TDataSet; const FieldName: string): Variant;
var
  I: Integer;
  Fields: TList;
begin
  if Pos(';', FieldName) <> 0 then
  begin
    Fields := TList.Create;
    try
      DataSet.GetFieldList(Fields, FieldName);
      Result := VarArrayCreate([0, Fields.Count - 1], varVariant);
      for I := 0 to Fields.Count - 1 do
        Result[I] := TField(Fields[I]).OldValue;
    finally
      Fields.Free;
    end;
  end else
    Result := DataSet.FieldByName(FieldName).OldValue
end;

{ TMasterDataLinkEh }

constructor TMasterDataLinkEh.Create(DataSet: TDataSet);
begin
  inherited Create;
  FDataSet := DataSet;
  FFields := TList.Create;
end;

destructor TMasterDataLinkEh.Destroy;
begin
  FFields.Free;
  inherited Destroy;
end;

procedure TMasterDataLinkEh.ActiveChanged;
begin
  FFields.Clear;
  if Active then
    try
      DataSet.GetFieldList(FFields, FFieldNames);
    except
      FFields.Clear;
      raise;
    end;
  if FDataSet.Active and not (csDestroying in FDataSet.ComponentState) then
    if Active {and (FFields.Count > 0)} then
    begin
      if Assigned(FOnMasterChange) then FOnMasterChange(Self);
    end else
      if Assigned(FOnMasterDisable) then FOnMasterDisable(Self);
end;

procedure TMasterDataLinkEh.CheckBrowseMode;
begin
  if FDataSet.Active then FDataSet.CheckBrowseMode;
end;

function TMasterDataLinkEh.GetDetailDataSet: TDataSet;
begin
  Result := FDataSet;
end;

procedure TMasterDataLinkEh.LayoutChanged;
begin
  ActiveChanged;
end;

procedure TMasterDataLinkEh.RecordChanged(Field: TField);
begin
  if (DataSource.State <> dsSetKey) and FDataSet.Active and
    {(FFields.Count > 0) and }((Field = nil) or
    (FFields.IndexOf(Field) >= 0)) and
     Assigned(FOnMasterChange)
  then
    FOnMasterChange(Self);
end;

procedure TMasterDataLinkEh.SetFieldNames(const Value: string);
begin
  if FFieldNames <> Value then
  begin
    FFieldNames := Value;
    ActiveChanged;
  end;
end;

{ TMemoryRecordEh }

constructor TMemoryRecordEh.Create(MemoryData: TCustomMemTableEh);
begin
  inherited Create;
  New(FData);
  FUpdateStatus := usUnmodified;
  FUpdateIndex := -1;
end;

destructor TMemoryRecordEh.Destroy;
begin
  MergeChanges;
  Dispose(FData);
  inherited Destroy;
end;

function TMemoryRecordEh.GetAttached: Boolean;
begin
  Result := (Index <> -1);
end;

procedure TMemoryRecordEh.BeginEdit;
begin
  if FChangeCount = 0 then
  begin
    if FTmpOldRecValue = nil then
      New(FTmpOldRecValue);
    FTmpOldRecValue^ := FData^;
  end;
  Inc(FChangeCount);
end;

procedure TMemoryRecordEh.EndEdit(Changed: Boolean);
begin
  if Changed then
    FChanged := Changed;
  if FChangeCount > 0 then
    Dec(FChangeCount);
  if FChangeCount = 0 then
  begin
    if FChanged and (RecordsList <> nil) then
      RecordsList.Notify(Self, Index, rlnRecChangedEh);
    if FChanged and (RecordsList <> nil) and
       RecordsList.CachedUpdates and (FUpdateStatus <> usInserted) then
    begin
      FUpdateStatus := usModified;
      if FUpdateIndex = -1 then
        FUpdateIndex := RecordsList.FDeltaList.Add(Self);
      if FOldData = nil then
        FOldData := FTmpOldRecValue;
      FTmpOldRecValue := nil;
    end;
    if FTmpOldRecValue <> nil then
    begin
      Dispose(FTmpOldRecValue);
      FTmpOldRecValue := nil;
    end;
    FChanged := False;
  end;
end;

procedure TMemoryRecordEh.MergeChanges;
begin
  if FOldData = nil then Exit;
  Dispose(FOldData);
  FOldData := nil;
  FUpdateStatus := usUnmodified;
end;

function TMemoryRecordEh.GetIndex: Integer;
begin
  if FRecordsList <> nil then
    Result := FRecordsList.IndexOf(Self) else
    Result := -1;
end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久天天| 国产九色sp调教91| 欧美色老头old∨ideo| 亚洲激情自拍视频| 欧美午夜精品一区二区三区| 天堂蜜桃91精品| 欧美成人bangbros| 国产一区二区三区蝌蚪| 中文字幕一区视频| 欧美三级中文字| 老鸭窝一区二区久久精品| 精品国产自在久精品国产| 国产精品一品视频| 亚洲免费高清视频在线| 欧美精品久久99| 国产综合久久久久久久久久久久| 久久九九99视频| 日本福利一区二区| 男人操女人的视频在线观看欧美| 久久久久国产精品麻豆ai换脸 | 2021国产精品久久精品| 国产精品羞羞答答xxdd| 中文字幕不卡的av| 欧美三级视频在线观看| 蜜桃视频在线观看一区| 国产精品天天看| 欧美日韩精品福利| 国产精品一区二区久久不卡| 亚洲麻豆国产自偷在线| 日韩精品专区在线影院观看| 国产91在线|亚洲| 丝袜美腿亚洲一区二区图片| 日本一区二区动态图| 欧美日韩中文精品| 成人国产在线观看| 奇米影视一区二区三区小说| 久久久久久久久99精品| 欧美另类高清zo欧美| 成人性生交大片| 天堂va蜜桃一区二区三区漫画版| 国产午夜精品一区二区三区嫩草 | 国产午夜精品一区二区三区嫩草| 在线免费不卡视频| 懂色av一区二区三区蜜臀| 亚洲国产日韩一级| 国产婷婷色一区二区三区四区| 欧美中文字幕亚洲一区二区va在线| 国产最新精品精品你懂的| 一区二区三区在线看| 久久精品视频一区| 日韩精品一区二区三区中文不卡 | 中文字幕不卡的av| 欧美人牲a欧美精品| 亚洲午夜久久久久久久久电影网 | 亚洲激情在线播放| 日韩免费福利电影在线观看| 成人免费视频app| 国产91色综合久久免费分享| 午夜久久久影院| 亚洲欧美一区二区三区久本道91| 777久久久精品| www.日韩av| 精品一区精品二区高清| 亚洲成人激情自拍| 亚洲欧美综合在线精品| 538在线一区二区精品国产| 成人不卡免费av| 免费观看在线综合色| 亚洲人123区| 国产欧美一区二区三区网站| 欧美一区二区三区视频| 成人av在线网| 国产资源精品在线观看| 视频一区在线播放| 亚洲精品欧美二区三区中文字幕| 国产欧美综合在线观看第十页| 欧美在线一区二区| 成人中文字幕电影| 精品伊人久久久久7777人| 亚洲h动漫在线| 亚洲欧美日韩系列| 1024成人网| 中文字幕在线观看不卡| 日韩精品一区二区三区老鸭窝| 欧美亚洲高清一区二区三区不卡| 成人av资源在线| 懂色av中文一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 欧美sm极限捆绑bd| 制服丝袜成人动漫| 欧美人狂配大交3d怪物一区| 在线观看网站黄不卡| 91黄色激情网站| 欧美综合一区二区| 在线观看一区二区视频| 色婷婷狠狠综合| 色域天天综合网| 粉嫩欧美一区二区三区高清影视 | 中文在线免费一区三区高中清不卡| 日韩欧美一区二区在线视频| 欧美日韩视频一区二区| 欧美亚洲综合另类| 8v天堂国产在线一区二区| 91精品国产综合久久香蕉的特点 | 国产自产v一区二区三区c| 激情综合一区二区三区| 久久电影国产免费久久电影| 麻豆91小视频| 国产盗摄一区二区三区| 成人的网站免费观看| 91热门视频在线观看| 欧美在线播放高清精品| 欧美日韩久久久一区| 欧美一二三在线| 国产午夜精品福利| 亚洲欧美另类小说| 亚洲午夜久久久久| 国产凹凸在线观看一区二区| 成人中文字幕电影| 在线观看欧美日本| 欧美日韩在线直播| 欧美激情一区二区三区在线| 国产精品久久久久影院亚瑟| 一区二区高清免费观看影视大全| 婷婷久久综合九色综合绿巨人| 久久精品噜噜噜成人88aⅴ | 欧美日韩国产影片| 久久综合色天天久久综合图片| 国产精品乱人伦中文| 亚洲香肠在线观看| 麻豆一区二区在线| 日本精品裸体写真集在线观看 | 欧美日韩高清一区二区不卡 | 91精品国产综合久久精品图片 | 欧美伊人精品成人久久综合97| 欧美精品1区2区3区| 久久久美女艺术照精彩视频福利播放| 欧美国产日韩亚洲一区| 亚洲主播在线观看| 国产精品白丝jk黑袜喷水| 色欧美日韩亚洲| 欧美大片一区二区三区| 久久精品一区二区三区四区| 欧美日韩国产综合一区二区| 精品写真视频在线观看| 99视频精品免费视频| 日韩一区二区免费视频| 中文字幕日本乱码精品影院| 手机精品视频在线观看| 国产v综合v亚洲欧| 欧美一区二区三区小说| 国产精品乱人伦| 久久精品久久精品| 99久久精品国产导航| 2020国产精品久久精品美国| 亚洲一区二区三区精品在线| 国产精品99久久久久久宅男| 欧美三级乱人伦电影| 国产欧美1区2区3区| 日本视频免费一区| 欧美在线影院一区二区| 国产精品久久久久久久久免费丝袜 | 久久夜色精品国产噜噜av | 色综合av在线| 欧美国产精品中文字幕| 老鸭窝一区二区久久精品| 风间由美一区二区av101| 欧美伦理视频网站| 国产精品久久久久国产精品日日| 蜜臀久久99精品久久久久久9| 91电影在线观看| 国产精品视频一二三区 | 国产精品香蕉一区二区三区| 91精品国产色综合久久| 亚洲高清在线精品| 国产成人啪午夜精品网站男同| 日韩一区二区三区电影在线观看| 亚洲成精国产精品女| 91麻豆swag| 亚洲精品国产精华液| 91片黄在线观看| 亚洲欧洲综合另类在线| 91免费精品国自产拍在线不卡 | 欧美婷婷六月丁香综合色| 亚洲男人的天堂网| 欧美性受极品xxxx喷水| 亚洲日本在线天堂| 欧美一区二区二区| 久久丁香综合五月国产三级网站| 国产欧美精品一区二区色综合| 91视频观看免费| 亚洲黄网站在线观看| 精品久久一区二区三区| 色天天综合久久久久综合片| 麻豆成人久久精品二区三区红 | 成人免费高清在线| 亚洲超丰满肉感bbw| 国产欧美精品日韩区二区麻豆天美| 色一情一乱一乱一91av| 精品在线免费观看|