Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
alexan0308
61 / 45 / 4
Регистрация: 07.06.2011
Сообщений: 378
Записей в блоге: 2
#1

Глючит класс

25.04.2012, 20:45. Просмотров 358. Ответов 4
Метки нет (Все метки)

Создаю пробный класс, для опыта. Класс условного работника с полями имя, возраст, адрес, и свойство профессия. Свойство страшно глючит:
Delphi
1
2
3
4
5
6
7
8
9
10
11
type
worker = class(Tobject)
public
name : string;
Age : integer;
address : string;
Constructor Create(N:string; A:integer; address:string);
Function GetProf:string; // читать профессию чувака
Procedure SetProf(newProf:string); // записать профессию чуваку
property prof : string read GetProf write SetProf;
end;
Все как надо, описал процедуры
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function worker.GetProf:string;
begin
    GetProf:=self.prof;
end;
 
Procedure worker.SetProf(newProf:string);
begin
   prof:=newProf;
end;
 
Constructor worker.Create(N:string; A:integer; address:string);
begin
   self.name:= N;
   self.Age:= A;
   self.address:=address;
end;
Описываю действие кнопки
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button1Click(Sender: TObject);
var   W1 , W2 : Worker;
fam, add, prof : string; let : integer;
begin
          fam:=  'Иванов'; add:= 'г. Москва';  let:= 22;
          W1:=Worker.Create(fam, let, add);
 
          prof:='Программист';
          W1.SetProf(prof); // вот эта строка глючит
      //    prof:= W1.GetProf;
          Showmessage(prof);
 
          fam:=  'Петров'; add:= 'г. Ленинград';  let:= 21;
          W2:= Worker.Create(fam, let, add);
 
          W1.Free;
          W2.Free;
end;
Прога зависает при назначении профессии с сообщением о переполнении стека. В чом проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2012, 20:45
Ответы с готовыми решениями:

Программа глючит
Здравствуйте всем! Можете помочь с программой? Она у меня (на 2-х ядерном...

Сплитер глючит
Поставил сплитер между 2 формами он работает нормально, но есть одна проблема-...

Глючит XE4
Привет, у меня странные глюки с XE4 или это не глюк... при открытие проекта...

Поток слегка глючит
Сделал поток вручную по этому способу...

Постоянно глючит Delphi XE
Сегодня четыре раза переустановил себе Дельфи. Дело так: после два-три дня...

4
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25983 / 17424 / 6910
Регистрация: 22.10.2011
Сообщений: 30,668
Записей в блоге: 6
25.04.2012, 20:57 #2
Ну, у тебя ж бесконечная рекурсия: в SetProf ты устанавливаешь значение свойству prof, для установки которого вызывается SetProf, в которой ...

Все проще:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
type
worker = class(Tobject)
 
   FProf : string; // Тут хранится профессия
   Function GetProf:string; // читать профессию чувака
   Procedure SetProf(newProf:string); // записать профессию чуваку
 
public
   name : string;
   Age : integer;
   address : string;
   Constructor Create(N:string; A:integer; address:string);
   property prof : string read GetProf write SetProf; // Можно обойтись и без геттера/сеттера
end;
 
function worker.GetProf:string;
begin
    GetProf := FProf;
end;
 
Procedure worker.SetProf(newProf:string);
begin
   FProf := newProf;
end;
 
 
// Вызывать - так:
          prof:='Программист';
          W1.prof := prof;
          Showmessage(W1.prof);
1
alexan0308
61 / 45 / 4
Регистрация: 07.06.2011
Сообщений: 378
Записей в блоге: 2
26.04.2012, 16:24  [ТС] #3
Ок, попробую, только логику
Цитата Сообщение от UI Посмотреть сообщение
Ну, у тебя ж бесконечная рекурсия: в SetProf ты устанавливаешь значение свойству prof, для установки которого вызывается SetProf, в которой ...
я не понимаю
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
26.04.2012, 17:19 #4
alexan0308, у тебя в классе нет поля для хранения сведений о профессии. Происходит вот что. В классе есть свойство prof. При записи значения в это свойство вызывается метод SetProf(), а метод SetProf опять выполняет запись в это же свойство - т. е. в свойство prof:
Delphi
1
2
3
4
Procedure worker.SetProf(newProf:string);
begin
   prof:=newProf;
end;
Т. е., при записи значения в свойство prof вызвыается метод SetProf(), а этот метод опять записывает данные в свойство prof. А раз опять происходит запись в свойство prof, то, значит, опять вызывается метод SetProf(). А раз вызван SetProf(), то он опять пишет в свойство prof - и так до "бесконечности" - до тех пор, когда наступит переполнение стека и возникнет исключение.
---
Выше, UI написал, как решить эту проблему.
1
alexan0308
61 / 45 / 4
Регистрация: 07.06.2011
Сообщений: 378
Записей в блоге: 2
27.04.2012, 09:00  [ТС] #5
Кажется доходит логика класса. Переделал класс, сделал поле дата рождения, и свойство возраст (количество лет), которое определяется по этому полю. Такое построение вроде как больше отвечает духу класса.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
type
 
worker = class(Tobject)
public
name : string;
data_birth : string;
prof : string;
Constructor Create(Nam, pro, data : string);
Function GetAge:integer;
property Age : integer read GetAge;
private
function CalculateAge(Birthday, CurrentDate: TDate): Integer;
end;
 
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  W1 , W2 : Worker;
 
implementation
 
{$R *.dfm}
 
Function worker.GetAge:integer;
begin
    GetAge:=CalculateAge(StrToDate(self.data_birth), Date)
end;
 
 
Constructor worker.Create(Nam, pro, data : string);
begin
   self.name:= Nam;
   self.prof:= pro;
   self.data_birth:=data;
end;
 
// вычисляем возраст по дате рождения и текущей дате
function worker.CalculateAge(Birthday, CurrentDate: TDate): Integer;
var
  Month, Day, Year, CurrentYear, CurrentMonth, CurrentDay: Word;
begin
  DecodeDate(Birthday, Year, Month, Day);
  DecodeDate(CurrentDate, CurrentYear, CurrentMonth, CurrentDay);
 
  if (Year = CurrentYear) and (Month = CurrentMonth) and (Day = CurrentDay) then
  begin
    Result := 0;
  end
  else
  begin
    Result := CurrentYear - Year;
    if (Month > CurrentMonth) then
      Dec(Result)
    else
    begin
      if Month = CurrentMonth then
        if (Day > CurrentDay) then
          Dec(Result);
    end;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var fam, data, prof : string; let : integer;
begin
          fam:=  'Иванов';
          data:= '05.12.1985';
          prof:='Программист';
          W1:=Worker.Create(fam, prof, data);
 
          let:= W1.GetAge;
          Showmessage(inttostr(let));
 
          fam:=  'Степанов';
          data:= '12.06.1983';
          prof:='Инженер';
          W2:= Worker.Create(fam, prof, data);
 
          let:= W2.GetAge;
          Showmessage(inttostr(let));
          
          W1.Free;
          W2.Free;
end;
0
27.04.2012, 09:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2012, 09:00

ИСРП глючит ентер
Происходит какой то бред: жму в окне кода ентер, курсор перемещается вниз а...

Класс: Нужно написать класс,который будет вычислять заданную функцию...
Нужно написать класс,который будет вычислять вот такую функцию y= \sqrt{1/x^n}...

Глючит wsMaximized при наличии двух мониторов
Добрый день! Столкнулся с такой ситуацией: при наличии у пользователя двух...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru