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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2010, 13:21   #1
Дима я
Форумчанин
 
Регистрация: 06.06.2009
Сообщений: 259
По умолчанию ООП.В чем ошибка

Чето не доходит до меня как правильно в классах обращаться к компонентам..
Вот содаю класс
Код:
op=class
public
Edit1: TEdit;                              ***описываю Edit
  Constructor Create(o:integer);   
end;


constructor op.Create(o: integer);
begin
edit1.Text:=IntToStr(o);                ***Тело конструктора
end;


procedure TForm1.Button1Click(Sender: TObject);
var
l:op;
begin
l.Edit1:=Edit1;
l.Сreate(Random(1000));                     ***Вызываю конструктор в кнопке
end;
Все ли я правильно сделал?
Работает но когда закрываешь программу вылазеит ошибка длинная,что то в модуле Project
Если я тебе помог Ты бы + влепить мне мог.
Дима я вне форума Ответить с цитированием
Старый 04.05.2010, 13:28   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

неплохо бы написать что за ошбка, рас уж не смог перевести..
Человек_Борща вне форума Ответить с цитированием
Старый 04.05.2010, 14:00   #3
Дима я
Форумчанин
 
Регистрация: 06.06.2009
Сообщений: 259
По умолчанию

Exception EAccessViolation in module Project2.exe at 000135AA.
Access violation at address 004135AA in module 'Project2.exe'.Read of address 00000008.
Если я тебе помог Ты бы + влепить мне мог.
Дима я вне форума Ответить с цитированием
Старый 04.05.2010, 14:05   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Все правильно. Edit это класс и следовательно тоже нуждается в создании.
Код:
constructor op.Create(Sender: TObject; o: integer);
begin
     Inherited Create;
     Edit1:=TEdit.Create(Sender);
     edit1.Text:=IntToStr(o);                ***Тело конструктора
end;
Соответственно и в интерфейсной части поправьте. Sender - где рисоваться объекту.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
l:op;
begin
l.Сreate(Random(1000), Self);                     ***Вызываю конструктор в кнопке
end;
Self - я . То есть Form1 требует, чтобы Edit рисовался на Form1.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 04.05.2010 в 14:08.
Utkin вне форума Ответить с цитированием
Старый 04.05.2010, 14:38   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

вот то что должно было быть
Код:
//Top=class // правило хорошего тона названия типов начинать с 
ЗАГЛАВНОЙ буквы T
(TOP не очень хорошее название для класса путается с form.top )
// еще правило не использовать совпадающие имена 
TopMy=class
private
  fEditOP: TEdit; //еще одно правило имена полей начинать с  прописной f
public
  Constructor Create(ed: TEdit);
  propcedure SetInteger(o:integer);   
end;


constructor Topmy.Create(ed: TEdit);
begin
  fEditOP:=ed;
end;

procedure Topmy.SetInteger(o: integer);
begin
  feditOP.text:=inttostr(o);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
l:TopMy;
begin
  l:=TopMy.Create(edit1); /создаю объект типа OP для дальнейшего использования запоминаю его в переменной l
// fEditOP:=ed; в конструкторе запоминаю с каким компонентом будет работать наш экземпляр      
 l.setInteger(Random(1000)); 
//  feditOP.text:=inttostr(o); в указанный компонент вывожу заданное значение
  l.Free; //если объект больше не нужен то освобождаем память
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.05.2010 в 14:49.
evg_m вне форума Ответить с цитированием
Старый 04.05.2010, 14:39   #6
Дима я
Форумчанин
 
Регистрация: 06.06.2009
Сообщений: 259
По умолчанию

А что делает
Inherited Create; ??
Если я тебе помог Ты бы + влепить мне мог.
Дима я вне форума Ответить с цитированием
Старый 04.05.2010, 14:41   #7
Дима я
Форумчанин
 
Регистрация: 06.06.2009
Сообщений: 259
По умолчанию

Спасибо))))))))))
Если я тебе помог Ты бы + влепить мне мог.
Дима я вне форума Ответить с цитированием
Старый 04.05.2010, 14:46   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Дима я Посмотреть сообщение
А что делает
Inherited Create; ??
Создает предка для твоего класса. Обычно используется если ты наследуешься не от TObject. А скажем от того же TEdit. Он тоже имеет свои поля и ему их нужно инициализировать. Этой командой ты даешь ему такую возможность. Именно поэтому она обычно самая первая в конструкторе. Ну а далее, когда твой предок создан, можешь уже инициализировать свои поля.

ЗЫ. Программирование по посту #5 противопоказано - твой класс не сможет жить без данной формы, это равносильно как прописывать все действия в самой форме, не используя класс. Правила хорошего тона говорят о том, что класс должен быть максимально автономен от остальных элементов программы. В твоем случае вполне возможно создать такой TopMy, который бы работал с любой формой. И даже не с формой, а с любым объектом, имеющим клиентскую область (где могут рисоваться компоненты).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 04.05.2010 в 14:50.
Utkin вне форума Ответить с цитированием
Старый 04.05.2010, 14:49   #9
Дима я
Форумчанин
 
Регистрация: 06.06.2009
Сообщений: 259
По умолчанию

Понял спасибо
Если я тебе помог Ты бы + влепить мне мог.
Дима я вне форума Ответить с цитированием
Старый 04.05.2010, 15:05   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
ЗЫ. Программирование по посту #5 противопоказано - твой класс не сможет жить без данной формы
constructor op.Create(Sender: TObject; o: integer);
begin
Inherited Create;
Edit1:=TEdit.Create(Sender);
edit1.Text:=IntToStr(o); ***Тело конструктора
end;

аналогично храним ссылку на внешний компонент TEdit.Create(Sender)
настолько же опасно как и
Код:
constructor Topmy.Create(ed: TEdit);
begin
  fEditOP:=ed;
end;
используется ОДИНАКОВО ВНЕШНИЙ объект edit Edit.owner=Form1
в любом случае легко решается изменением базового класса Tobject на Tcomponnt
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП.Ошибка в манипуляторах And_DaviD Общие вопросы C/C++ 13 12.02.2010 23:42
ООП:Ошибка при компиляции в C++Builder RABERT C++ Builder 1 19.12.2009 20:36
В чем ошибка? Beka Помощь студентам 11 25.11.2009 15:36
Паскаль ООП. Примеры программ с использованием ООП SeЯgey Помощь студентам 5 13.05.2009 21:55