Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с Object Pascal, помогите!!! [D5, Win2k]


beginner25 ©   (2002-07-31 11:52:00) 

Я только начал вникать в тонкости объектного программирования, поэтому очень прошу помочь решить одну проблему. Дело в следующем: программа просто тестовая; из главной формы должна вызываться дилоговая. Как я это делаю:

procedure TfmMain.ButtonShowDialog_Click(Sender: TObject);
var i: integer;
begin
fmDialog.Test := 100;
i := fmDialog.Test;
fmDialog.ShowModal;
end;


В диалоговой форме (fmDialog) код следующий:

.....
private { Private declarations }
function GetTest: Integer;
procedure SetTest(Value: Integer);
public { Public declarations }
property Test: Integer read GetTest write SetTest;
end;

.....
function TfmDialog.GetTest: Integer;
begin
Result := Test;
end;

procedure TfmDialog.SetTest(Value: Integer);
begin
Test := Value;
end;


Так вот, когда я нажимаю кнопку в главной форме, то Delphi виснет, а потом выходит сообщение "Stack overflow".
В чем проблема? Помогите!


MBo   (2002-07-31 12:42:00) [1]

>фразу "должна быть описана реакция объекта на изменение его свойства
например, при изменении шрифта (в SetFont...) надо перерисовать.


Beginner25   (2002-07-31 12:36:00) [2]


> ЮЮ (31.07.02 12:32)
> Если в них стоит не один оператор, а некая последовательность.
> Так GetXXX может брать Result не из переменной, а вычислять,
> или возвращать свойство внутреннего объекта, a в WriteXXX
> должна быть описана реакция объекта на изменение его свойства,
> а иначе что же это за свойство, если его изменение никак
> не влияет на объект???


ЮЮ, поясни пожалуйста фразу "должна быть описана реакция объекта на изменение его свойства". Можно маленький примерчик?


ЮЮ   (2002-07-31 12:32:00) [3]

Если в них стоит не один оператор, а некая последовательность.
Так GetXXX может брать Result не из переменной, а вычислять, или возвращать свойство внутреннего объекта, a в WriteXXX должна быть описана реакция объекта на изменение его свойства, а иначе что же это за свойство, если его изменение никак не влияет на объект???


Beginner25   (2002-07-31 12:30:00) [4]

Все, вопрос снят, понял что к чему! Большое спасибо!


beginner25   (2002-07-31 12:20:00) [5]

SP © (31.07.02 11:56)
Property Test, в данном случае, лучше объявить так:
property Test: Integer read FTest write FTest

Так-то япробовал и все конечно работает нормально, но в каких случаях тогда надо использовать именно function Get... и procedure Set...? И как правильно их использовать?


kull   (2002-07-31 11:59:00) [6]

правильно так:

procedure TfmDialog.SetTest(Value: Integer);
begin
FTest := Value;
end;


Alx2   (2002-07-31 11:59:00) [7]

Вызываешь сам себя из GetTest, Result := Test приводит к вызову Result := GetTest


ЮЮ   (2002-07-31 11:57:00) [8]

function TfmDialog.GetTest: Integer;
begin
Result := Test; //Данный оператор вызывает опять GetTest
end;
procedure TfmDialog.SetTest(Value: Integer);
begin
Test := Value; //Данный оператор вызывает опять SetTest
end;
Надо,Result := FTest; FTest := Value; где FTest - переменная в одной из секций TfmDialog


SP   (2002-07-31 11:56:00) [9]

В процедуре SetTest происходит повторное присваивание значения. Это повторяется до пока не переполнится стек.

Property Test, в данном случае, лучше объявить так:
property Test: Integer read FTest write FTest


Наверх

Титульная страница Поиск, карта сайта Написать письмо