Зі святом панове!
Torbins написав:В батьківському класі зробіть віртуальний конструктор. В дочірніх класах ви зможете його розширювати, якщо буде треба. В конструкторі можна створити усі об'єкти, які потім зможуть використовувати дочірні класи. А в деструкторі, відповідно, їх треба буде видалити. І ще раджу замінити TImage на TBitmap. Буде щось таке:
Пане Torbins для мене це нова тема і я вже геть заплутався. Якщо маєте час поясніть докладніше.
1) В батьківському класі зробіть віртуальний конструктор. Так це я зрозумів
constructor Create; virtual;
2) В дочірніх класах ви зможете його розширювати, якщо буде треба.
Constructor Create; Override;
Тут в мене питання: А як тоді в описі дочірнього конструктора там якось Inherited; потрібно використовувати? Який взагалі там синтаксис коду буде?
3) В конструкторі можна створити усі об'єкти, які потім зможуть використовувати дочірні класи. От я і запитую як мені прописати код щоб з цього модуля можна було створити об'єкт на формі?
4) І ще раджу замінити TImage на TBitmap. Тут взагалі не зрозумів для чого це робити. Мені просто потрібно в об'єкті TImage ввести текст (літеру чи декілька) по заданих координатах, який візуально позначає фізичну величину.
З того що я зрозумів з літератури та відео в Ютуб, я створив об'єкт на формі методом CreateObject, хоча не розумію як це працює:
Procedure TPhysicalPhenomenon.CreateObject (Letter: String; Owner: TWinControl);
Begin
fObjectContainer := Timage.Create(Owner);
fObjectContainer.Parent := Owner;
fObjectContainer.Width := 25;
fObjectContainer.Height := 25;
fObjectContainer.Top := 120;
fObjectContainer.Left := 0;
fObjectContainer.Canvas.Brush.Color := clWhite;
fObjectContainer.Canvas.Font.Name := 'Monotype Corsiva';
fObjectContainer.Canvas.Font.Style := [fsBold, fsItalic];
fObjectContainer.Canvas.Font.Size := 20;
fObjectContainer.Canvas.TextOut(6, -6, Letter);
fObjectContainer.ShowHint := True;
fObjectContainer.Hint := 'Час';
End;
Та мені прийшлось поміняти дочірні конструктори. Вони стали з параметрами, чого дуже не хочеться але я не знаю як ще передати параметр власника.
{Клас Час}
TPhysicalTime = Class (TPhysicalPhenomenon)
Private
// fGeneralRowObject: String;
Protected
Public
// Тут будуть відповідні методи класу Час!
constructor CreateTime (Owner: TWinControl);
Published
End;
{Клас Шлях - l.}
TPhysicalPath = Class (TPhysicalPhenomenon)
Private
Protected
Public
// Тут будуть відповідні методи класу Шлях!
constructor CreatePath (Owner: TWinControl);
Published
End;
{Клас Переміщення - s.}
TPhysicalMoving = Class (TPhysicalPhenomenon)
Private
Protected
Public
// Тут будуть відповідні методи класу Переміщення!
constructor CreateMoving (Owner: TWinControl);
Published
End;
{Клас Швидкість - v.}
TPhysicalSpeed = Class (TPhysicalPhenomenon)
Private
Protected
Public
// Тут будуть відповідні методи класу Швидкість!
constructor CreateSpeed (Owner: TWinControl);
Published
End;
Constructor TPhysicalTime.CreateTime (Owner: TWinControl);
Const
DEFINITION_TIME =
'Час визначає тривалiсть iснування об’єктiв i послiдовнiсть змiн, якi в ' +
'них вiдбуваються. ' + #13#10 + 'Час позначають лiтерою t.' + #13#10;
Begin
CreateObject('t',Owner);
fDefinitionPhysicalPhenomenon := DEFINITION_TIME;
fNamePhysicalPhenomenon := 'Час - t';
End;
{ TPhysicalPath }
Constructor TPhysicalPath.CreatePath (Owner: TWinControl);
Const
DEFINITION_PATH =
'Шлях — фiзична величина, що дорiвнює довжинi траєкторiї, яку описує тiло ' +
'за час руху.' + #13#10 + 'Шлях позначають малою латинською лiтерою l.' +
#13#10;
Begin
CreateObject('l',Owner);
fDefinitionPhysicalPhenomenon := DEFINITION_PATH;
fNamePhysicalPhenomenon := 'Шлях - l';
End;
{ TPhysicalMoving }
Constructor TPhysicalMoving.CreateMoving (Owner: TWinControl);
Const
DEFINITION_MOVING =
'Перемiщення — фiзична величина, що характеризує змiну положення тіла у ' +
'просторi та визначається напрямленим вiдрiзком, який сполучає положення ' +
'рухомого тiла на початку i в кiнцi певного iнтервалу часу.' + #13#10 +
'Переміщення s — це вектор, що сполучає початкове положення тіла з його ' +
'положенням у вибраний момент часу.' + #13#10;
Begin
CreateObject('s',Owner);
fDefinitionPhysicalPhenomenon := DEFINITION_MOVING;
fNamePhysicalPhenomenon := 'Переміщення - s';
End;
{ TPhysicalSpeed }
Constructor TPhysicalSpeed.CreateSpeed (Owner: TWinControl);
Const
DEFINITION_SPEED = 'Швиидкість — фізична величина, що відповідає ' +
'відношенню переміщення тіла до проміжку часу, за який це переміщення ' +
'відбувалось.' + #13#10 + 'Швидкість — величина векторна, тобто вона має ' +
'абсолютну величину і ' + 'напрямок.' + #13#10 + 'Швидкість позначають ' +
'малою латинською лiтерою v.' + #13#10;
Begin
CreateObject('v',Owner);
fDefinitionPhysicalPhenomenon := DEFINITION_SPEED;
fNamePhysicalPhenomenon := 'Швидкість - v';
End;
І створив я його в модулі програми на головній формі так (Нижній об'єкт на малюнку з літерою t) :
procedure TForm1.FormCreate(Sender: TObject);
var
CHAS: TPhysicalTime;
begin
CHAS := TPhysicalTime.CreateTime(Form1);
В наступному повідомленні скину весь код модуля. Дякую за ваш затрачений час панове!
P.S. Якщо пан koala запитає для чого це все робиться: це робиться для того щоб я зміг запрограмувати подію (Клік) на створеному об'єкті. Якщо це взагалі можливо зробити програмно (Хоча я десь читав що там якимось чином через клас TNotyfiEvent потрібно це робити, хоча можливо я і помиляюсь)! А після цього я вже буду проводити всі необхідні маніпуляції.