Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> .Net совместимые классы в Delphi 2009 
:(
    Опции темы
Rohoss
Дата 22.4.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



.Net совместимые классы в Delphi 2009

Часть I (TStringBuilder)

Содержание



1    Предисловие

2    Вступление

3    Класс TStringBuilder

   3.1       Что это за класс и зачем он нужен

   3.2       Представление данных внутри TStringBuilder

   3.3       Свойства 

   3.4       Конструкторы

   3.5       Методы

4    Пример использования

5    Заключения


Предисловие

 Решил написать статью о .Net совместимых классах Delphi. В первой части статьи я описал класс TStringBuilder. В остальных частях (если будет время и желания их писать), я хочу описать еще, по крайней мере, четыре класса (TStringReader TStringWriter TStreamReader TStreamWriter).

Вступление
Технология .Net  приобретает всё большую популярность и не удивительно, что Delphi for Win32 перенимает стандарты, существующие в .Net вселенной.  
Одно из доказательств этому - появления новых методов в классе TObject, который является базовым для всех классов VCL. Эти методы позаимствованы с базового класса .net – System.Object, или просто object.
Вот эти методы, все они виртуальны, я вкратце их опишу:
Код

  function Equals(Obj: TObject): Boolean;

Этот метод сравнивает свой экземпляр (Self) с объектом, который принимает в параметре Obj. В случае, если экземпляры равны друг другу (Obj = Self), возвращает True, иначе соответственно False.   
Код

  function GetHashCode:  Integer;

Возвращает Хеш код объекта. Каждый объект имеет уникальный хеш код. 
Код

function ToString:  string;

Возвращает строковое представления класса. По умолчанию возвращает тоже, что и ClassName. 

Что это за класс и зачем он нужен
TStringBuilder является аналогом .net класса StringBuilder с пространства имён System.Text. Он был создан для быстрых операций со строками. Кроме того, данный класс имеет несколько очень удобных методов, которых нет в System.String (string). Использования этого класса, может показатся удобным и в Delphi. Рассмотри его.

Представление данных внутри TStringBuilder
Внутри класса TStringBuilder данные, с которыми работает класс, хранятся внутри protected поля FData, типа TCharArray. это динамический массив символов
Код

TCharArray = array of Char;


Свойства

Класс TStringBuilder имеет 4 свойства

Capacity
Код

property Capacity: Integer read get_Capacity write set_Capacity;

С помощью данного свойства можно узнать или изменить размер памяти, выделенной под FData

Chars
Код

property Chars[index: Integer]: Char read get_Chars write set_Chars; default;

С помощью Chars можно узнать или установить определённый символ в массиве  FData. Также, в объявлении свойства, мы видим ключевое слово  default, означающее, что это свойство используется по умолчанию.

Length
Код

property Length: Integer read get_Length write set_Length;

Length, получает/задаёт  длину FData в символах.

MaxCapacity
Код

property MaxCapacity: Integer read get_MaxCapacity;

Возвращает размер максимально возможной используемой памяти для поля FData. Это свойство только для чтения, оно возвращает значения protected поля FMaxCapacity. Значение этого поля можно задать конструктором, а по умолчанию оно задаётся равным  MaxInt (2147483647).

Конструкторы

Конструктор класса TStringBuilder 6 раз перегружен. Рассмотрим все реализации.

Код

constructor Create; overload;

Создаёт объект с параметрами по умолчанию.

Код

constructor Create(aCapacity: Integer); overload;

Создаёт объект, и выделяет первоначальный размер памяти для него, равный параметру aCapacity.
Этот конструктор может быть полезен в том случае, когда мы точно знаем, что объект будет содержать большой объем данных, однако, данные будут добавляться малыми блоками. 

Код

constructor Create(const Value: string); overload;

Позволяет установить изначальное значения(Value) объекта.

Код

constructor Create(aCapacity: Integer; aMaxCapacity: Integer); overload;

Данный конструктор позволяет определить максимальный размер памяти (aMaxCapacity) , допустимый для основного поля данных(FData) нашего объекта и первоначальный размер  блока памяти (aCapacity) .

Код

constructor Create(const Value: string; aCapacity: Integer); overload;

Позволяет установить первоначальное значения(Value) объекта, и блок выделяемой памяти(aCapacity).

Код

constructor Create(const Value: string; StartIndex: Integer; Length: Integer; aCapacity: Integer); overload;

Вызывает версию конструктора, принимающего в качестве параметра строку и объем первоначальной памяти для неё, а именно: Create(const Value: string; aCapacity: Integer). Далее, передаёт ему в качестве параметра Value строку, возвращаемую функцией MidStr (которая принимает в качестве параметров, параметры конструктора: Value, StartIndex и length). 
Вот как это всё выглядит:
Код

constructor TStringBuilder.Create(const Value: string; StartIndex, length,
  aCapacity: Integer);
begin
  Create(MidStr(Value, StartIndex + 1, length), aCapacity);
end;


Методы

Итак, начнём с метода ToString. Вообще, этот метод, как я уже упоминал, возвращает по умолчанию тоже, что и ClassName, но в отличии от последнего, метод ToString, часто перегружают, что и сделано в нашем классе.   Используя метод ToString, мы получаем не имя класса TStringBuilder, а данные, которые он содержит в строковом представлении.
Другими словами, это как раз тот метод, который нам должен вернуть результат нашей работы со строками.
В TStringBuilder, метод  ToString два раза перегружен: 

Код

function ToString: string; overload; override;

Возвращает данные TStringBuilder (FData) в строковом представлении.

Код

function ToString(StartIndex: Integer; StrLength: Integer): string; reintroduce; overload;

Возвращает строку начиная с позиции StartIndex и длиной StrLength.

Метод Append в TStringBuilder 19 раз перегружен
Код

      function Append(const Value: Boolean): TStringBuilder; overload;
      function Append(const Value: Byte): TStringBuilder; overload;
      function Append(const Value: Char): TStringBuilder; overload;
      function Append(const Value: Currency): TStringBuilder; overload;
      function Append(const Value: Double): TStringBuilder; overload;
      function Append(const Value: Smallint): TStringBuilder; overload;
      function Append(const Value: Integer): TStringBuilder; overload;
      function Append(const Value: Int64): TStringBuilder; overload;
      function Append(const Value: TObject): TStringBuilder; overload;
      function Append(const Value: Shortint): TStringBuilder; overload;
      function Append(const Value: Single): TStringBuilder; overload;
      function Append(const Value: string): TStringBuilder; overload;
      function Append(const Value: UInt64): TStringBuilder; overload;
      function Append(const Value: TCharArray): TStringBuilder; overload;
      function Append(const Value: Word): TStringBuilder; overload;
      function Append(const Value: Cardinal): TStringBuilder; overload;
      function Append(const Value: Char; RepeatCount: Integer): TStringBuilder; overload;
      function Append(const Value: TCharArray; StartIndex: Integer; CharCount: Integer): TStringBuilder; overload;
      function Append(const Value: string; StartIndex: Integer; Count: Integer): TStringBuilder; overload;


Соответственно этот метод добавляет к тем данным, которые уже имеет его поле данных FData, данные переданные в параметре Value и конвертируемые в TCharArray.  Однако, обратите внимания на тип данных, возвращаемый этим методом. Метод Append возвращает объект, типа TStringBuilder, а точнее как раз ссылку на самого себя. Благодаря этому становятся возможной следующая конструкция:
Код

var
  SB: TStringBuilder;
begin
  SB := TStringBuilder.Create;
  try
    SB.Append(' Integer: ').Append(500).Append(' Boolean: ').Append(True);
    ShowMessage(SB.ToString);
  finally
    SB.Free;
  end;
end;

Все реализации метода Append я рассматривать не буду, так как и так всё понятно. Передаём значения в параметре Value определённого типа, каждый метод конвертирует значение Value в строку и вызывает вариант метода Append, в котором тип параметра Value является строка. Ну а вариант Append, принимающий в параметре строку имеет уже собственный способ добавления строки к полю FData типа TCharArray.
Мы рассмотрим варианты Append, которые имеют иной тип реализации.
Как можно догадаться, варианты Append, в которых параметры имеют типы Char и TCharArray, нет смысла конвертировать в строку.
Теперь три реализации метода Append, которые принимают больше одного параметра:
Код

function Append(const Value: Char; RepeatCount: Integer): TStringBuilder; overload;

Здесь мы передаём в параметре Value символ, который мы хотим добавить, а в параметре RepeatCount указываем, сколько символов (Value) должно добавится. Если написать так:
Код

  with TStringBuilder.Create do
  begin
    try
      Append('Value K, RepeatCount 4 = ');
      Append('K', 4);
      ShowMessage(ToString);
    finally
      Free;
    end;
  end;

то в сообщении увидим «Value K, RepeatCount 4 = KKKK».

Код

function Append(const Value: string; StartIndex: Integer; Count: Integer): TStringBuilder; overload;

В этой реализации мы добавляем позицию параметра Value, начинаю со StartIndex и длиной Count:
Код

with TStringBuilder.Create do
  begin
    try
      Append('0000');
      Append('123456789', 2, 3);
      ShowMessage(ToString);
    finally
      Free;
    end;
  end;  

тут в сообщении увидим «0000345»

Код

function Append(const Value: TCharArray; StartIndex: Integer; CharCount: Integer): TStringBuilder; overload;

Этот Append аналогичен предыдущему, только место string принимает родной TCharArray.

Метод AppendFormat 
Код

function AppendFormat(const Format: string; const Args: array of const): TStringBuilder; overload;

позволяет добавлять форматированный текст
Код

  with TStringBuilder.Create do
  begin
    try
      AppendFormat('%s is %s of %s', ['TStringBuilder', 'Class', 'Delphi 2009' ]);
      ShowMessage(ToString);
    finally
      Free;
    end;
end;


AppendLine, два раза перегружен:

Код

function AppendLine: TStringBuilder;

Добавляем пустую строчку (sLineBreak).

Код

function AppendLine(const Value: string): TStringBuilder;

Здесь же мы добавляем Value, а затем создаём новую строку.

Все методы Insert (19 реализаций) аналогичны методам Append. Естественно, параметр Integer, указывает позицию, куда будет вставлен символ, в отличии от Append, который добавляет Value в конец данных.

EnsureCapacity

Код

function EnsureCapacity(aCapacity: Integer): Integer;

Этот метод позволяет задать размер памяти, выделенный под FData. Он отличается от метода, обрабатывающего изменения свойства Capacity,  тем, что если мы зададим значения параметра aCapacity меньше размера памяти, необходимого для хранения FData, мы не получим AV,  как это было бы в случаи со свойством Capacity, память просто не уменьшится.

Equals

Код

function Equals(StringBuilder: TStringBuilder): Boolean;

Метод, позволяющий сравнить свой экземпляр с себе подобным.
В сравнении участвуют свойства Length и MaxCapacity, и конечно же  FData. 
Вспомним, что это новый метод класса TObject.

Методы Replace

Код

function Replace(const OldChar: Char; const NewChar: Char): TStringBuilder; overload;

Заменяет в FData символы OldChar на NewChar

Код

function Replace(const OldValue: string; const NewValue: string): TStringBuilder; overload;

Заменяет в FData подстроки OldValue на NewValue

Код

function Replace(const OldChar: Char; const NewChar: Char; StartIndex: Integer; Count: Integer): TStringBuilder; overload;

Заменяет в FData символы OldChar на NewChar начиная с позиции StartIndex и до символа номер Count

Код

function Replace(const OldValue: string; const NewValue: string; StartIndex: Integer; Count: Integer): TStringBuilder; overload;

Заменяет в FData подстроки OldValue на NewValue начиная с позиции StartIndex и до символа номер Count

Метод Remove

Код

function Remove(StartIndex: Integer; RemLength: Integer): TStringBuilder;

Позволяет удалить символы, начиная со StartIndex и длиной RemLength

Метод CopyTo

Код

procedure CopyTo(SourceIndex: Integer; const Destination: TCharArray; DestinationIndex: Integer; Count: Integer);

копирует символы с поля FData в параметр Destination. 
Копирования начиная с позиции SourceIndex в FData в позицию DestinationIndex параметра Destination. Количество копируемых символов равно Count.
К примеру:
Код

var
  My: TCharArray;
begin
  SetLength(My, 5);
  My[0] := 'a';
  My[1] := 'b';
  My[2] := 'c';
  My[3] := 'd';
  My[4] := 'e';
  with TStringBuilder.Create do
  begin
    try
      Append('123456789');
      CopyTo(3, My, 2, 2);
      ShowMessage(My[0] + My[1] + My[2] + My[3] + My[4]);
    finally
      Free;
    end;
  end;
end; 

здесь, мы получим такой текст сообщения: «ab45e».

Пример

В примере мы рассмотрим только два метода: Append и AppendLine.
Наш пример будет отображать некоторые свойства наследников класса TControl. Мы напишем две процедуры, одна из них (ShowControlAttributeSB), будет собирать значения свойств с помощью TStringBuilder, вторая (ShowControlAttributeMemo) будет использовать только механизмы, инкапсулированные в TMemo.
Итак, разместим на форме TRadioGroup и установим свойства:
Name = rgOperationSelect
Caption = «Выбираем процедуру для отображения свойств компонентов»
Align = alTop
ItemIndex = 0
и добавляем в свойстве Items две строки
ShowControlAttributeSB (Используем TStringBuilder)
ShowControlAttributeMemo (Используем Memo)
Далее кидаем TListBox, и соответственно свойства
Name = lstControls
Align = alLeft
И TMemo со свойствами
Name = mmoOut
Align = alBottom
ScrollBars = ssBoth

Теперь  в правом углу у нас должно остаться свободное место, туда мы положим любые компоненты, в любом количестве. Я положим: TButton, TEdit, TPanel и  TLabel, назвав их btn1, edt1, pnl1 и lbl1.
Вот код главной формы:
Код

unit mainForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TfrmMain = class(TForm)
    lstControls: TListBox;
    btn1: TButton;
    mmoOut: TMemo;
    lbl1: TLabel;
    edt1: TEdit;
    pnl1: TPanel;
    rgOperationSelect: TRadioGroup;
    {Отображаем свойства компонентов используя TStringBuilder}
    procedure ShowControlAttributeSB(AControl: TControl);
    {Отображаем свойства компонентов используя TMemo}
    procedure ShowControlAttributeMemo(AControl: TControl);
    {Обрабатываем клик на компоненте lstControls}
    procedure lstControlsClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormShow(Sender: TObject);
var
  I: Integer;
begin
  //Заполняем наш lstControls наследниками TControl, принадлежащими форме
  for I := 0 to frmMain.ControlCount - 1 do
    lstControls.Items.Add(frmMain.Controls[I].Name);
end;

procedure TfrmMain.lstControlsClick(Sender: TObject);
begin
  //Используем процедуру для отображения свойств компонента,
  //в зависимости от выбора в rgOperationSelect
  if rgOperationSelect.ItemIndex = 0 then
    ShowControlAttributeSB(frmMain.Controls[lstControls.ItemIndex])
  else
    ShowControlAttributeMemo(frmMain.Controls[lstControls.ItemIndex]);
end;

procedure TfrmMain.ShowControlAttributeSB(AControl: TControl);
var
  SB: TStringBuilder;
begin
  //Создаем  объект, и задаём первоначальный размер массива FData равным 1000
  SB := TStringBuilder.Create(1000);
  with SB do
  try
    //Добавляем данные и переходим на новую строчку
    Append('Name: ').AppendLine(AControl.Name);
    Append('Type: ').AppendLine(AControl.ClassName);
    Append('Top: ').Append(AControl.Top).AppendLine;
    Append('Left: ').Append(AControl.Left).AppendLine;
    Append('Width: ').Append(AControl.Width).AppendLine;
    Append('Height: ').Append(AControl.Height).AppendLine;
    Append('Visible: ').Append(AControl.Visible).AppendLine;
    Append('Enabled: ').Append(AControl.Enabled).AppendLine;
    Append('Owner Name: ').AppendLine(AControl.Owner.Name);
    Append('Owner Type: ').AppendLine(AControl.Owner.ClassName);
    mmoOut.Text := SB.ToString;
  finally
    Free;
  end;
end;

procedure TfrmMain.ShowControlAttributeMemo(AControl: TControl);
var
  s: string;
begin
  mmoOut.Clear;
  with mmoOut.Lines do
  begin
    s := 'Name: ' + AControl.Name;
    Add(s);
    s := 'Type: ' + AControl.ClassName;
    Add(s);
    s := 'Top: ' + IntToStr(AControl.Top);
    Add(s);
    s := 'Left: ' + IntToStr(AControl.Left);
    Add(s);
    s := 'Width: ' + IntToStr(AControl.Width);
    Add(s);
    s := 'Height: ' + IntToStr(AControl.Height);
    Add(s);
    s := 'Visible: ' + BoolToStr(AControl.Visible, True);
    Add(s);
    s := 'Enabled: ' + BoolToStr(AControl.Enabled, True);
    Add(s);
    s := 'Owner Name: ' + AControl.Owner.Name;
    Add(s);
    s := 'Owner Type: ' + AControl.Owner.ClassName;
    Add(s);
  end;
end;
end.


Как  видим, в случае со TStringBuilder нам не нужно лишний раз конвертировать форматы, да и код выглядит компактнее.

Заключения
Ну, вот и всё что касается TStringBuilder'а. Ещё хочу предупредить, что не все параметры методов и конструкторов класса TStringBuilder в Delphi, совпадают с параметрами методов и конструкторов класса StringBuilder в .net. 
Надеюсь, вам понравилась эта часть статьи, и вы взяли на вооружения описанный здесь класс.


В аттаче пример, и статья в формате pdf

Это сообщение отредактировал(а) Rohoss - 22.4.2009, 23:19

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  Example.zip 118,70 Kb


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.