国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

用Delphi編寫數(shù)據(jù)報(bào)存儲(chǔ)控件

用Delphi編寫數(shù)據(jù)報(bào)存儲(chǔ)控件

更新時(shí)間:2022-05-09 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

一、概述
在用Delphi編寫數(shù)據(jù)庫程序時(shí),經(jīng)常涉及到數(shù)據(jù)的導(dǎo)入和導(dǎo)出操作,如:將大型數(shù)據(jù)庫中的數(shù)據(jù)存儲(chǔ)為便攜文件,以便于出外閱讀;將存儲(chǔ)在文件中的數(shù)據(jù)信息,導(dǎo)入到另外的數(shù)據(jù)庫中;而且,通過將數(shù)據(jù)庫中的數(shù)據(jù)存儲(chǔ)為數(shù)據(jù)文件,更便于程序內(nèi)部和程序間交換數(shù)據(jù),避免通過內(nèi)存交換數(shù)據(jù)的煩瑣步驟,例如在筆者編寫的通用報(bào)表程序中即以該控件作為數(shù)據(jù)信息傳遞的載體。
二、基本思路
作為數(shù)據(jù)報(bào)存儲(chǔ)控件,應(yīng)能夠存儲(chǔ)和讀入數(shù)據(jù)集的基本信息(如:字段名,字段的顯示名稱,字段的數(shù)據(jù)類型,記錄數(shù),字段數(shù),指定記錄指定字段的當(dāng)前值等),應(yīng)能夠提供較好的封裝特性,以便于使用。
基于此,筆者利用Delphi5.0面向?qū)ο蟮奶攸c(diǎn),設(shè)計(jì)開發(fā)了數(shù)據(jù)報(bào)存儲(chǔ)控件。
三、實(shí)現(xiàn)方法
編寫如下代碼單元:
unit IbDbFile;
interface
Uses Windows, SysUtils, Classes, Forms, Db, DbTables, Dialogs;
Const
Flag = '數(shù)據(jù)報(bào)-吉星軟件工作室';
Type
TDsException = Class(Exception);
TIbStorage = class(TComponent)
private
FRptTitle: string; //存儲(chǔ)數(shù)據(jù)報(bào)說明
FPageHead: string; //頁頭說明
FPageFoot: string; //爺腳說明
FFieldNames: TStrings; //字段名表
FStreamIndex: TStrings; //字段索引
FStream: TStream; //存儲(chǔ)字段內(nèi)容的流
FFieldCount: Integer; //字段數(shù)
FRecordCount: Integer; //記錄數(shù)
FOpenFlag: Boolean; //流是否創(chuàng)建標(biāo)志
protected
procedure Reset; //復(fù)位---清空流的內(nèi)容
procedure SaveHead(ADataSet: TDataSet; Fp: TStream); //存儲(chǔ)報(bào)表頭信息
procedure LoadTableToStream(ADataSet: TDataSet); //存儲(chǔ)記錄數(shù)據(jù)
procedure IndexFields(ADataSet: TDataSet); //將數(shù)據(jù)集的字段名保存到列表中
procedure GetHead(Fp: TFileStream); //保存報(bào)表頭信息
procedure GetIndex(Fp: TFileStream); //建立記錄流索引
procedure GetFieldNames(Fp: TFileStream); //從流中讀入字段名表
function GetFieldName(AIndex: Integer): string; //取得字段名稱
function GetFieldDataType(AIndex: Integer): TFieldType;
function GetDisplayLabel(AIndex: Integer): string; //取得字段顯示名稱
procedure SaveFieldToStream(AStream: TStream; AField: TField); //將字段存入流中
function GetFieldValue(ARecordNo, FieldNo: Integer): string; //字段的內(nèi)容
public
Constructor Create(AOwner: TComponent);
Destructor Destroy; override;
procedure Open; //創(chuàng)建流以準(zhǔn)備存儲(chǔ)數(shù)據(jù)
procedure SaveToFile(ADataSet: TDataSet; AFileName: string); //存儲(chǔ)方法
procedure LoadFromFile(AFileName: string); //裝入數(shù)據(jù)
procedure FieldStream(ARecordNo, FieldNo: Integer; var AStream: TStream);
property FieldNames[Index: Integer]: string read GetFieldName; //字段名
property FieldDataTypes[Index: Integer]: TFieldType read GetFieldDataType;
property FieldDisplayLabels[Index: Integer]: string read GetDisplayLabel;
property Fields[RecNo, FieldIndex: Integer]: string read GetFieldValue;
//property FieldStreams[RecNo, FieldIndex: Integer]: TStream read GetFieldStream;
property RecordCount: Integer read FRecordCount write FRecordCount;
property FieldCount: Integer read FFieldCount write FFieldCount;
published
property RptTitle: string read FRptTitle write FRptTitle;
property PageHead: string read FPageHead write FPageHead;
property PageFoot: string read FPageFoot write FPageFoot;
end;

function ReadAChar(AStream: TStream): Char;
function ReadAStr(AStream: TStream): string;
function ReadBStr(AStream: TStream; Size: Integer): string;
function ReadAInteger(AStream: TStream): Integer;
procedure WriteAStr(AStream: TStream; AStr: string);
procedure WriteBStr(AStream: TStream; AStr: string);
procedure WriteAInteger(AStream: TStream; AInteger: Integer);

procedure Register;
implementation

procedure Register;
begin
RegisterComponents('Data Access', [TIbStorage]);
end;

function ReadAChar(AStream: TStream): Char;
Var
AChar: Char;
begin
AStream.Read(AChar, 1);
Result := AChar;
end;

function ReadAStr(AStream: TStream): string;
var
Str: String;
C : Char;
begin
Str := '';
C := ReadAChar(AStream);
While C <> #0 do
begin
Str := Str + C;
C := ReadAChar(AStream);
end;
Result := Str;
end;

function ReadBStr(AStream: TStream; Size: Integer): string;
var
Str: String;
C : Char;
I : Integer;
begin
Str := '';
For I := 1 to Size do
begin
C := ReadAChar(AStream);
Str := Str + C;
end;
Result := Str;
end;

function ReadAInteger(AStream: TStream): Integer;
var
Str: String;
C : Char;
begin
Result := MaxInt;
Str := '';
C := ReadAChar(AStream);
While C <> #0 do
begin
Str := Str + C;
C := ReadAChar(AStream);
end;
try
Result := StrToInt(Str);
except
Application.MessageBox(' 當(dāng)前字符串無法轉(zhuǎn)換為整數(shù)!', '錯(cuò)誤',
Mb_Ok + Mb_IconError);
end;
end;


procedure WriteAStr(AStream: TStream; AStr: string);
begin
AStream.Write(Pointer(AStr)^, Length(AStr) + 1);
end;

procedure WriteBStr(AStream: TStream; AStr: string);
begin
AStream.Write(Pointer(AStr)^, Length(AStr));
end;

procedure WriteAInteger(AStream: TStream; AInteger: Integer);
var
S : string;
begin
S := IntToStr(AInteger);
WriteAstr(AStream, S);
end;

Constructor TIbStorage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FOpenFlag := False; //確定流是否創(chuàng)建的標(biāo)志
end;

Destructor TIbStorage.Destroy;
begin
if FOpenFlag then
begin
FStream.Free;
FStreamIndex.Free;
FFieldNames.Free;
end;
inherited Destroy;
end;

procedure TIbStorage.Open;
begin
FOpenFlag := True;
FStream := TMemoryStream.Create;
FStreamIndex := TStringList.Create;
FFieldNames := TStringList.Create;
Reset;
end;

procedure TIbStorage.Reset; //復(fù)位
begin
if FOpenFlag then
begin
FFieldNames.Clear;
FStreamIndex.Clear;
FStream.Size := 0;
FRptTitle := '';
FPageHead := '';
FPageFoot := '';
FFieldCount := 0;
FRecordCount := 0;
end;
end;

//-------保存數(shù)據(jù)部分
procedure TIbStorage.SaveToFile(ADataSet: TDataSet; AFileName: string);
var
Fp: TFileStream;
I : Integer;
Ch: Char;
T1, T2: TDateTime;
Str: string;
begin
if Not FOpenFlag then
begin
showmessage(' 對(duì)象沒有打開');
Exit;
end;
try
if FileExists(AFileName) then DeleteFile(AFileName);
Fp := TFileStream.Create(AFileName, fmCreate);
Reset;
SaveHead(ADataSet, Fp); //保存頭部信息---附加說明
IndexFields(ADataSet); //將數(shù)據(jù)集的字段信息保存到FFieldName
LoadTableToStream(ADataSet); //保存數(shù)據(jù)集的數(shù)據(jù)信息
WriteAStr(Fp, FFieldNames.Text); //存儲(chǔ)字段名信息
Ch := '@';
Fp.Write(Ch, 1);
WriteAStr(Fp, FStreamIndex.Text); //存儲(chǔ)字段索引列表
Ch := '@';
Fp.Write(Ch, 1);
Fp.CopyFrom(FStream, 0);
finally
Fp.Free;
end;
end;

procedure TIbStorage.SaveHead(ADataSet: TDataSet; Fp: TStream);
Var
I : Integer;
Ch: Char;
begin
if Not ADataSet.Active then ADataSet.Active := True;
WriteAStr(Fp, Flag);
WriteAStr(Fp, FRptTitle);
WriteAStr(Fp, FPageHead);
WriteAStr(Fp, FPageFoot);
FFieldCount := ADataSet.Fields.Count;
FRecordCount := ADataSet.RecordCount;
WriteAStr(Fp, IntToStr(ADataSet.Fields.Count));
WriteAStr(Fp, IntToStr(ADataSet.RecordCount));
Ch := '@';
Fp.Write(Ch, 1);
end;

procedure TIbStorage.IndexFields(ADataSet: TDataSet);
var
I : Integer;
AField: TField;
begin
For I := 0 to ADataSet.Fields.Count - 1 do
begin
AField := ADataSet.Fields[I];
//不用FFieldNames.Values[AField.FieldName] := AField.DisplayLabel;是考慮效率
FFieldNames.Add(AField.FieldName + '=' + AField.DisplayLabel);
FFieldNames.Add(AField.FieldName + 'DataType=' + IntToStr(Ord(AField.DataType)));
end;
end;

procedure TIbStorage.LoadTableToStream(ADataSet: TDataSet);
var
No: Integer;
I, J, Size: Integer;
Tmp, Id, Str : string; //id=string(RecNO) + string(FieldNo)
Len: Integer;
Ch : Char;
BlobStream: TBlobStream;
begin
if Not FOpenFlag then
begin
showmessage(' 對(duì)象沒有打開');
Exit;
end;
try
ADataSet.DisableControls;
ADataSet.First;
No := 0;
FStreamIndex.Clear;
FStream.Size := 0;
While Not ADataSet.Eof do
begin
No := No + 1;
For J := 0 to ADataSet.Fields.Count - 1 do
begin
Id := Inttostr(NO) + '_' + IntToStr(J);
//建立流的位置的索引, 索引指向: Size#0Content
FStreamIndex.Add(Id + '=' + IntToStr(FStream.Position));
//存儲(chǔ)字段信息到流中
SaveFieldToStream(FStream, ADataSet.Fields[J]);
end;
ADataSet.Next;
end;
finally
ADataSet.EnableControls;
end;
end;

//如果一個(gè)字段的當(dāng)前內(nèi)容為空或者BlobSize<=0,則只寫入字段大小為0, 不寫入內(nèi)容
procedure TIbStorage.SaveFieldToStream(AStream: TStream; AField: TField);
var
Size: Integer;
Ch: Char;
XF: TStream;
Str: string;
begin
if AField.IsBlob then
begin
//如何把一個(gè)TBlobField字段的內(nèi)容存儲(chǔ)為流
Xf := TBlobStream.Create(TBlobField(AField), bmread);
try
if Xf.Size > 0 then
begin
Size := Xf.Size;
WriteAInteger(AStream, Size);
AStream.CopyFrom(Xf, Xf.Size);
end
else
WriteAInteger(AStream, 0);
finally
XF.Free;
end;
end
else
begin
Str := AField.AsString;
Size := Length(Str);
WriteAInteger(AStream, Size);
if Size <> 0 then
AStream.Write(Pointer(Str)^, Size);
//WriteAstr(AStream, Str);
end;
Ch := '@';
AStream.Write(Ch, 1);
end;

//------------Load Data
procedure TIbStorage.LoadFromFile(AFileName: string);
var
Fp: TFileStream;
Check: string;
begin
Reset;
try
if Not FileExists(AFileName) then
begin
showmessage(' 文件不存在:' + AFileName);
Exit;
end;
Fp := TFileStream.Create(AFileName, fmOpenRead);
Check := ReadAStr(Fp);
if Check <> Flag then
begin
Application.MessageBox(' 非法文件格式', '錯(cuò)誤', Mb_Ok + Mb_IconError);
Exit;
end;
GetHead(Fp);
GetFieldNames(Fp);
GetIndex(Fp);
FStream.CopyFrom(Fp, Fp.Size-Fp.Position);
finally
Fp.Free;
end;
end;

procedure TIbStorage.GetHead(Fp: TFileStream);
begin
FRptTitle := ReadAStr(Fp);
FPageHead := ReadAstr(Fp);
FPageFoot := ReadAstr(Fp);
FFieldCount := ReadAInteger(Fp);
FRecordCount := ReadAInteger(Fp);
if ReadAChar(Fp) <> '@' then showmessage('GetHead File Error');
end;

procedure TIbStorage.GetFieldNames(Fp: TFileStream);
var
Ch: Char;
Str: string;
begin
Str := '';
Str := ReadAStr(Fp);
FFieldNames.CommaText := Str;
Ch := ReadAChar(Fp);
if Ch <> '@' then Showmessage('When get fieldnames Error');
end;

procedure TIbStorage.GetIndex(Fp: TFileStream);
var
Ch: Char;
Str: string;
begin
Str := '';
Str := ReadAStr(Fp);
FStreamIndex.CommaText := Str;
Ch := ReadAChar(Fp);
if Ch <> '@' then Showmessage('When Get Field Position Index Error');
end;

//---------Read Field's Value Part
function TIbStorage.GetFieldValue(ARecordNo, FieldNo: Integer): string;
var
Id, T : string;
Pos: Integer;
Len, I : Integer;
Er: Boolean;
begin
Result := '';
Er := False;
if ARecordNo > FRecordCount then
Er := true; //ARecordNo := FRecordCount;
if ARecordNo < 1 then
Er := True; // ARecordNo := 1;
if FieldNo >= FFieldCount then
Er := True; // FieldNo := FFieldCount - 1;
if FieldNo < 0 then
Er := True; //FieldNo := 0;
if Er then
begin
Showmessage('記錄號(hào)或者字段標(biāo)號(hào)越界');
Exit;
end;
if FFieldCount = 0 then Exit;
Id := Inttostr(ARecordNO) + '_' + IntToStr(FieldNo);
Pos := StrToInt(FStreamIndex.Values[Id]);
FStream.Position := Pos;
//取得字段內(nèi)容的長(zhǎng)度
Len := ReadAInteger(FStream);
if Len > 0 then
Result := ReadBStr(FStream, Len);
if ReadAChar(FStream) <> '@' then
Showmessage('When Read Field, Find Save Format Error');
end;

procedure TIbStorage.FieldStream(ARecordNo, FieldNo: Integer; var AStream: TStream);
var
Id, T : string;
Pos: Integer;
Len, I : Integer;
Er: Boolean;
begin
Er := False;
if ARecordNo > FRecordCount then
Er := true; //ARecordNo := FRecordCount;
if ARecordNo < 1 then
Er := True; // ARecordNo := 1;
if FieldNo >= FFieldCount then
Er := True; // FieldNo := FFieldCount - 1;
if FieldNo < 0 then
Er := True; //FieldNo := 0;
if Er then
begin
TDsException.Create('GetFieldValue函數(shù)索引下標(biāo)越界');
Exit;
end;
if FFieldCount = 0 then Exit;
Id := Inttostr(ARecordNO) + IntToStr(FieldNo);
Pos := StrToInt(FStreamIndex.Values[Id]);
FStream.Position := Pos;
Len := ReadAInteger(FStream);
AStream.CopyFrom(FStream, Len);
end;

function TIbStorage.GetFieldName(AIndex: Integer): string; //取得字段名稱
begin
//存儲(chǔ)的字段和數(shù)據(jù)類型各占一半
if ((AIndex < 0) or (AIndex >= FFieldNames.Count div 2)) then
Application.MessageBox(' 取字段名索引越界', '程序 錯(cuò)誤',
Mb_Ok + Mb_IconError)
else
Result := FFieldNames.Names[AIndex*2];
end;

function TIbStorage.GetFieldDataType(AIndex: Integer): TFieldType; //取得字段名稱
begin
//存儲(chǔ)的字段和數(shù)據(jù)類型各占一半
if ((AIndex < 0) or (AIndex >= FFieldNames.Count div 2)) then
Application.MessageBox(' 取字段數(shù)據(jù)類型索引越界', '程序 錯(cuò)誤',
Mb_Ok + Mb_IconError)
else
Result := TFieldType(StrToInt(FFieldNames.Values[FFieldNames.Names[AIndex*2+1]]));
end;

function TIbStorage.GetDisplayLabel(AIndex: Integer): string; //取得字段顯示名稱
begin
if ((AIndex < 0) or (AIndex >= FFieldNames.Count)) then
Application.MessageBox(' 取字段名索引越界', '程序 錯(cuò)誤',
Mb_Ok + Mb_IconError)
else
Result := FFieldNames.Values[GetFieldName(AIndex)];
end;

end.
通過測(cè)試,該控件對(duì)Ttable,Tquery, TaodTable, TadoQuery, TibTable, TibQuery等常用的數(shù)據(jù)集控件等都能較好的支持,并且具有較好的效率(測(cè)試:1100條人事記錄,23個(gè)字段存儲(chǔ)為文件約用時(shí)2秒鐘)。

四、控件的基本使用方法
1.存儲(chǔ)數(shù)據(jù)集中的數(shù)據(jù)到文件
IbStorage1.Open; //創(chuàng)建存儲(chǔ)流
IbStorage1.SaveToFile(AdataSet, Afilename);
2.從文件中讀出數(shù)據(jù)信息
IbStorage1.Open;
IbStorage1.LoadFromFile(AfileName);
3.對(duì)數(shù)據(jù)報(bào)存儲(chǔ)控件中數(shù)據(jù)的訪問
Value := IbStorage1.Fields[ArecNo, AfieldNo]; //字符串類型
其它略。
五、結(jié)束語
通過編寫此數(shù)據(jù)報(bào)存儲(chǔ)控件,較好地解決了數(shù)據(jù)庫程序中數(shù)據(jù)的存儲(chǔ)和交換問題,為數(shù)據(jù)庫程序的開發(fā)提供了一種實(shí)用的控件。
該控件在Windows98,Delphi5開發(fā)環(huán)境下調(diào)試通過。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        成人av在线资源网| 中文字幕一区二区三| 欧美一级免费观看| 夜夜嗨av一区二区三区中文字幕| 国产成人日日夜夜| 国产日韩精品一区| 99久久99久久精品免费观看| 亚洲品质自拍视频| 欧美色区777第一页| 蜜臀av性久久久久av蜜臀妖精| 日韩一区二区三区视频| 国产精品亚洲一区二区三区在线| 中文字幕不卡在线观看| 欧洲一区在线电影| 免费av网站大全久久| 国产精品美日韩| 欧美精品视频www在线观看| 奇米综合一区二区三区精品视频| 精品av综合导航| 欧美精品v国产精品v日韩精品 | 亚洲成av人片一区二区梦乃| 欧美一区二区三区播放老司机| 国产ts人妖一区二区| 日本va欧美va精品| 亚洲曰韩产成在线| 久久免费视频色| 91麻豆精品国产91久久久久久| 91亚洲精品久久久蜜桃| 国产成人av一区| 狠狠色综合日日| 日韩av一区二区在线影视| 亚洲大片一区二区三区| 国产精品人妖ts系列视频| 91精品免费在线观看| 欧美三日本三级三级在线播放| 福利电影一区二区三区| 久久国产麻豆精品| 捆绑紧缚一区二区三区视频| 一区二区三区中文字幕电影| 一区二区三区中文字幕| 亚洲美女免费在线| 亚洲成人在线网站| 蜜臀av性久久久久av蜜臀妖精| 亚洲影院免费观看| 婷婷久久综合九色综合绿巨人| 亚洲成a人v欧美综合天堂| 亚洲已满18点击进入久久| 亚洲一级二级三级在线免费观看| 亚洲免费视频中文字幕| 亚洲图片欧美色图| 六月丁香综合在线视频| 9人人澡人人爽人人精品| 91女神在线视频| 日韩三级免费观看| 国产精品久久久久影院色老大| 国产精品色哟哟网站| 一区二区三区日韩欧美精品| 日韩精品一卡二卡三卡四卡无卡| 久久99精品国产.久久久久久| 国产成人鲁色资源国产91色综| 91在线porny国产在线看| 欧美精品色一区二区三区| 国产精品伦一区| 九九热在线视频观看这里只有精品| 国产老妇另类xxxxx| 在线视频欧美精品| 久久久精品国产免大香伊| 亚洲国产精品综合小说图片区| 国产原创一区二区三区| 欧美日韩三级在线| 国产精品短视频| 成人精品视频一区| 精品欧美一区二区三区精品久久 | 国产一区二区三区综合| 欧美挠脚心视频网站| 亚洲四区在线观看| www.99精品| 亚洲欧美怡红院| 北条麻妃一区二区三区| 国产精品毛片久久久久久久| 韩国欧美国产1区| 精品三级av在线| 麻豆精品一区二区综合av| 欧美一级电影网站| 日本美女一区二区三区视频| 欧美日韩国产一级片| 日韩高清一区二区| 91精品国产综合久久蜜臀| 天堂成人国产精品一区| 日韩一区二区麻豆国产| 美洲天堂一区二卡三卡四卡视频| 91精品国产综合久久久久久漫画 | 色哟哟一区二区三区| 一区二区三区欧美在线观看| 欧美日韩一区二区三区四区五区| 亚洲图片有声小说| 日韩一级大片在线观看| 国产成人午夜精品5599| 中文字幕精品在线不卡| 欧美肥大bbwbbw高潮| 国产麻豆精品久久一二三| 亚洲图片你懂的| 日韩欧美一级特黄在线播放| 国产福利视频一区二区三区| 一级做a爱片久久| 精品国产一区二区三区四区四| 成人性生交大片免费看中文网站| 亚洲成年人网站在线观看| 国产亚洲欧美激情| 91麻豆精品国产91久久久久久久久| 福利一区福利二区| 精品一区二区精品| 亚洲综合丁香婷婷六月香| 国产日韩欧美高清| 欧美大片一区二区| 欧美日韩一区二区三区不卡| 成人性生交大片免费看中文| 麻豆成人综合网| 亚洲成av人片| 一区二区三区在线看| 亚洲国产电影在线观看| 2020国产精品| 欧美一区二区国产| 91麻豆精品国产91久久久久 | 91精品在线免费观看| 777亚洲妇女| 69堂成人精品免费视频| 欧美丰满美乳xxx高潮www| 欧美日韩国产首页| 欧美日本精品一区二区三区| 欧美亚洲动漫另类| 欧美日韩午夜影院| 制服丝袜亚洲精品中文字幕| 日韩视频在线一区二区| 日韩一区二区免费在线电影| 日韩欧美国产三级| 欧美国产亚洲另类动漫| 美女尤物国产一区| 黄网站免费久久| 99re成人在线| 日韩欧美专区在线| 1区2区3区国产精品| 午夜成人免费视频| 捆绑调教一区二区三区| av电影在线不卡| 日韩美女天天操| 亚洲综合色在线| 久久69国产一区二区蜜臀| 国产夫妻精品视频| 欧美精品在线一区二区三区| 2022国产精品视频| 亚洲成人一区在线| 99精品欧美一区二区蜜桃免费| 欧美色图第一页| 国产精品久久久久久久久久久免费看 | 国产女人18水真多18精品一级做 | 成人午夜又粗又硬又大| 欧美一级一级性生活免费录像| 中文字幕欧美区| 久久99蜜桃精品| 欧美一级一区二区| 亚洲一区二区在线播放相泽 | 国产午夜亚洲精品羞羞网站| 亚洲综合激情另类小说区| 成人精品高清在线| 国产欧美一区二区精品性色| 日本午夜一本久久久综合| 91亚洲永久精品| 综合欧美一区二区三区| 成人午夜av电影| 中文字幕成人在线观看| 丁香婷婷综合色啪| 欧美激情一区不卡| 国产成人av自拍| 中日韩av电影| 99re这里只有精品视频首页| 亚洲特级片在线| 欧美猛男超大videosgay| 日韩精彩视频在线观看| 欧美一区二区久久| 国产精品一二三在| 一区二区三区影院| 91精品久久久久久久久99蜜臂| 六月丁香婷婷色狠狠久久| 欧美大尺度电影在线| 国产91综合一区在线观看| 亚洲女与黑人做爰| 日韩亚洲欧美在线| 不卡一区中文字幕| 午夜精品久久久久久久蜜桃app| 日韩亚洲欧美一区| av激情亚洲男人天堂| 六月丁香综合在线视频| 国产精品麻豆视频| 日韩一区二区在线播放| 成人亚洲精品久久久久软件| 视频一区二区欧美| 亚洲自拍偷拍九九九| 久久久亚洲精品一区二区三区| 色老头久久综合|