{ ----------------------------------- 2003/06/15 GetTextメソッドが大分古い形式だったので Winの#13#10だけから#13、#10単独での場合も動作するように改造した MyStringRecordListのものを修正コピーした //----------------------------------- } unit StringClassList; interface uses StringUnitLight, XPtest, // Classes, //TList用 ListClone; //TListClone type TStringClass = class(TObject) private FItem: String; public constructor Create; overload; constructor Create(const S: String); overload; property Item: String read FItem write FItem; end; TClassListItem = TStringClass; //////////////////////////////////////////////////////////// {$include ClassList.inc.pas} //////////////////////////////////////////////////////////// //TStringClassList = TMyClassList; TStringClassList = class(TClassList) private procedure SetText(const Value: String); function GetText: String; public property Text: String read GetText write SetText; end; //XPテストコード procedure testStringClassList; procedure testGetSetText; implementation const EmptyStr: string = ''; //////////////////////////////////////////////////////////// {$include ClassList.inc.pas} //////////////////////////////////////////////////////////// { TStringClassList } function TStringClassList.GetText: String; var i: Integer; begin Result := ''; for i := 0 to Self.Count-1 do begin Result := Result + Self.Items[i].Item; end; end; (*----------------------------------- procedure TStringClassList.SetText(const Value: String); var i, Len, StrStartIndex, StrEndIndex: Integer; StrClass1: TStringClass; begin Self.Clear; if Value = EmptyStr then begin Exit; end; Len := Length(Value); StrStartIndex := 1; StrEndIndex := 1; for i := 1 to Len do begin StrEndIndex := i; if Value[i] = #10 then begin StrClass1 := TStringClass.Create; StrClass1.Item := Copy(Value, StrStartIndex, StrEndIndex-StrStartIndex+1); Self.Add(StrClass1); StrStartIndex := i+1; StrEndIndex := i+1; end else begin end; end; if StrStartIndex <> StrEndIndex then begin StrClass1 := TStringClass.Create; StrClass1.Item := Copy(Value, StrStartIndex, StrEndIndex-StrStartIndex+1); Self.Add(StrClass1); end; end; //-----------------------------------*) procedure TStringClassList.SetText(const Value: String); const LineBreakStrs: array[0..2] of String = (#13#10, #13, #10); var i, j, Len, StrStartIndex, StrEndIndex: Integer; LineBreakStr: String; StrClass1: TStringClass; begin Self.Clear; if Value = EmptyStr then begin Exit; end; Len := Length(Value); StrStartIndex := 1; StrEndIndex := 0; i := 1; while (i <= Len) do begin LineBreakStr := ''; for j := Low(LineBreakStrs) to High(LineBreakStrs) do begin if AnsiStringPartsCompare(LineBreakStrs[j], Value, i) then begin LineBreakStr := LineBreakStrs[j]; break; end; end; if LineBreakStr <> '' Then begin StrEndIndex := i + length(LineBreakStr)-1; StrClass1 := TStringClass.Create; StrClass1.Item := Copy(Value, StrStartIndex, StrEndIndex-StrStartIndex+1); Self.Add(StrClass1); i := StrEndIndex + 1; StrStartIndex := i; end else begin StrEndIndex := i; Inc(i); end; end; if 1 <= StrEndIndex-StrStartIndex+1 then begin StrClass1 := TStringClass.Create; StrClass1.Item := Copy(Value, StrStartIndex, StrEndIndex-StrStartIndex+1); Self.Add(StrClass1); end; end; procedure testStringClassList; var StringClass1: TStringClass; StringClassList1: TStringClassList; begin StringClassList1 := TStringClassList.Create; try StringClass1 := TStringClass.Create; StringClass1.Item := 'あいうえお'; StringClassList1.Add(StringClass1); StringClass1 := TStringClass.Create; StringClass1.Item := 'かきくけこ'; StringClassList1.Add(StringClass1); StringClassList1.Exchange(0, 1); Check('かきくけこ', StringClassList1.Items[0].Item); Check('あいうえお', StringClassList1.Items[1].Item); StringClassList1.Insert(0, TStringClass.Create('さしすせそ')); StringClassList1.Insert(0, TStringClass.Create('たちつてと')); Check('たちつてと', StringClassList1.Items[0].Item); Check('さしすせそ', StringClassList1.Items[1].Item); Check('かきくけこ', StringClassList1.Items[2].Item); Check('あいうえお', StringClassList1.Items[3].Item); finally StringClassList1.Free; end; end; type TTestMyStringList = TStringClassList; function GetIndexString(StrList: TStringClassList; i: Integer): String; begin Result := StrList.Items[i].Item; end; {$include TestMyStringList.pas} (*----------------------------------- procedure testGetSetText; var StrClsList: TStringClassList; begin StrClsList := TStringClassList.Create; try StrClsList.SetText('あいうえお'); CheckInt(1, StrClsList.Count); CheckStr(StrClsList.Items[0].Item, 'あいうえお'); CheckStr('あいうえお', StrClsList.GetText); StrClsList.SetText('あいうえお'#13#10); CheckInt(1, StrClsList.Count); CheckStr(StrClsList.Items[0].Item, 'あいうえお'#13#10); CheckStr('あいうえお'#13#10, StrClsList.GetText); StrClsList.SetText('あいうえお'#13#10'かきくけこ'); CheckInt(2, StrClsList.Count); CheckStr(StrClsList.Items[0].Item, 'あいうえお'#13#10); CheckStr(StrClsList.Items[1].Item, 'かきくけこ'); CheckStr('あいうえお'#13#10'かきくけこ', StrClsList.GetText); StrClsList.SetText('あいうえお'#13#10'かきくけこ'#13#10); CheckInt(2, StrClsList.Count); CheckStr(StrClsList.Items[0].Item, 'あいうえお'#13#10); CheckStr(StrClsList.Items[1].Item, 'かきくけこ'#13#10); CheckStr('あいうえお'#13#10'かきくけこ'#13#10, StrClsList.GetText); StrClsList.SetText('あいうえお'#13#10'かきくけこ'#13#10'さしすせそ'); CheckInt(3, StrClsList.Count); CheckStr(StrClsList.Items[0].Item, 'あいうえお'#13#10); CheckStr(StrClsList.Items[1].Item, 'かきくけこ'#13#10); CheckStr(StrClsList.Items[2].Item, 'さしすせそ'); CheckStr('あいうえお'#13#10'かきくけこ'#13#10'さしすせそ', StrClsList.GetText); StrClsList.SetText(#13#10#13#10#13#10#13#10'あいうえお'#13#10#13#10); CheckInt(6, StrClsList.Count); CheckStr(StrClsList.Items[0].Item, #13#10); CheckStr(StrClsList.Items[1].Item, #13#10); CheckStr(StrClsList.Items[2].Item, #13#10); CheckStr(StrClsList.Items[3].Item, #13#10); CheckStr(StrClsList.Items[4].Item, 'あいうえお'#13#10); CheckStr(StrClsList.Items[5].Item, #13#10); CheckStr(#13#10#13#10#13#10#13#10'あいうえお'#13#10#13#10, StrClsList.GetText); StrClsList.SetText(StringOfChar(' ', 250)); CheckInt(1, StrClsList.Count); CheckStr(StringOfChar(' ', 250), StrClsList.GetText); StrClsList.SetText(StringOfChar(' ', 2500)); CheckInt(1, StrClsList.Count); CheckStr(StringOfChar(' ', 2500), StrClsList.GetText); CheckInt(2500, Length(StringOfChar(' ', 2500))); CheckInt(2500, Length(StrClsList.GetText)); StrClsList.SetText(WideString(StringOfChar(' ', 2500))); CheckInt(1, StrClsList.Count); CheckStr(StringOfChar(' ', 2500), StrClsList.GetText); CheckInt(2500, Length(StringOfChar(' ', 2500))); CheckInt(2500, Length(StrClsList.GetText)); finally StrClsList.Free; end; end; //-----------------------------------*) { TStringClass } constructor TStringClass.Create(const S: String); begin inherited Create; FItem := S; end; constructor TStringClass.Create; begin inherited; end; initialization finalization end.