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

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

?? tntwidestrings.pas

?? Delphi知道現在也沒有提供Unicode支持
?? PAS
?? 第 1 頁 / 共 2 頁
字號:

{*****************************************************************************}
{                                                                             }
{    Tnt Delphi Unicode Controls                                              }
{      http://www.tntware.com/delphicontrols/unicode/                         }
{        Version: 2.3.0                                                       }
{                                                                             }
{    Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com)       }
{                                                                             }
{*****************************************************************************}

unit TntWideStrings;

{$INCLUDE TntCompilers.inc}

interface

{$IFDEF COMPILER_10_UP}
  {$MESSAGE FATAL 'Do not refer to TntWideStrings.pas.  It works correctly in Delphi 2006.'}
{$ENDIF}

uses
  Classes;

{******************************************************************************}
{                                                                              }
{  Delphi 2005 introduced TWideStrings in WideStrings.pas.                     }
{    Unfortunately, it was not ready for prime time.                           }
{      Setting CommaText is not consistent, and it relies on CharNextW         }
{         Which is only available on Windows NT+.                              }
{                                                                              }
{******************************************************************************}

type
  TWideStrings = class;

{ IWideStringsAdapter interface }
{ Maintains link between TWideStrings and IWideStrings implementations }

  IWideStringsAdapter = interface
    ['{25FE0E3B-66CB-48AA-B23B-BCFA67E8F5DA}']
    procedure ReferenceStrings(S: TWideStrings);
    procedure ReleaseStrings;
  end;

  TWideStringsEnumerator = class
  private
    FIndex: Integer;
    FStrings: TWideStrings;
  public
    constructor Create(AStrings: TWideStrings);
    function GetCurrent: WideString;
    function MoveNext: Boolean;
    property Current: WideString read GetCurrent;
  end;

{ TWideStrings class }

  TWideStrings = class(TPersistent)
  private
    FDefined: TStringsDefined;
    FDelimiter: WideChar;
    FQuoteChar: WideChar;
    {$IFDEF COMPILER_7_UP}
    FNameValueSeparator: WideChar;
    {$ENDIF}
    FUpdateCount: Integer;
    FAdapter: IWideStringsAdapter;
    function GetCommaText: WideString;
    function GetDelimitedText: WideString;
    function GetName(Index: Integer): WideString;
    function GetValue(const Name: WideString): WideString;
    procedure ReadData(Reader: TReader);
    procedure SetCommaText(const Value: WideString);
    procedure SetDelimitedText(const Value: WideString);
    procedure SetStringsAdapter(const Value: IWideStringsAdapter);
    procedure SetValue(const Name, Value: WideString);
    procedure WriteData(Writer: TWriter);
    function GetDelimiter: WideChar;
    procedure SetDelimiter(const Value: WideChar);
    function GetQuoteChar: WideChar;
    procedure SetQuoteChar(const Value: WideChar);
    function GetNameValueSeparator: WideChar;
    {$IFDEF COMPILER_7_UP}
    procedure SetNameValueSeparator(const Value: WideChar);
    {$ENDIF}
    function GetValueFromIndex(Index: Integer): WideString;
    procedure SetValueFromIndex(Index: Integer; const Value: WideString);
  protected
    procedure AssignTo(Dest: TPersistent); override;
    procedure DefineProperties(Filer: TFiler); override;
    procedure Error(const Msg: WideString; Data: Integer); overload;
    procedure Error(Msg: PResStringRec; Data: Integer); overload;
    function ExtractName(const S: WideString): WideString;
    function Get(Index: Integer): WideString; virtual; abstract;
    function GetCapacity: Integer; virtual;
    function GetCount: Integer; virtual; abstract;
    function GetObject(Index: Integer): TObject; virtual;
    function GetTextStr: WideString; virtual;
    procedure Put(Index: Integer; const S: WideString); virtual;
    procedure PutObject(Index: Integer; AObject: TObject); virtual;
    procedure SetCapacity(NewCapacity: Integer); virtual;
    procedure SetTextStr(const Value: WideString); virtual;
    procedure SetUpdateState(Updating: Boolean); virtual;
    property UpdateCount: Integer read FUpdateCount;
    function CompareStrings(const S1, S2: WideString): Integer; virtual;
  public
    destructor Destroy; override;
    function Add(const S: WideString): Integer; virtual;
    function AddObject(const S: WideString; AObject: TObject): Integer; virtual;
    procedure Append(const S: WideString);
    procedure AddStrings(Strings: TStrings{TNT-ALLOW TStrings}); overload; virtual;
    procedure AddStrings(Strings: TWideStrings); overload; virtual;
    procedure Assign(Source: TPersistent); override;
    procedure BeginUpdate;
    procedure Clear; virtual; abstract;
    procedure Delete(Index: Integer); virtual; abstract;
    procedure EndUpdate;
    function Equals(Strings: TWideStrings): Boolean;
    procedure Exchange(Index1, Index2: Integer); virtual;
    function GetEnumerator: TWideStringsEnumerator;
    function GetTextW: PWideChar; virtual;
    function IndexOf(const S: WideString): Integer; virtual;
    function IndexOfName(const Name: WideString): Integer; virtual;
    function IndexOfObject(AObject: TObject): Integer; virtual;
    procedure Insert(Index: Integer; const S: WideString); virtual; abstract;
    procedure InsertObject(Index: Integer; const S: WideString;
      AObject: TObject); virtual;
    procedure LoadFromFile(const FileName: WideString); virtual;
    procedure LoadFromStream(Stream: TStream); virtual;
    procedure Move(CurIndex, NewIndex: Integer); virtual;
    procedure SaveToFile(const FileName: WideString); virtual;
    procedure SaveToStream(Stream: TStream); virtual;
    procedure SetTextW(const Text: PWideChar); virtual;
    property Capacity: Integer read GetCapacity write SetCapacity;
    property CommaText: WideString read GetCommaText write SetCommaText;
    property Count: Integer read GetCount;
    property Delimiter: WideChar read GetDelimiter write SetDelimiter;
    property DelimitedText: WideString read GetDelimitedText write SetDelimitedText;
    property Names[Index: Integer]: WideString read GetName;
    property Objects[Index: Integer]: TObject read GetObject write PutObject;
    property QuoteChar: WideChar read GetQuoteChar write SetQuoteChar;
    property Values[const Name: WideString]: WideString read GetValue write SetValue;
    property ValueFromIndex[Index: Integer]: WideString read GetValueFromIndex write SetValueFromIndex;
    property NameValueSeparator: WideChar read GetNameValueSeparator {$IFDEF COMPILER_7_UP} write SetNameValueSeparator {$ENDIF};
    property Strings[Index: Integer]: WideString read Get write Put; default;
    property Text: WideString read GetTextStr write SetTextStr;
    property StringsAdapter: IWideStringsAdapter read FAdapter write SetStringsAdapter;
  end;

  PWideStringItem = ^TWideStringItem;
  TWideStringItem = record
    FString: WideString;
    FObject: TObject;
  end;

  PWideStringItemList = ^TWideStringItemList;
  TWideStringItemList = array[0..MaxListSize] of TWideStringItem;

implementation

uses
  Windows, SysUtils, TntSystem, {$IFDEF COMPILER_9_UP} WideStrUtils, {$ELSE} TntWideStrUtils, {$ENDIF}
  TntSysUtils, TntClasses;

{ TWideStringsEnumerator }

constructor TWideStringsEnumerator.Create(AStrings: TWideStrings);
begin
  inherited Create;
  FIndex := -1;
  FStrings := AStrings;
end;

function TWideStringsEnumerator.GetCurrent: WideString;
begin
  Result := FStrings[FIndex];
end;

function TWideStringsEnumerator.MoveNext: Boolean;
begin
  Result := FIndex < FStrings.Count - 1;
  if Result then
    Inc(FIndex);
end;

{ TWideStrings }

destructor TWideStrings.Destroy;
begin
  StringsAdapter := nil;
  inherited;
end;

function TWideStrings.Add(const S: WideString): Integer;
begin
  Result := GetCount;
  Insert(Result, S);
end;

function TWideStrings.AddObject(const S: WideString; AObject: TObject): Integer;
begin
  Result := Add(S);
  PutObject(Result, AObject);
end;

procedure TWideStrings.Append(const S: WideString);
begin
  Add(S);
end;

procedure TWideStrings.AddStrings(Strings: TStrings{TNT-ALLOW TStrings});
var
  I: Integer;
begin
  BeginUpdate;
  try
    for I := 0 to Strings.Count - 1 do
      AddObject(Strings[I], Strings.Objects[I]);
  finally
    EndUpdate;
  end;
end;

procedure TWideStrings.AddStrings(Strings: TWideStrings);
var
  I: Integer;
begin
  BeginUpdate;
  try
    for I := 0 to Strings.Count - 1 do
      AddObject(Strings[I], Strings.Objects[I]);
  finally
    EndUpdate;
  end;
end;

procedure TWideStrings.Assign(Source: TPersistent);
begin
  if Source is TWideStrings then
  begin
    BeginUpdate;
    try
      Clear;
      FDefined := TWideStrings(Source).FDefined;
      {$IFDEF COMPILER_7_UP}
      FNameValueSeparator := TWideStrings(Source).FNameValueSeparator;
      {$ENDIF}
      FQuoteChar := TWideStrings(Source).FQuoteChar;
      FDelimiter := TWideStrings(Source).FDelimiter;
      AddStrings(TWideStrings(Source));
    finally
      EndUpdate;
    end;
  end
  else if Source is TStrings{TNT-ALLOW TStrings} then
  begin
    BeginUpdate;
    try
      Clear;
      {$IFDEF COMPILER_7_UP}
      FNameValueSeparator := WideChar(TStrings{TNT-ALLOW TStrings}(Source).NameValueSeparator);
      {$ENDIF}
      FQuoteChar := WideChar(TStrings{TNT-ALLOW TStrings}(Source).QuoteChar);
      FDelimiter := WideChar(TStrings{TNT-ALLOW TStrings}(Source).Delimiter);
      AddStrings(TStrings{TNT-ALLOW TStrings}(Source));
    finally
      EndUpdate;
    end;
  end
  else
    inherited Assign(Source);
end;

procedure TWideStrings.AssignTo(Dest: TPersistent);
var
  I: Integer;
begin
  if Dest is TWideStrings then Dest.Assign(Self)
  else if Dest is TStrings{TNT-ALLOW TStrings} then
  begin
    TStrings{TNT-ALLOW TStrings}(Dest).BeginUpdate;
    try
      TStrings{TNT-ALLOW TStrings}(Dest).Clear;
      {$IFDEF COMPILER_7_UP}
      TStrings{TNT-ALLOW TStrings}(Dest).NameValueSeparator := AnsiChar(NameValueSeparator);
      {$ENDIF}
      TStrings{TNT-ALLOW TStrings}(Dest).QuoteChar := AnsiChar(QuoteChar);
      TStrings{TNT-ALLOW TStrings}(Dest).Delimiter := AnsiChar(Delimiter);
      for I := 0 to Count - 1 do
        TStrings{TNT-ALLOW TStrings}(Dest).AddObject(Strings[I], Objects[I]);
    finally
      TStrings{TNT-ALLOW TStrings}(Dest).EndUpdate;
    end;
  end
  else
    inherited AssignTo(Dest);
end;

procedure TWideStrings.BeginUpdate;
begin
  if FUpdateCount = 0 then SetUpdateState(True);
  Inc(FUpdateCount);
end;

procedure TWideStrings.DefineProperties(Filer: TFiler);

  function DoWrite: Boolean;
  begin
    if Filer.Ancestor <> nil then
    begin
      Result := True;
      if Filer.Ancestor is TWideStrings then
        Result := not Equals(TWideStrings(Filer.Ancestor))
    end
    else Result := Count > 0;
  end;

begin
  Filer.DefineProperty('Strings', ReadData, WriteData, DoWrite);
end;

procedure TWideStrings.EndUpdate;
begin
  Dec(FUpdateCount);
  if FUpdateCount = 0 then SetUpdateState(False);
end;

function TWideStrings.Equals(Strings: TWideStrings): Boolean;
var
  I, Count: Integer;
begin
  Result := False;
  Count := GetCount;
  if Count <> Strings.GetCount then Exit;
  for I := 0 to Count - 1 do if Get(I) <> Strings.Get(I) then Exit;
  Result := True;
end;

procedure TWideStrings.Error(const Msg: WideString; Data: Integer);

  function ReturnAddr: Pointer;
  asm
          MOV     EAX,[EBP+4]
  end;

begin
  raise EStringListError.CreateFmt(Msg, [Data]) at ReturnAddr;
end;

procedure TWideStrings.Error(Msg: PResStringRec; Data: Integer);
begin
  Error(WideLoadResString(Msg), Data);
end;

procedure TWideStrings.Exchange(Index1, Index2: Integer);
var
  TempObject: TObject;
  TempString: WideString;
begin
  BeginUpdate;
  try
    TempString := Strings[Index1];
    TempObject := Objects[Index1];
    Strings[Index1] := Strings[Index2];
    Objects[Index1] := Objects[Index2];
    Strings[Index2] := TempString;
    Objects[Index2] := TempObject;
  finally
    EndUpdate;
  end;
end;

function TWideStrings.ExtractName(const S: WideString): WideString;
var
  P: Integer;
begin
  Result := S;
  P := Pos(NameValueSeparator, Result);
  if P <> 0 then
    SetLength(Result, P-1) else
    SetLength(Result, 0);
end;

function TWideStrings.GetCapacity: Integer;
begin  // descendents may optionally override/replace this default implementation
  Result := Count;
end;

function TWideStrings.GetCommaText: WideString;
var
  LOldDefined: TStringsDefined;
  LOldDelimiter: WideChar;
  LOldQuoteChar: WideChar;
begin
  LOldDefined := FDefined;
  LOldDelimiter := FDelimiter;
  LOldQuoteChar := FQuoteChar;
  Delimiter := ',';
  QuoteChar := '"';
  try
    Result := GetDelimitedText;
  finally
    FDelimiter := LOldDelimiter;
    FQuoteChar := LOldQuoteChar;
    FDefined := LOldDefined;
  end;
end;

function TWideStrings.GetDelimitedText: WideString;
var
  S: WideString;
  P: PWideChar;
  I, Count: Integer;
begin
  Count := GetCount;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 亚洲chinese男男1069| 日本在线不卡视频| 欧美日韩国产综合一区二区 | 久久国产剧场电影| 日韩美女视频在线| 久88久久88久久久| 久久久久久久久久美女| 国产在线精品一区在线观看麻豆| 日韩你懂的在线播放| 国模冰冰炮一区二区| 久久久不卡网国产精品二区 | 高清在线成人网| 久久精品欧美日韩精品| 高清不卡在线观看| 亚洲精品美腿丝袜| 欧美日韩精品一区二区在线播放| 三级影片在线观看欧美日韩一区二区| 777久久久精品| 国产精品一二三区| 日韩美女啊v在线免费观看| 麻豆91精品91久久久的内涵| 欧美在线免费观看亚洲| 一区二区三区产品免费精品久久75| 在线亚洲一区二区| 日本不卡视频在线| 久久久久久久网| 色欧美日韩亚洲| 日韩中文字幕av电影| 精品久久久三级丝袜| av成人免费在线| 亚洲电影一级黄| 久久亚洲私人国产精品va媚药| 成人免费的视频| 日韩三区在线观看| 日本网站在线观看一区二区三区| 精品免费日韩av| 高清av一区二区| 亚洲一区国产视频| 精品国产a毛片| 一本大道av伊人久久综合| 日韩电影一区二区三区四区| 国产精品婷婷午夜在线观看| 69精品人人人人| 成人丝袜18视频在线观看| 亚洲一区二区欧美| 欧美国产激情一区二区三区蜜月| 欧美亚洲综合一区| 国产aⅴ综合色| 亚洲地区一二三色| 国产精品久久二区二区| 日韩欧美成人一区二区| 在线免费亚洲电影| 成人午夜视频免费看| 久久国产精品无码网站| 亚洲成人免费影院| 中文字幕日本乱码精品影院| 久久嫩草精品久久久久| 日韩午夜中文字幕| 欧美日韩精品欧美日韩精品| 91网站最新网址| 国产激情偷乱视频一区二区三区| 日本人妖一区二区| 午夜电影网一区| 一区二区三区国产豹纹内裤在线| 中文字幕乱码一区二区免费| 日韩欧美第一区| 国产91精品欧美| 亚洲色图19p| 国产精品网站一区| 欧美不卡一区二区三区四区| 91国偷自产一区二区三区观看 | 日日夜夜免费精品| 国产精品美女久久久久久久 | 国产成人av网站| 日韩主播视频在线| 亚洲黄色性网站| 国产女主播在线一区二区| 欧美三级韩国三级日本三斤| 成人动漫av在线| 狠狠狠色丁香婷婷综合激情| 日韩精品福利网| 亚洲成va人在线观看| 日韩欧美在线综合网| 丰满白嫩尤物一区二区| 亚洲一区二区视频| 亚洲视频在线一区观看| 中文字幕第一页久久| 日韩一级免费一区| 欧美日韩一区视频| 91国产视频在线观看| 不卡的av网站| 国产suv一区二区三区88区| 久久99久久久欧美国产| 免费一级片91| 美女视频黄a大片欧美| 亚洲制服丝袜在线| 亚洲最大成人综合| 一区二区三区在线免费视频| 亚洲欧美日韩国产中文在线| 亚洲视频1区2区| ●精品国产综合乱码久久久久| 国产精品美女一区二区| 26uuu精品一区二区| 久久综合999| 久久精品亚洲精品国产欧美kt∨| 久久综合色之久久综合| 26uuu国产日韩综合| 久久久久久久久久久久久久久99 | 日韩精品一区在线观看| 欧美大白屁股肥臀xxxxxx| 日韩免费成人网| 精品少妇一区二区三区在线播放 | 国产精品性做久久久久久| 久久99国产精品久久99| 国产在线不卡一区| 99re视频精品| 欧美视频在线一区| 日韩欧美电影一二三| 国产亚洲一区二区三区在线观看 | 国产欧美精品一区二区色综合| 精品国产免费人成电影在线观看四季 | 欧美一区二区视频网站| 日韩欧美国产一区二区三区| 久久精品欧美日韩精品| 久久精品亚洲乱码伦伦中文| 亚洲一级二级在线| 国精产品一区一区三区mba视频 | 欧美国产日韩在线观看| 亚洲欧美成人一区二区三区| 日本怡春院一区二区| 国产成人日日夜夜| 在线中文字幕一区| 欧美三级韩国三级日本一级| 欧美videossexotv100| 国产精品免费观看视频| 亚洲国产成人av| 国产专区欧美精品| 不卡的av电影| 欧洲一区在线电影| 久久久蜜桃精品| 亚洲一区在线看| 国内精品写真在线观看| 色狠狠色噜噜噜综合网| 精品黑人一区二区三区久久| 亚洲精品一二三四区| 久久国产精品色婷婷| 成人aa视频在线观看| 欧美一区二区国产| 中文字幕一区二区三区四区不卡| 五月婷婷色综合| 成人午夜视频福利| 日韩午夜中文字幕| 亚洲一区在线视频| 大白屁股一区二区视频| 666欧美在线视频| 欧美精品一区二区三区蜜桃视频| 亚洲成年人影院| va亚洲va日韩不卡在线观看| 日韩精品综合一本久道在线视频| 亚洲女同女同女同女同女同69| 麻豆国产欧美日韩综合精品二区| 91免费版在线看| 国产亚洲欧美日韩日本| 日韩中文字幕区一区有砖一区 | 欧美性一区二区| 亚洲国产激情av| 奇米777欧美一区二区| www.av亚洲| 中文字幕高清一区| 国产自产v一区二区三区c| 欧美伦理视频网站| 亚洲日本在线观看| eeuss影院一区二区三区| 精品少妇一区二区三区在线播放 | 亚洲成av人片一区二区| 色综合一区二区| 久久久久久麻豆| 国产一二三精品| 欧美videossexotv100| 日本vs亚洲vs韩国一区三区二区 | 欧美日韩亚洲综合一区 | 亚洲一级在线观看| 91一区一区三区| 国产精品福利一区二区三区| 精品一区二区日韩| 欧美电影免费提供在线观看| 九一九一国产精品| 久久欧美中文字幕| 国产成人午夜99999| 中文字幕av在线一区二区三区| 国产在线麻豆精品观看| 久久一区二区三区国产精品| 国产精品一区二区久激情瑜伽 | 日本三级亚洲精品| 欧美色图一区二区三区| 亚洲狠狠丁香婷婷综合久久久| 91亚洲精华国产精华精华液| 亚洲欧洲精品一区二区精品久久久| 不卡的av中国片|