Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2012, 20:41   #1
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию Создание TComponent/TWinControl внутри класса

Доброго времени суток.
Описываю класс:
Код:
type TMyClass = class
private
  FParent:TWinControl;
  procedure myProc(AFile:String);
public
  List:TStringList;
  constructor Create(AFile:String);
end;

...

constructor TMyClass.Create(AFile:String);
begin
FParent:=TWinControl.Create(nil);
MyProc(AFile);
end;
Вышеописанный код выдает ошибку записи в месте создания FParent.
Можно ли как-то создать FParent внутри класса, чтобы пользователю не нужно было его вводить вызывая Create? Зачем нужен FParent: далее в процедуре мне необходимо создать, например, TRichEdit, который требует AOwner и Parent для своей работы. Я могу создать их динамически в классе и использовать, верно?
kettanaito вне форума Ответить с цитированием
Старый 09.06.2012, 00:20   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

AOwner может быть нил, а Parent это, тот на ком отображается компонент.
а так вопрос тот же что и в соседней теме.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.06.2012, 01:05   #3
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Пепел Феникса, ошибка даже в таком случае:
Код:
constructor TMyClass.Create(Parent:TWinControl);
begin
FParent:=Parent;
end;
Что Вы имеете в виду под "вызовом этого кода"?
kettanaito вне форума Ответить с цитированием
Старый 09.06.2012, 02:08   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ваш класс сам себя вызывает?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.06.2012, 09:06   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Зачем нужен FParent: далее в процедуре мне необходимо создать, например, TRichEdit, который требует AOwner и Parent для своей работы
Он их вовсе не требует. Parent требует его отображение где-то. Owner требует контроль за временем жизни. Если вам это не надо, то можно обойтись nil.

вот и получайте их(owner, Parent) в своем классе извне.
Кстати говоря Parent: Twincontrol вполне годится также на роль Owner: TComponent, т.е. достаточно получать только Parent.
Вы же не знаете где захотят разместить даже не ваш класс, а некий объект(RichEdit).
а лучше получайте сразу готовый richEdit.

Варианты на выбор.
Код:
prvate
  FRichEdit: TRichEdit;
publuc
property Richedit: TRichEdit;
Код:
prvate
  Fparent: TwinControl;
publuc
property Richedit: TRichEdit;
Код:
constrctor Create(Aparent: TWinControl; Afile: string);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.06.2012 в 09:15.
evg_m вне форума Ответить с цитированием
Старый 09.06.2012, 17:18   #6
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

evg_m, пробовал получать сразу готовый RichEdit - та же ошибка.
Код:
type TMyClass = class
private
  FParent:TWinControl;
public
  Elements:TCSSElementsList;
  constructor Create(AParent:TWinControl);
  procedure DoParse(AFile:String);
end;

...

constructor TMyClass.Create(AParent:TWinControl);
begin
FParent:=AParent; // EAccesViolation 
end;
Пепел Феникса, вызов:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var MC:TMyClass;
begin
MC:=TMyClass.Create('C:\file.txt');
// MC:=TMyClass.Create(Panel1);
// MC.RichEdit:=RichEdit1; - здесь та же ошибка, хотя RichEdit1 создан и находится на форме
end;

Последний раз редактировалось kettanaito; 09.06.2012 в 17:21.
kettanaito вне форума Ответить с цитированием
Старый 09.06.2012, 19:06   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
constructor TMyClass.Create(AParent:TWinControl );
Цитата:
MC:=TMyClass.Create('C:\file.txt');
Эти две строки между собой не согласуются! Так что вы не все нам рассказали.

Цитата:
// MC:=TMyClass.Create(Panel1);
Вот это похоже на правду. Но здесь комментарий!
Цитата:
// MC.RichEdit:=RichEdit1; - здесь та же ошибка, хотя RichEdit1 создан и находится на форме
Какая? Полный оригинальный текст.
И именно тот код, который был в программе с ошибкой.
При показе окна с ошибкой делаем Сtrl + C (копировать).
Потом в блокноте (или сразу в окне ответа) Ctrl +V (вставить).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.06.2012 в 19:08.
evg_m вне форума Ответить с цитированием
Старый 09.06.2012, 22:40   #8
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

evg_m, комментариями я выделил отдельные вариации кода, на которых выдают ошибки (чтобы не описывать по 10 раз один и тот же фрагмент).

Цитата:
Эти две строки между собой не согласуются! Так что вы не все нам рассказали.
Эти строки согласуются. Они представляют два варианта кода, которые выдают ошибки. Я отдельно попробовал тот и следующий случай (создание без указания значения AParent и с ним). Ошибка при первом случае происходит на месте FRichEdit.Parent:=AParent, на втором FParent:=AParent; (что соб-сно мало что меняет).

Ошибка:
Цитата:
Project cssparse_test.exe raised exception class EAccessViolation with message 'Access violation at address 0047E11C in module 'cssparse_test.exe'. Write of address 00000004'. Process stopped. Use Step or Run to continue.
Ошибка записи, как я упоминал, по определенному адресу, который соответствует этому месту:
Код:
constructor TMyClass.Create(AParent:TWinControl);
begin
FParent:=AParent;
{ И любому другому присвоению значений, будь-то FOwner:=AOwner или FRichEdit:=RichEdit1; }
end;
Пытаюсь понять почему здесь вообще существует ошибка, когда происходит элементарная запись значения в объявленную переменную..

Для полной ясности вот весь код:
Код:
// Исходный код с классом:
unit myclass;

interface

uses Classes, Controls, Dialogs, SysUtils, ComCtrls, SynMemo, StrUtils;

type TMyClass = class
private
  FParent:TWinControl;
public
  constructor Create(AParent:TWinControl);
  procedure DoParse(AFile:String);
end;

implementation

constructor TMyClass.Create(AParent:TWinControl);
begin
FParent:=AParent;
end;

// Исходный код с проектом, к которому подключен этот класс:
uses .., myclass;

...

procedure TForm1.Button1Click(Sender: TObject);
var CSSParse:TMyClass;
begin
CSSParse.Create(panel1); // panel1 - размещена на форме
end;

Последний раз редактировалось kettanaito; 09.06.2012 в 22:53.
kettanaito вне форума Ответить с цитированием
Старый 10.06.2012, 00:03   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
CSSParse := TMyClass.Create(panel1);
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 10.06.2012, 00:59   #10
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

veniside, кошмар, как я мог такое упустить Видимо заработался)
Спасибо
kettanaito вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ооп класс внутри класса Abuhamed PHP 2 02.04.2012 22:07
определение константы внутри класса(delphi) lowercase Помощь студентам 3 09.01.2012 01:36
Класс внутри класса Prontit Общие вопросы Delphi 16 07.10.2011 08:30
[Java] Создание объекта внутри объекта этогоже класса. Svarogich Помощь студентам 2 01.08.2011 16:03
Локальные хуки внутри класса Impuls1989 Общие вопросы Delphi 12 27.07.2010 20:47