Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
remobject_pascal_script:klassy [2018/04/02 10:59]
jurist23rus [14. Классы]
remobject_pascal_script:klassy [2018/04/23 09:12] (текущий)
7bit Форматирование кода
Строка 6: Строка 6:
 <code delphi> <code delphi>
 var var
- SL: TStringList;+  SL: TStringList;
 begin begin
- // До создания объекта переменная SL = nil. +  // До создания объекта переменная SL = nil. 
- SL := TStringList.Create; +  SL := TStringList.Create; 
- SL.Delimiter := ‘ ’+  SL.Delimiter := ' '
- SL.DelimitedText := Один Два Три Четыре Пять+  SL.DelimitedText := 'Один Два Три Четыре Пять'
- Debug(SL.Count); +  Debug(SL.Count); 
- SL.SaveToFile(d:\data.txt); +  SL.SaveToFile('d:\data.txt'); 
- SL.Free; +  SL.Free; 
- // После удаления объекта переменная SL содержит указатель на несуществующий объект. +  // После удаления объекта переменная SL содержит указатель на несуществующий объект. 
- // Попытка обратиться к методу или свойству объекта приведет к ошибке  +  // Попытка обратиться к методу или свойству объекта приведет к ошибке  
- // Access violation. Помещаем в переменную нулевой указатель, чтобы можно было понять +  // "Access violation". Помещаем в переменную нулевой указатель, чтобы можно было понять 
- // существует объект или нет. +  // существует объект или нет. 
- SL := nil;  +  SL := nil;  
- if SL <> nil then … +  if SL <> nil then … 
- else …+  else …
 end; end;
 </code> </code>
 Объект создается с помощью конструктора класса. Как правило, конструктор имеет название Create. При вызове конструктора происходит выделение памяти для объекта и другие подготовительные действия, заданные разработчиком класса. В переменной сохраняется ссылку на объект – адрес участка памяти. До вызова конструктора переменная содержит неопределенный указатель, обозначается ключевым словом nil. После создания объекта можно обращаться к его методам и свойствам через точку. Закончив работу с объектом, нужно освободить занятую объектом память или, как говорят по-другому, уничтожить объект. Делается это методом Free.  Объект создается с помощью конструктора класса. Как правило, конструктор имеет название Create. При вызове конструктора происходит выделение памяти для объекта и другие подготовительные действия, заданные разработчиком класса. В переменной сохраняется ссылку на объект – адрес участка памяти. До вызова конструктора переменная содержит неопределенный указатель, обозначается ключевым словом nil. После создания объекта можно обращаться к его методам и свойствам через точку. Закончив работу с объектом, нужно освободить занятую объектом память или, как говорят по-другому, уничтожить объект. Делается это методом Free. 
  
-Стоит обратить внимание, что при уничтожении объекта переменная по-прежнему содержит ссылку, но уже на несуществующий объект. Попытка обратиться к методу или свойству несуществующего объекта приведет к ошибке Access violation. <WRAP center round tip 80%>+Стоит обратить внимание, что при уничтожении объекта переменная по-прежнему содержит ссылку, но уже на несуществующий объект. Попытка обратиться к методу или свойству несуществующего объекта приведет к ошибке "Access violation". <WRAP center round tip 80%>
 Присваивайте переменной класса значение nil, чтобы можно было понять существует объект или нет. Присваивайте переменной класса значение nil, чтобы можно было понять существует объект или нет.
 </WRAP> </WRAP>
Строка 39: Строка 39:
 Наследование позволяет создать новый класс на основе существующего класса. Новый класс называют потомком, а наследуемый класс – базовым классом, предком, родительским. Новый класс может расширять функционал базового класса и переопределять существующий функционал. Создаются целые иерархии классов, где базовые классы обладают некоторыми методами и свойствами, которые общие для всех потомков. Взять, к примеру, классы LCL. Элементы графического интерфейса представлены такими классами, как TEdit – поле для ввода текста, TLabel - метка, TButton – кнопка. Каждый из них имеет специфические свойства и методы. Но все они, по сути, являются элементами управления, которые имеют положение, размер, цвет и т. д. И чтобы не повторять для каждого класса одни и те же свойства, а также задать общее для всех поведение, они наследуют общие свойства и методы от базового класса TControl. Наследование позволяет создать новый класс на основе существующего класса. Новый класс называют потомком, а наследуемый класс – базовым классом, предком, родительским. Новый класс может расширять функционал базового класса и переопределять существующий функционал. Создаются целые иерархии классов, где базовые классы обладают некоторыми методами и свойствами, которые общие для всех потомков. Взять, к примеру, классы LCL. Элементы графического интерфейса представлены такими классами, как TEdit – поле для ввода текста, TLabel - метка, TButton – кнопка. Каждый из них имеет специфические свойства и методы. Но все они, по сути, являются элементами управления, которые имеют положение, размер, цвет и т. д. И чтобы не повторять для каждого класса одни и те же свойства, а также задать общее для всех поведение, они наследуют общие свойства и методы от базового класса TControl.
  
-Полиморфизм – это когда базовый объект «знает», метод какого потомка надо вызвать.+Полиморфизм – это когда базовый объект "знает", метод какого потомка надо вызвать.
  
 <code delphi> <code delphi>
 procedure RepaintAllControls(Container: TWinControl); procedure RepaintAllControls(Container: TWinControl);
 var var
- i: Integer; +  i: Integer; 
- C: TControl;+  C: TControl;
 begin begin
- for i := 0 to Container.ControlCount – 1 do +  for i := 0 to Container.ControlCount – 1 do 
- begin +  begin 
-  C := Container.Controls[i]; +    C := Container.Controls[i]; 
-  C.Repaint; // Перерисовываем компонент +    C.Repaint; // Перерисовываем компонент 
- end;+  end;
 end; end;
 </code> </code>
Строка 62: Строка 62:
 <code delphi> <code delphi>
 var var
- SL: TStrings;+  SL: TStrings;
 begin begin
- SL := TStringList.Create; +  SL := TStringList.Create; 
- …+  
 end; end;
 </code> </code>
Строка 75: Строка 75:
 </code> </code>
  
-Если переменная содержит ссылку на несуществующий объект, то появится ошибка cannot cast an object. Если переменная содержит nil, то появиться ошибка null pointer exception” или could not call proc. Если результат преобразования сохранить в другой переменной, то в случае с nil ошибки не будет, другая переменная тоже будет содержать nil:+Если переменная содержит ссылку на несуществующий объект, то появится ошибка "cannot cast an object". Если переменная содержит nil, то появиться ошибка "null pointer exceptionили "could not call proc". Если результат преобразования сохранить в другой переменной, то в случае с nil ошибки не будет, другая переменная тоже будет содержать nil:
 <code delphi> <code delphi>
 var var
- SL: TStrings; +  SL: TStrings; 
- SL2: TStringList;+  SL2: TStringList;
 begin begin
- SL2 := TStringList(SL); // Ошибки не будет. SL2 будет равно nil.+  SL2 := TStringList(SL); // Ошибки не будет. SL2 будет равно nil.
 end; end;
 </code> </code>
Строка 89: Строка 89:
 procedure FieldChange(Sender, Control: TObject; const FieldName: String); procedure FieldChange(Sender, Control: TObject; const FieldName: String);
 begin begin
- if Control is TdxEdit then +  if Control is TdxEdit then 
- begin +  begin 
-  if TdxEdit(Control).ValidateText then … +    if TdxEdit(Control).ValidateText then … 
- end +   end 
- else if Control is TCustomDBEditButton then …+   else if Control is TCustomDBEditButton then …
 end; end;
 </code> </code>
Строка 100: Строка 100:
 <code delphi> <code delphi>
 var var
- SL: TStringList;+  SL: TStringList;
 begin begin
- SL := TStringList.Create; +  SL := TStringList.Create; 
- with SL do +  with SL do 
- begin +  begin 
-  Add(Один); +    Add('Один'); 
-  Add(Два); +    Add('Два'); 
- end; +   end; 
- …+  
 end; end;
 </code> </code>
Строка 116: Строка 116:
 with TStringList.Create do with TStringList.Create do
 begin begin
- Add(Один); +  Add('Один'); 
- Add(Два); +  Add('Два'); 
- … +  … 
- // Не забываем удалить объект +  // Не забываем удалить объект 
- Free;+  Free;
 end; end;
 </code> </code>