分享
 
 
 

我对DELPHI写的几个基类型

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

//用惯JAVA或C#的人可能对DELPHI非常生气,连基本的类型都没有,我平时工作中,经常会曾试着把一些函数集合在一起,也经常做一些属于自己的基础类型的函数,此处把它们弄出来,有不当之处,请大家点评.

unit BaseClass;

interface

uses

SysUtils, Classes, StrUtils, IdGlobal, Math;

type

TCharSet = set of char;

var

TNormalCharSet: TCharSet = [#13, #10, #32, '.', ',', ';'];

type

TString = class

private

FText: string;

public

function CharAt(APosition: Integer): Char;

//指定位置的字母

function toLowerCase: string; overload;

class function toLowerCase(AString: string): string; overload;

//小写

function toUpperCase: string; overload;

class function toUpperCase(AString: string): string; overload;

//大写

class function ValueOf(AValue: string): Boolean; overload;

class function ValueOf(AValue: Boolean): string; overload;

class function StringIn(AValue: string; AValues: array of string): Boolean;

class function Left(AValue: string; ALength: Integer): string;

class function Right(AValue: string; ALength: Integer): string;

class function DeletePrefix(AValue: string; FixedString: TCharSet = [#32]): string; //删除前缀

class function DeleteSuffix(AValue: string; FixedString: TCharSet = [#32]): string; //删除后缀

//

class function CompareString(AValue1: string; AValue2: string): Boolean;

class function HashCode(AValue: string): Integer;

class function LastChar(AValue: string): Char;

class function StringReplace(const S, OldPattern, NewPattern: string;

Flags: TReplaceFlags): string;

class function StringOfChar(Ch: Char; Count: Integer): string;

class function SetString(var s: string; buffer: PChar; len: Integer): string;

class function GetPy(AStr: string): string;

//得到对应的拼音.

class function IsAllChinese(AStr: string): Boolean;

class function IsAllEnglish(AStr: string): Boolean;

class function GetFirstWord(AValue: string; var AWord: string; ASeparator: TCharSet): Integer; overload;

class function GetFirstWord(AValue: string; var AWord: string; ASeparator: string): Integer; overload;

//返回值为从开始到该单据的长度。

class function GetAllWord(AValue: string; ASeparator: string): TStringList; overload;

//返回所有的关键字。使用完后,请将结果集Free;

//注:在以后的使用中,请不要使用该函数。请使用它的重载版

//GetAllWord(AValue: string; ASeparator: string; AStringList: TStringList);

class procedure GetAllWord(AValue: string; ASeparator: string; AStringList: TStrings); overload;

//把所有的结果集装入AStringList;

class procedure GetAllWordWithAll(AValue: string; ASeparator: string; AStringList: TStrings);

class function StringToCharSet(AValue: string): TCharSet;

class function CharSetToString(AValue: TCharSet): string;

class function UpdateSentence(AOldString: string; //被操作字符串

AUpdateSource: string; //查找的单词。

AUpdateString: string; //替换的单据。

ASentenceSeparator: string; //句子分隔符。

AWordSeparator: string //单据分隔符;

): string; //返回结果。

//如 ' dbarcode ASC, dname DESC', 'dbarcode', '', ',', ' '的返回值为

//' dname DESC';

class function DeleteRepeat(AOldString: string; //要处理字符

ADeleteString: Char; //要删除的字符

ARepeat: Char): string; //重复字符

class function IfThen(AExpression: Boolean; ATrue: string; AFalse: string): string;

//根据表达式的值,返回相应的字符串。

class function AbsoluteToRelate(AAbsolute: string; ACurrent: string): string;

//给定两个文件,将绝对路径转换成相对路径。

class function RelateToAbsolute(ARelate: string; ACurrent: string): string;

class function SimilarPosition(AOne, ATwo: string): Integer;

class function GetCharNum(AString: string; AChar: Char): Integer;

class function IndexOf(AString, ASubString: string): Integer;

class function ZeroToInt(AString: string): Integer;

class function ZeroToFloat(AString: string): Double;

class function ZeroToStr(AString: string): string;

class function SameText(AString, AString1: string): Boolean;

class function Reverse(AString: string): string;

class function IsValidIP(const S: String): Boolean;

class function FillString(AChar: Char; ALength: Integer): string;

class function StuffString(const AText: string; AStart, ALength: Cardinal;

const ASubText: string): string;

class function GetNextString(var SourceString: string; ASplitChar: string): string;

end;

//整型类。

TInteger = class

class function IntToStr(AInteger: Integer): string; overload;

class function IntToStr(AInteger: Int64): string; overload;

class function IsValidInt(AString: string): Boolean;

class function IsValidInt64(AString: string): Boolean;

class function MaxInt: Integer;

class function MaxLongInt: Integer;

class function HashCode(AInteger: Integer): Integer;

class function IntToBin(AInteger: Cardinal): string;

class function IntToHex(AInteger: Integer): string;

class function HexToInt(AString: string): Integer;

class function MakeSerialNo(AInteger: Integer; ADigit: Integer): string;

end;

TFloat = class

class function IsValidFloat(AString: string): Boolean;

class function MaxDouble: Double;

class function MinDouble: Double;

class function MaxExtended: Extended;

class function MinExtended: Extended;

class function SameValue(const A, B: Single; Epsilon: Single = 0): Boolean; overload;

class function SameValue(const A, B: Double; Epsilon: Double = 0): Boolean; overload;

class function SameValue(const A, B: Extended; Epsilon: Extended = 0): Boolean; overload;

class function FloatToMoney(const Value: Double; Round: Boolean = True): string;

end;

TBoolean = class

class function BoolToStr(ABoolean: Boolean): string;

class function StrToBool(AString: string): Boolean; //如果不为'true'则为false;

end;

implementation

{ TString }

function GetPYIndexChar(AChar: string): Char;

begin

case WORD(AChar[1]) shl 8 + WORD(AChar[2]) of

$B0A1..$B0C4: Result := 'A';

$B0C5..$B2C0: Result := 'B';

$B2C1..$B4ED: Result := 'C';

$B4EE..$B6E9: Result := 'D';

$B6EA..$B7A1: Result := 'E';

$B7A2..$B8C0: Result := 'F';

$B8C1..$B9FD: Result := 'G';

$B9FE..$BBF6: Result := 'H';

$BBF7..$BFA5: Result := 'J';

$BFA6..$C0AB: Result := 'K';

$C0AC..$C2E7: Result := 'L';

$C2E8..$C4C2: Result := 'M';

$C4C3..$C5B5: Result := 'N';

$C5B6..$C5BD: Result := 'O';

$C5BE..$C6D9: Result := 'P';

$C6DA..$C8BA: Result := 'Q';

$C8BB..$C8F5: Result := 'R';

$C8F6..$CBF9: Result := 'S';

$CBFA..$CDD9: Result := 'T';

$CDDA..$CEF3: Result := 'W';

$CEF4..$D188: Result := 'X';

$D1B9..$D4D0: Result := 'Y';

$D4D1..$D7F9: Result := 'Z';

else

Result := Char(0);

end;

end;

class function TString.GetPy(AStr: string): string;

var

I: Integer;

begin

Result := '';

for I := 1 to Length(AStr) do

begin

if ByteType(AStr, i) = mbTrailByte then

Result := Result + GetPYIndexChar(AStr[i - 1] + AStr[i])

else

if ByteType(AStr, i) = mbSingleByte then

Result := Result + AStr[i];

end;

end;

function TString.CharAt(APosition: Integer): Char;

begin

Result := FText[APosition];

end;

class function TString.CharSetToString(AValue: TCharSet): string;

begin

end;

class function TString.CompareString(AValue1, AValue2: string): Boolean;

begin

Result := UpperCase(AValue1) = UpperCase(AValue2);

end;

class function TString.DeletePrefix(AValue: string;

FixedString: TCharSet): string;

begin

while System.Length(AValue) > 0 do

begin

if AValue[1] in FixedString then

Delete(AValue, 1, 1)

else

Break;

end;

Result := AValue;

end;

class function TString.GetFirstWord(AValue: string; var AWord: string; ASeparator: TCharSet

): Integer;

var

tmpStr: string;

tmpPos: Integer;

begin

tmpStr := DeleteSuffix(AValue, ASeparator);

tmpStr := DeletePrefix(AValue, ASeparator);

Result := Length(AValue) - Length(tmpStr);

{ if Length(tmpStr) = 0 then Exit;

if (tmpStr[1] = '''') and (tmpStr[2] = '''')then

begin

for tmpPos := 3 to Length(tmpStr) do

begin

if tmpStr[tmpPos] in [''''] then

Break;

end;

end;

if tmpPos > 3 then tmpPos :=tmpPos + 2;

}

for tmpPos := 1 to Length(tmpStr) do

begin

if tmpStr[tmpPos] in ASeparator then

Break;

end;

tmpPos := tmpPos -1;

// {TODO : -oghs 修复最后一个参数解析不正确}

if (tmpPos = 0) and (AValue <> '') then

tmpPos := Length(AValue);

AWord := Copy(AValue, Result + 1, tmpPos);

Result := Result + tmpPos;

end;

class function TString.HashCode(AValue: string): Integer;

var

i: Integer;

tmpValue: Integer;

begin

tmpValue := 0;

for I := 1 to System.Length(AValue) do

begin

tmpValue := 3 * tmpValue + Ord(AValue[I]);

end;

Result := tmpValue;

end;

class function TString.IsAllChinese(AStr: string): Boolean;

var

I: Integer;

begin

Result := True;

for I := 1 to Length(AStr) do

begin

if ByteType(AStr, I) = mbSingleByte then

begin

Result := False;

Break;

end;

end;

end;

class function TString.IsAllEnglish(AStr: string): Boolean;

var

I: Integer;

begin

Result := True;

for I := 1 to Length(AStr) do

begin

if ByteType(AStr, I) <> mbSingleByte then

begin

Result := False;

Break;

end;

end;

end;

class function TString.LastChar(AValue: string): Char;

begin

Result := AValue[System.Length(AValue)];

end;

class function TString.Left(AValue: string; ALength: Integer): string;

begin

Result := Copy(AValue, 1, ALength);

end;

class function TString.Right(AValue: string; ALength: Integer): string;

begin

Result := StrUtils.RightStr(AValue, ALength);

end;

class function TString.SetString(var s: string; buffer: PChar;

len: Integer): string;

begin

System.SetString(s, buffer, len);

Result := s;

end;

class function TString.StringIn(AValue: string;

AValues: array of string): Boolean;

var

I: Integer;

begin

Result := False;

for I := Low(AValues) to High(AValues) do

begin

if UpperCase(AValue) = UpperCase(AValues[I]) then

begin

Result := True;

Break;

end;

end;

end;

class function TString.StringOfChar(Ch: Char; Count: Integer): string;

begin

Result := System.StringOfChar(Ch, Count);

end;

class function TString.StringReplace(const S, OldPattern,

NewPattern: string; Flags: TReplaceFlags): string;

begin

Result := Sysutils.StringReplace(S, OldPattern, NewPattern, Flags);

end;

class function TString.StringToCharSet(AValue: string): TCharSet;

var

I: Integer;

begin

Result := [];

for I := 1 to Length(AValue) do

begin

Result := Result + [AValue[I]];

end;

end;

function TString.toLowerCase: string;

begin

Result := LowerCase(FText);

end;

function TString.toUpperCase: string;

begin

Result := Uppercase(FText);

end;

class function TString.ValueOf(AValue: Boolean): string;

begin

if AValue then

Result := '是'

else

Result := '否';

end;

class function TString.ValueOf(AValue: string): Boolean;

begin

Result := StringIn(AValue, ['是', 'yes', 'ok']);

end;

class function TString.GetFirstWord(AValue: string; var AWord: string;

ASeparator: string): Integer;

begin

Result := GetFirstWord(AValue, AWord, StringToCharSet(ASeparator));

end;

class function TString.GetAllWord(AValue, ASeparator: string): TStringList;

var

tmpList: TStringList;

tmpWord: string;

begin

tmpList := TStringList.Create;

while Length(AValue) > 0 do

begin

tmpWord := '';

Delete(AValue, 1, GetFirstWord(AValue, tmpWord, ASeparator));

if tmpWord <> '' then

tmpList.Add(tmpWord)

else

Break;

end;

Result := tmpList;

end;

class function TString.UpdateSentence(AOldString, AUpdateSource,

AUpdateString, ASentenceSeparator, AWordSeparator: string): string;

var

tmpSentence: string;

tmpWord: string;

tmpWord1: string;

i: Integer;

tmpResult: string;

begin

//得到第一个句子

tmpSentence := AOldString;

tmpResult := '';

while Length(tmpSentence) > 0 do

begin

i := GetFirstWord(tmpSentence, tmpWord, ASentenceSeparator);

tmpResult := tmpResult + Left(tmpSentence, i - Length(tmpWord));

Delete(tmpSentence, 1, I);

if tmpWord <> '' then

begin

i := GetFirstWord(tmpWord, tmpWord1, AWordSeparator);

tmpResult := tmpResult + Left(tmpWord, i - Length(tmpWord1));

if CompareString(tmpWord1, AUpdateSource) then

begin

tmpResult := tmpResult + AUpdateString;

end

else

begin

tmpResult := tmpResult + tmpWord;

end;

end;

end;

tmpResult := DeletePrefix(tmpResult, [' ', ',']);

tmpResult := DeleteSuffix(tmpResult, [' ', ',']);

tmpResult := DeleteRepeat(tmpResult, ',', ' ');

tmpResult := DeleteRepeat(tmpResult, ' ', ' ');

Result := tmpResult;

end;

class function TString.DeleteRepeat(AOldString: string; ADeleteString,

ARepeat: Char): string;

var

I: Integer;

tmpfind1: Boolean;

begin

tmpfind1 := False;

for I := Length(AOldString) downto 1 do

begin

if tmpfind1 then

begin

if AOldString[I] = ADeleteString then

Delete(AOldString, I, 1)

else

begin

if AOldString[I] = ARepeat then

Continue;

tmpfind1 := AOldString[I] = ADeleteString;

end;

end

else

begin

if ADeleteString <> ARepeat then

if AOldString[I] = ARepeat then

Continue;

tmpfind1 := AOldString[I] = ADeleteString

end;

end;

Result := AOldString;

end;

class function TString.DeleteSuffix(AValue: string;

FixedString: TCharSet): string;

begin

while System.Length(AValue) > 0 do

begin

if AValue[System.Length(AValue)] in FixedString then

Delete(AValue, System.Length(AValue), 1)

else

Break;

end;

Result := AValue;

end;

class procedure TString.GetAllWord(AValue, ASeparator: string;

AStringList: TStrings);

var

tmpWord: string;

begin

if AStringList = nil then

AStringList := TStringList.Create;

while Length(AValue) > 0 do

begin

tmpWord := '';

Delete(AValue, 1, GetFirstWord(AValue, tmpWord, ASeparator));

if tmpWord <> '' then

AStringList.Add(tmpWord)

else

Break;

end;

end;

class function TString.IfThen(AExpression: Boolean; ATrue,

AFalse: string): string;

begin

if AExpression then

Result := ATrue

else

Result := AFalse;

end;

class function TString.AbsoluteToRelate(AAbsolute,

ACurrent: string): string;

var

tmpSimilarString: string;

AOldFile: string;

i: Integer;

tmpPos: Integer;

begin

//转换后形成 ..\..\a.ini;

//如果不在同一个驱动器上,则直接返回绝对路径.

if ExtractFileDrive(AAbsolute) <> ExtractFileDrive(ACurrent) then

Result := AAbsolute

else

begin

tmpSimilarString := '';

AOldFile := AAbsolute;

AAbsolute := ExtractFilePath(AAbsolute);

tmpPos := SimilarPosition(AAbsolute, ACurrent);

Delete(AOldFile, 1, tmpPos - 1);

Delete(ACurrent, 1, tmpPos - 1);

for i := 0 to GetCharNum(ACurrent, '\') -1 do

begin

tmpSimilarString := tmpSimilarString + '..\';

end;

Result := tmpSimilarString + AOldFile;

end;

end;

class function TString.RelateToAbsolute(ARelate, ACurrent: string): string;

var

tmpSimilarString: string;

tmpRootCount: Integer;

i: Integer;

begin

if Length(ARelate) > 2 then

begin

if ARelate[2] = ':' then

begin

Result := ARelate;

Exit;

end;

end;

tmpSimilarString := '';

tmpRootCount := 0;

while True do

begin

if LeftStr(ARelate, 3) = '..\' then

begin

Inc(tmpRootCount);

Delete(ARelate, 1, 3);

end

else

break;

end;

tmpSimilarString := ReverseString(ExtractFilePath(ACurrent));

for i := 0 to tmpRootCount do

begin

Delete(tmpSimilarString, 1, Pos('\', tmpSimilarString));

end;

Result := ReverseString(tmpSimilarString) + ARelate;

end;

class function TString.SimilarPosition(AOne, ATwo: string): Integer;

var

i: Integer;

Max: Integer;

begin

if Length(AOne) < Length(ATwo) then

Max := Length(AOne)

else

Max := Length(ATwo);

for i := 1 to Max do

begin

if AOne[i] <> ATwo[i] then

Break;

end;

Result := i;

end;

class function TString.GetCharNum(AString: string; AChar: Char): Integer;

var

i: Integer;

begin

Result := 0;

for i := 1 to Length(AString) do

begin

if AString[i] = AChar then

Inc(Result);

end;

end;

class procedure TString.GetAllWordWithAll(AValue, ASeparator: string;

AStringList: TStrings);

var

tmpI: Integer;

tmpPos: Integer;

begin

if AStringList = nil then

AStringList := TStringList.Create;

tmpPos := 0;

while Length(AValue) > 0 do

begin

for tmpI := 1 to Length(AValue) do

begin

tmpPos := Pos(AValue[tmpPos], ASeparator);

if tmpPos > 0 then

begin

AStringList.Add(Copy(AValue, 1, tmpPos - 1));

AStringList.Add(Copy(AValue, tmpPos, 1));

Delete(AValue, 1, tmpPos);

Break;

end

end;

end; // while

end;

class function TString.toLowerCase(AString: string): string;

begin

Result := LowerCase(AString);

end;

class function TString.toUpperCase(AString: string): string;

begin

Result := Uppercase(AString);

end;

class function TString.IndexOf(AString, ASubString: string): Integer;

begin

Result := Pos(ASubstring, AString);

end;

class function TString.ZeroToInt(AString: string): Integer;

begin

if Trim(AString) = '' then

AString := '0';

Result := StrToInt(AString);

end;

class function TString.ZeroToFloat(AString: string): Double;

begin

if Trim(AString) = '' then

AString := '0.0';

Result := StrToFloat(AString);

end;

class function TString.SameText(AString, AString1: string): Boolean;

begin

Result := SysUtils.SameText(AString, AString1);

end;

class function TString.Reverse(AString: string): string;

begin

Result := ReverseString(AString);

end;

class function TString.IsValidIP(const S: String): Boolean;

var

j, i: Integer;

LTmp: String;

begin

Result := True;

LTmp := Trim(S);

for i := 1 to 4 do begin

j := StrToIntDef(Fetch(LTmp, '.'), -1);

Result := Result and (j > -1) and (j < 256);

if NOT Result then begin

Break;

end;

end;

end;

class function TString.ZeroToStr(AString: string): string;

begin

if Trim(AString) = '' then

Result := '0'

else

Result := AString;

end;

class function TString.FillString(AChar: Char; ALength: Integer): string;

var

i: Integer;

begin

Result := '';

for I := 1 to ALength do // Iterate

begin

Result := Result + AChar;

end; // for

end;

class function TString.StuffString(const AText: string; AStart,

ALength: Cardinal; const ASubText: string): string;

begin

Result := StrUtils.StuffString(AText, AStart, ALength, ASubText);

end;

class function TString.GetNextString(var SourceString: string;

ASplitChar: string): string;

var

tmpPos: Integer;

begin

tmpPos := Pos(ASplitChar, SourceString);

if tmpPos = 0 then

begin

Result := SourceString;

SourceString := ''

end

else

begin

Result := TString.Left(SourceString, tmpPos -1);

Delete(SourceString, 1, tmpPos);

end;

end;

{ TInteger }

class function TInteger.IntToStr(AInteger: Integer): string;

begin

Result := Sysutils.IntToStr(AInteger);

end;

class function TInteger.HashCode(AInteger: Integer): Integer;

begin

Result := AInteger;

end;

class function TInteger.IntToStr(AInteger: Int64): string;

begin

Result := Sysutils.IntToStr(AInteger);

end;

class function TInteger.IsValidInt(AString: string): Boolean;

begin

Result := True;

try

StrToInt(AString);

except

Result := False;

end;

end;

class function TInteger.IsValidInt64(AString: string): Boolean;

begin

Result := True;

try

StrToInt(AString);

except

Result := False;

end;

end;

class function TInteger.MaxInt: Integer;

begin

Result := System.MaxInt;

end;

class function TInteger.MaxLongInt: Integer;

begin

Result := System.MaxLongint;

end;

class function TInteger.IntToBin(AInteger: Cardinal): string;

var

i: Integer;

begin

SetLength(Result, 32);

for i := 1 to 32 do

begin

if ((AInteger shl (i-1)) shr 31) = 0 then

Result[i] := '0'

else

Result[i] := '1';

end;

end;

class function TInteger.IntToHex(AInteger: Integer): string;

begin

Result := SysUtils.IntToHex(AInteger, 0);

end;

class function TInteger.HexToInt(AString: string): Integer;

begin

if TString.Left(AString, 1) = '$' then

Result := StrToInt(AString)

else

Result := StrToInt('$' + AString);

end;

class function TInteger.MakeSerialNo(AInteger, ADigit: Integer): string;

var

tmpStr: string;

i: Integer;

begin

tmpStr := '';

for I := 0 to ADigit - 1 do // Iterate

begin

tmpStr := tmpStr + '0';

end; // for

Result := FormatFloat(tmpStr, AInteger);

end;

{ TFloat }

class function TFloat.FloatToMoney(const Value: Double; Round: Boolean): string;

begin

//金额默认采用四舍五入

end;

class function TFloat.IsValidFloat(AString: string): Boolean;

begin

Result := True;

try

StrToFloat(AString);

except

Result := False;

end;

end;

class function TFloat.MaxDouble: Double;

begin

Result := 1.7e+308;

end;

class function TFloat.MaxExtended: Extended;

begin

Result := 1.1e+4932;

end;

class function TFloat.MinDouble: Double;

begin

Result := 5.0e-324;

end;

class function TFloat.MinExtended: Extended;

begin

Result := 3.4e-4932;

end;

class function TFloat.SameValue(const A, B: Single;

Epsilon: Single): Boolean;

begin

Result := Math.SameValue(A, B, Epsilon);

end;

class function TFloat.SameValue(const A, B: Double;

Epsilon: Double): Boolean;

begin

Result := Math.SameValue(A, B, Epsilon);

end;

class function TFloat.SameValue(const A, B: Extended;

Epsilon: Extended): Boolean;

begin

Result := Math.SameValue(A, B, Epsilon);

end;

{ TBoolean }

class function TBoolean.BoolToStr(ABoolean: Boolean): string;

begin

if ABoolean then

Result := 'True'

else

Result := 'False';

end;

class function TBoolean.StrToBool(AString: string): Boolean;

begin

if UpperCase(AString) = 'TRUE' then

Result := True

else

Result := False;

end;

end.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有