亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi的組件讀寫機(jī)制(三)

2019-11-18 18:35:27
字體:
供稿:網(wǎng)友
Ø        TReader
       先來看Delphi的工程文件,會(huì)發(fā)現(xiàn)類似這樣的幾行代碼:
begin
  application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
       這是Delphi程序的入口。簡(jiǎn)單的說一下這幾行代碼的意義:Application.Initialize對(duì)開始運(yùn)行的應(yīng)用程序進(jìn)行一些必要的初始化工作,Application.CreateForm(TForm1, Form1)創(chuàng)建必要的窗體,Application.Run程序開始運(yùn)行,進(jìn)入消息循環(huán)。
       現(xiàn)在我們最關(guān)心的是創(chuàng)建窗體這一句。窗體以及窗體上的組件是怎么創(chuàng)建出來的呢?在前面已經(jīng)提到過:窗體中的所有組件包括窗體自身的屬性都包含在DFM文件中,而Delphi在編譯程序的時(shí)候,利用編譯指令{$R *.dfm}已經(jīng)把DFM文件信息編譯到可執(zhí)行文件中。因此,可以斷定創(chuàng)建窗體的時(shí)候需要去讀取DFM信息,用什么去讀呢,當(dāng)然是TReader了!
       通過對(duì)程序的一步步的跟蹤,可以發(fā)現(xiàn)程序在創(chuàng)建窗體的過程中調(diào)用了TReader的ReadRootComponent方法。該方法的作用是讀出根組件及其所擁有的全部組件。來看一下該方法的實(shí)現(xiàn):
 
function TReader.ReadRootComponent(Root: TComponent): TComponent;
……
begin
  ReadSignature;
  Result := nil;
  GlobalNameSpace.BeginWrite;  // Loading from stream adds to name space
  try
    try
      ReadPRefix(Flags, I);
      if Root = nil then
      begin
        Result := TComponentClass(FindClass(ReadStr)).Create(nil);
        Result.Name := ReadStr;
      end else
      begin
        Result := Root;
        ReadStr; { Ignore class name }
        if csDesigning in Result.ComponentState then
          ReadStr else
        begin
          Include(Result.FComponentState, csLoading);
          Include(Result.FComponentState, csReading);
          Result.Name := FindUniqueName(ReadStr);
        end;
      end;
      FRoot := Result;
      FFinder := TClassFinder.Create(TPersistentClass(Result.ClassType), True);
      try
        FLookupRoot := Result;
        G := GlobalLoaded;
        if G <> nil then
          FLoaded := G else
          FLoaded := TList.Create;
        try
          if FLoaded.IndexOf(FRoot) < 0 then
            FLoaded.Add(FRoot);
          FOwner := FRoot;
          Include(FRoot.FComponentState, csLoading);
          Include(FRoot.FComponentState, csReading);
          FRoot.ReadState(Self);
          Exclude(FRoot.FComponentState, csReading);
          if G = nil then
            for I := 0 to FLoaded.Count - 1 do TComponent(FLoaded[I]).Loaded;
        finally
          if G = nil then FLoaded.Free;
          FLoaded := nil;
        end;
      finally
        FFinder.Free;
      end;
     ……
  finally
    GlobalNameSpace.EndWrite;
  end;
end;
       ReadRootComponent首先調(diào)用ReadSignature讀取Filer對(duì)象標(biāo)簽(’TPF0’)。載入對(duì)象之前檢測(cè)標(biāo)簽,能防止疏忽大意,導(dǎo)致讀取無效或過時(shí)的數(shù)據(jù)。
       再看一下ReadPrefix(Flags, I)這一句,ReadPrefix方法的功能與ReadSignature的很相象,只不過它是讀取流中組件前面的標(biāo)志(PreFix)。當(dāng)一個(gè)Write對(duì)象將組件寫入流中時(shí),它在組件前面預(yù)寫了兩個(gè)值,第一個(gè)值是指明組件是否是從祖先窗體中繼承的窗體和它在窗體中的位置是否重要的標(biāo)志;第二個(gè)值指明它在祖先窗體創(chuàng)建次序。
       然后,如果Root參數(shù)為nil,則用ReadStr讀出的類名創(chuàng)建新組件,并從流中讀出組件的Name屬性;否則,忽略類名,并判斷Name屬性的唯一性。
          FRoot.ReadState(Self);
       這是很關(guān)鍵的一句,ReadState方法讀取根組件的屬性和其擁有的組件。這個(gè)ReadState方法雖然是TComponent的方法,但進(jìn)一步的跟蹤就可以發(fā)現(xiàn),它實(shí)際上最終還是定位到了TReader的ReadDataInner方法,該方法的實(shí)現(xiàn)如下:
procedure TReader.ReadDataInner(Instance: TComponent);
var
  OldParent, OldOwner: TComponent;
begin
  while not EndOfList do ReadProperty(Instance);
  ReadListEnd;
  OldParent := Parent;
  OldOwner := Owner;
  Parent := Instance.GetChildParent;
  try
    Owner := Instance.GetChildOwner;
    if not Assigned(Owner) then Owner := Root;
    while not EndOfList do ReadComponent(nil);
    ReadListEnd;
  finally
    Parent := OldParent;
    Owner := OldOwner;
  end;
end;
       其中有這樣的這一行代碼:
  while not EndOfList do ReadProperty(Instance);
       這是用來讀取根組件的屬性的,對(duì)于屬性,前面提到過,既有組件本身的published屬性,也有非published屬性,例如TTimer的Left和Top。對(duì)于這兩種不同的屬性,應(yīng)該有兩種不同的讀方法,為了驗(yàn)證這個(gè)想法,我們來看一下ReadProperty方法的實(shí)現(xiàn)。
procedure TReader.ReadProperty(AInstance: TPersistent);
……
begin
       ……
      PropInfo := GetPropInfo(Instance.ClassInfo, FPropName);
      if PropInfo <> nil then ReadPropValue(Instance, PropInfo) else
      begin
        { Cannot reliably recover from an error in a defined property }
        FCanHandleExcepts := False;
        Instance.DefineProperties(Self);
        FCanHandleExcepts := True;
        if FPropName <> '' then
          PropertyError(FPropName);
      end;
       ……
end;
       為了節(jié)省篇幅,省略了一些代碼,這里說明一下:FPropName是從文件讀取到的屬性名。
      PropInfo := GetPropInfo(Instance.ClassInfo, FPropName);
       這一句代碼是獲得published屬性FPropName的信息。從接下來的代碼中可以看到,如果屬性信息不為空,就通過ReadPropValue方法讀取屬性值,而ReadPropValue方法是通過RTTI函數(shù)來讀取屬性值的,這里不再詳細(xì)介紹。如果屬性信息為空,說明屬性FPropName為非published的,它就必須通過另外一種機(jī)制去讀取。這就是前面提到的DefineProperties方法,如下:
       Instance.DefineProperties(Self);
       該方法實(shí)際上調(diào)用的是TReader的DefineProperty方法:
procedure TReader.DefineProperty(const Name: string;
  ReadData: TReaderProc; WriteData: TWriterProc; HasData: Boolean);
begin
  if SameText(Name, FPropName) and Assigned(ReadData) then
  begin
    ReadData(Self);
    FPropName := '';
  end;
end;
       它先去比較讀取的屬性名是否和預(yù)設(shè)的屬性名相同,如果相同并且讀方法ReadData不為空時(shí)就調(diào)用ReadData方法讀取屬性值。
       好了,根組件已經(jīng)讀上來了,接下來應(yīng)該是讀該根組件所擁有的組件了。再來看方法:
procedure TReader.ReadDataInner(Instance: TComponent);
       該方法后面有一句這樣的代碼:
    while not EndOfList do ReadComponent(nil);
       這正是用來讀取子組件的。子組件的讀取機(jī)制是和上面所介紹的根組件的讀取一樣的,這是一個(gè)樹的深度遍歷。
       到這里為止,組件的讀機(jī)制已經(jīng)介紹完了。
 
       再來看組件的寫機(jī)制。當(dāng)我們?cè)诖绑w上添加一個(gè)組件時(shí),它的相關(guān)的屬性就會(huì)保存在DFM文件中,這個(gè)過程就是由TWriter來完成的。
 
Ø        TWriter
       TWriter 對(duì)象是可實(shí)例化的往流中寫數(shù)據(jù)的Filer對(duì)象。TWriter對(duì)象直接從TFiler繼承而來,除了覆蓋從TFiler繼承的方法外,還增加了大量的關(guān)于寫各種數(shù)據(jù)類型(如Integer、String和Component等)的方法。
       TWriter對(duì)象提供了許多往流中寫各種類型數(shù)據(jù)的方法, TWrite對(duì)象往流中寫數(shù)據(jù)是依據(jù)不同的數(shù)據(jù)采取不同的格式的。 因此要掌握TWriter對(duì)象的實(shí)現(xiàn)和應(yīng)用方法,必須了解Writer對(duì)象存儲(chǔ)數(shù)據(jù)的格式。
  首先要說明的是,每個(gè)Filer對(duì)象的流中都包含有Filer對(duì)象標(biāo)簽。該標(biāo)簽占四個(gè)字節(jié)其值為“TPF0”。Filer對(duì)象為WriteSignature和ReadSignature方法存取該標(biāo)簽。該標(biāo)簽主要用于Reader對(duì)象讀數(shù)據(jù)(組件等)時(shí),指導(dǎo)讀操作。
  其次,Writer對(duì)象在存儲(chǔ)數(shù)據(jù)前都要留一個(gè)字節(jié)的標(biāo)志位,以指出后面存放的是什么類型的數(shù)據(jù)。該字節(jié)為TValueType類型的值。TValueType是枚舉類型,占一個(gè)字節(jié)空間,其定義如下:
 
  TValueType = (VaNull, VaList, VaInt8, VaInt16, VaInt32, VaEntended, VaString, VaIdent,
VaFalse, VaTrue, VaBinary, VaSet, VaLString, VaNil, VaCollection);
 
       因此,對(duì)Writer對(duì)象的每一個(gè)寫數(shù)據(jù)方法,在實(shí)現(xiàn)上,都要先寫標(biāo)志位再寫相應(yīng)的數(shù)據(jù);而Reader對(duì)象的每一個(gè)讀數(shù)據(jù)方法都要先讀標(biāo)志位進(jìn)行判斷,如果符合就讀數(shù)據(jù),否則產(chǎn)生一個(gè)讀數(shù)據(jù)無效的異常事件。VaList標(biāo)志有著特殊的用途,它是用來標(biāo)識(shí)后面將有一連串類型相同的項(xiàng)目,而標(biāo)識(shí)連續(xù)項(xiàng)目結(jié)束的標(biāo)志是VaNull。因此,在Writer對(duì)象寫連續(xù)若干個(gè)相同項(xiàng)目時(shí),先用WriteListBegin寫入VaList標(biāo)志,寫完數(shù)據(jù)項(xiàng)目后,再寫出VaNull標(biāo)志;而讀這些數(shù)據(jù)時(shí),以ReadListBegin開始,ReadListEnd結(jié)束,中間用EndofList函數(shù)判斷是否有VaNull標(biāo)志。
       來看一下TWriter的一個(gè)非常重要的方法WriteData:
procedure TWriter.WriteData(Instance: TComponent);
……
begin
  ……
  WritePrefix(Flags, FChildPos);
  if UseQualifiedNames then
    WriteStr(GetTypeData(PTypeInfo(Instance.ClassType.ClassInfo)).UnitName + '.' + Instance.ClassName)
  else
    WriteStr(Instance.ClassName);
  WriteStr(Instance.Name);
  PropertiesPosition := Position;
  if (FAncestorList <> nil) and (FAncestorPos < FAncestorList.Count) then
  begin
    if Ancestor <> nil then Inc(FAncestorPos);
    Inc(FChildPos);
  end;
  WriteProperties(Instance);
  WriteListEnd;
  ……
end;
       從WriteData方法中我們可以看出生成DFM文件信息的概貌。先寫入組件前面的標(biāo)志(PreFix),然后寫入類名、實(shí)例名。緊接著有這樣的一條語句:
  WriteProperties(Instance);
       這是用來寫組件的屬性的。前面提到過,在DFM文件中,既有published屬性,又有非published屬性,這兩種屬性的寫入方法應(yīng)該是不一樣的。來看WriteProperties的實(shí)現(xiàn):
procedure TWriter.WriteProperties(Instance: TPersistent);
……
begin
  Count := GetTypeData(Instance.ClassInfo)^.PropCount;
  if Count > 0 then
  begin
    GetMem(PropList, Count * SizeOf(Pointer));
    try
      GetPropInfos(Instance.ClassInfo, PropList);
      for I := 0 to Count - 1 do
      begin
        PropInfo := PropList^[I];
        if PropInfo = nil then
          Break;
        if IsStoredProp(Instance, PropInfo) then
          WriteProperty(Instance, PropInfo);
      end;
    finally
      FreeMem(PropList, Count * SizeOf(Pointer));
    end;
  end;
  Instance.DefineProperties(Self);
end;
       請(qǐng)看下面的代碼:
        if IsStoredProp(Instance, PropInfo) then
          WriteProperty(Instance, PropInfo);
       函數(shù)IsStoredProp通過存儲(chǔ)限定符來判斷該屬性是否需要保存,如需保存,就調(diào)用WriteProperty來保存屬性,而WriteProperty是通過一系列的RTTI函數(shù)來實(shí)現(xiàn)的。
       Published屬性保存完后就要保存非published屬性了,這是通過這句代碼完成的:
  Instance.DefineProperties(Self);
       DefineProperties的實(shí)現(xiàn)前面已經(jīng)講過了,TTimer的Left、Top屬性就是通過它來保存的。
       好,到目前為止還存在這樣的一個(gè)疑問:根組件所擁有的子組件是怎么保存的?再來看WriteData方法(該方法在前面提到過):
procedure TWriter.WriteData(Instance: TComponent);
……
begin
  ……
    if not IgnoreChildren then
      try
        if (FAncestor <> nil) and (FAncestor is TComponent) then
        begin
          if (FAncestor is TComponent) and (csInline in TComponent(FAncestor).ComponentState) then
            FRootAncestor := TComponent(FAncestor);
          FAncestorList := TList.Create;
          TComponent(FAncestor).GetChildren(AddAncestor, FRootAncestor);
        end;
        if csInline in Instance.ComponentState then
          FRoot := Instance;
        Instance.GetChildren(WriteComponent, FRoot);
      finally
        FAncestorList.Free;
      end;
end;
       IgnoreChildren屬性使一個(gè)Writer對(duì)象存儲(chǔ)組件時(shí)可以不存儲(chǔ)該組件擁有的子組件。如果IgnoreChildren屬性為True,則Writer對(duì)象存儲(chǔ)組件時(shí)不存它擁有的子組件。否則就要存儲(chǔ)子組件。
        Instance.GetChildren(WriteComponent, FRoot);
       這是寫子組件的最關(guān)鍵的一句,它把WriteComponent方法作為回調(diào)函數(shù),按照深度優(yōu)先遍歷樹的原則,如果根組件FRoot存在子組件,則用WriteComponent來保存它的子組件。這樣我們?cè)贒FM文件中看到的是樹狀的組件結(jié)構(gòu)。

上一篇:Delphi的組件讀寫機(jī)制(一)

下一篇:Delphi中如何編寫圖像解析組件

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

亚洲一区二区美女| 精品国产乱码久久久久久老虎| 国产精品爽爽ⅴa在线观看| 国产精品不卡在线观看| 中文字幕av中文字幕| 黄网址在线永久免费观看| 一个人看的日本免费视频| 免费观看亚洲视频| 成人三级av| 探花国产精品一区二区| 欧美精品欧美精品系列| 久艹在线免费观看| 久久国产精品免费视频| 免费国产一区二区| 殴美一级黄色片| 久久99国产精品99久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 一区二区三区在线观看视频| 青青青在线免费观看| a级在线观看视频| 国产一区二区视频在线观看| julia中文字幕一区二区99在线| 色偷偷噜噜噜亚洲男人| 亚洲一二三四在线| 亚洲视频自拍偷拍| 香蕉视频成人在线| 高清一区在线观看| 日韩和一区二区| 久久久久久久久久久综合| 99蜜桃在线观看免费视频网站| 国产区视频在线观看| 色的视频在线观看免费播放| 久久精品国产亚洲aⅴ| 美国黄色一级毛片| 黄网在线观看网址入口| 38少妇精品导航| 国产精品99免费看| 日本高清中文字幕| 国内成人免费视频| 成人一区福利| 老熟妇一区二区| 涩涩视频在线观看下载| 国产小视频免费在线网址| 国产精品一区二区人妻喷水| 欧美日本精品一区二区三区| 高清中文字幕mv的电影| 亚洲成人av免费在线观看| 成人在线看片网站| 欧亚一区二区三区| 自拍偷拍精品视频| 97久久天天综合色天天综合色hd| 欧美在线免费看视频| 天天超碰亚洲| 美女网站免费观看视频| 亚洲国产精品久久网午夜小说| 午夜在线观看视频| 成人性视频免费网站| 成年人三级视频| 国产精品亚洲人在线观看| 永久av在线| 你懂的视频在线观看资源| 欧美一级免费在线| 黄动漫在线免费观看| 国产绳艺sm调教室论坛| 亚洲一二三区在线| 亚洲欧美一区二区三区在线播放| 在线播放av中文字幕| 国内精品久久久久久不卡影院| 色综合天天色| 久草免费新视频| 91禁在线观看| 亚洲同性同志一二三专区| 懂色av蜜臀av粉嫩av分享吧| 日韩av资源在线播放| 欧洲日本亚洲国产区| 日韩一区av在线| 国产欧美欧洲在线观看| 欧美激情1区2区| 免费h在线看| 欧美日韩一区二区三区| 91成人小视频| 中文字幕久久综合| 三级视频在线看| 91精品国产777在线观看| 91精品久久久久久久久| 国产精品区在线观看| 人妻巨大乳一二三区| 性欧美xxxx大乳国产app| 哥也色在线视频| 亚洲伦理网站| 波多野结衣一区二区三区在线| 国产精品丝袜一区| 欧美激情网站在线观看| 亚洲精品一区中文| 伊人久久大香线蕉综合网蜜芽| 亚洲小说欧美激情另类| 国产精品91在线观看| 国产91露脸合集magnet| 亚洲国产成人综合| 亚洲欧洲日韩综合二区| 午夜影院免费视频| 91精品久久香蕉国产线看观看| 欧美一区二区在线观看| 91在线高清视频| 午夜免费电影一区在线观看| 天天干天天操天天爱| 青柠在线影院观看日本| 天天插天天射天天干| 色综合色狠狠天天综合色| 肉色欧美久久久久久久免费看| 国产精品福利在线观看| 日韩精品一区二区三区免费观看| 黑人乱码一区二区三区av| 欧美中文字幕一区二区| 国产成人免费视频网站高清观看视频| 无套内谢大学处破女www小说| 色先锋久久av资源部| 97人妻人人澡人人爽人人精品| 国产亚洲激情| 97影院在线午夜| 在线手机中文字幕| 亚洲女同一区二区| 欧美精品成人一区二区在线观看| 国语对白一区二区| www.99re7.com| 国产精品乱码一区二三区小蝌蚪| 美州a亚洲一视本频v色道| 色悠悠久久综合网| 成人图片小说| 日韩一区二区三区电影在线观看| 久久久久久亚洲精品| 激情久久久久久| www.99r| 日韩av在线一区二区| 亚洲欧美激情视频在线观看一区二区三区| 日韩不卡一二三| 91精品国自产在线观看| 欧洲精品在线播放| 亚洲淫成人影院| 国产av无码专区亚洲av| 污污的网站18| 狠狠鲁男人天堂| www.com国产| 久久久精品国产免费观看同学| 蜜桃视频污在线观看| 亚洲品质自拍视频| 欧美色图一区二区| 国产精品一区无码| 天天色 色综合| 国产一区二区影视| 中文字幕在线播放一区| 精品久久久久一区| 日本一区二区不卡视频| 亚洲精品美女在线观看| 中文乱码免费一区二区| 99久久精品免费精品国产| 在线日韩电影| 丁香五月缴情综合网| 国产免费av高清在线| 免费一级淫片aaa片毛片a级| 国产精品主播视频| 粉嫩久久久久久久极品| 97国产一区二区| 中文字幕在线观看91| 久久精品一区二区国产| 6080日韩午夜伦伦午夜伦| 精品福利在线| 欧美日韩亚洲一区二区三区| 99精品免费观看| 色就是色亚洲色图| 一区二区在线观看视频在线观看| 欧美亚洲国产成人精品| 91精品91久久久中77777| 日本新janpanese乱熟| 欧美精品久久久久久久自慰| 日本一区二区三区在线播放| 久久久久久久91| 中国人与牲禽动交精品| 免费偷拍视频网站| 国产精品免费播放| 玉足女爽爽91| 少妇高潮爽到全身痉挛抽搐| 国产素人在线观看| 亚洲欧美国产高清| 欧亚乱熟女一区二区在线| 天天干天天舔| 亚洲欧美一区二区三区不卡| 日韩午夜在线观看视频| 国产精品一区无码| 久久精品中文| 中文字幕亚洲欧美在线不卡| 成人黄色在线免费观看| 国产亚洲精品一区二555| 日韩**一区毛片| 中文字幕天堂网| 国产免费av一区二区三区| 国产成人av影院| 久草热视频在线观看| 亚洲色图视频免费播放| 手机在线中文字幕| 亚洲天堂久久av| 色天使在线观看| 国产精品偷伦免费视频观看的| 丝袜av一区| 天码人妻一区二区三区在线看| 亚洲成av人片在线观看无码| 国产在线一级片| 99精品中文字幕在线不卡| 久久久精品国产一区二区三区| 少妇一区二区视频| 成人全视频在线观看在线播放高清| 日本少妇全体裸体洗澡| 欧美不卡福利| 国产欧美日韩综合精品一区二区| 久久久99爱| 日本精品久久久久久久久久| 91深夜福利| 99国产精品免费视频| 日本韩国精品一区二区| 96精品视频在线| 性刺激综合网| 日韩中文字幕不卡视频| 欧美亚洲国产一区| 国产欧美一区二区三区米奇| 中文字幕黄色片| 国产综合在线播放| 欧美三级成人观看| 中文字幕在线观看视频www| 国产熟女一区二区三区五月婷| sese一区| 萌白酱国产一区二区| 成人av资源网| 国产精品日韩欧美大师| 国产成人精品视频ⅴa片软件竹菊| 影音先锋人妻啪啪av资源网站| 欧美人与物videos| 久久综合五月天婷婷伊人| 国产精品超碰97尤物18| 国产综合在线观看视频| 国产精品萝li| 亚洲 欧美 日韩系列| 中文字幕一区二区三区乱码在线| 国产精品成人在线观看| 99精品女人在线观看免费视频| 亚洲激情亚洲| 亚洲精品菠萝久久久久久久| 成人香蕉社区| 99国产超薄肉色丝袜交足的后果| 樱花草在线观看www| 久久久久人妻精品一区三寸| 99久久久无码国产精品不卡| 欧美久久99| 99国产精品视频免费观看一公开| 亚洲综合色激情五月| 污香蕉视频在线观看| 樱花草www在线观看| 国产精品自在欧美一区| 偷拍国模大尺度视频在线播放| 欧美四级剧情无删版影片| 亚洲香蕉在线视频| 欧美女孩性生活视频| 亚洲欧洲日本一区二区三区| 亚洲有码转帖| 综合在线亚洲| 天天色天天爱天天射综合| 在线观看国产一区二区| 久热国产在线视频| 色婷婷亚洲一区二区三区| 亚在线播放中文视频| 99视频有精品高清视频| 日韩精品中文字幕一区二区| 亚洲欧美电影院| 色999韩欧美国产综合俺来也| av超碰免费在线| 97蜜桃久久| 欧日韩一区二区三区| 精品免费久久久久久久| 国产成人免费在线观看视频| 国产精品99久久久久久人| huan性巨大欧美| 精品高清一区二区三区| 国产精品高清亚洲| 欧美精品情趣视频| 久久久免费看片| 国产精品一区二区三区av麻| 婷婷综合国产| 国产污片在线观看| 天天射—综合中文网| 婷婷开心激情网| 国产人妻人伦精品1国产丝袜| 黄色资源网久久资源365| 欧美理论在线播放| 91国内视频| 中文字幕免费高| 久久高清国产| 国产一级做a爰片久久| 影音先锋亚洲精品| 亚洲熟女乱综合一区二区| 国产不卡视频| 国产91对白在线播放| 国产日产精品一区二区三区四区的观看方式| 日本h在线观看| 天海翼在线观看视频| 妞干网在线视频观看| 国产精品成人av性教育| 在线观看中文字幕| 丁香婷婷久久| 国产精品美乳一区二区免费| 国产精品日韩在线一区| 日韩人妻无码精品综合区| 国产日韩欧美精品一区| 欧美精品乱码| 成人美女在线视频| 久久66热re国产| 亚洲精品爱爱久久| 日韩av图片| 成人免费无遮挡无码黄漫视频| 久久伊人国产| 久久久久久日本一区99| 国产精品成人在线观看| 成人午夜免费福利| 成人羞羞网站入口免费| 精品无码国产一区二区三区51安| 丰满少妇一区二区| 亚洲三级av在线| 久久青青草原| 精品国产av一区二区三区| 精品久久不卡|