Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос по передаче объекта в процедуру / 10 сообщений из 10, страница 1 из 1
03.12.2021, 08:48
    #40116924
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
Запутался что-то, поясните.
Стало интересно. Навалял код.

Код: pascal
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.
type
  TMyClass = class(TObject)
  public
    FName: string;
  end;

  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure Proc(var AObject: TObject);
    function GetMyClass: TMyClass;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  MyObject: TObject;
begin
  Proc(MyObject);
  ShowMessage(TMyClass(MyObject).FName);
end;

function TForm2.GetMyClass: TMyClass;
var
  MyClass: TMyClass;
begin
  MyClass := TMyClass.Create;
  MyClass.FName := 'sss';
  Result := MyClass;
end;

procedure TForm2.Proc(var AObject: TObject);
begin
  AObject := GetMyClass;
end;

end.



Вопрос связан, с тем, что если заменить параметр Proc на
Код: pascal
1.
procedure TForm2.Proc(AObject: TObject); //без var



Получаю AV.

1. Все же что происходит, если в процедуру передаем ссылку на объект - var AObject: TObject?
2. Нет ли в приведенном коде утечки памяти?
...
Рейтинг: 0 / 0
03.12.2021, 09:04
    #40116928
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TForm2.Button1Click(Sender: TObject);
var
  MyObject: TObject;
begin
// почему бы не написать ФУНКЦИЮ
  MyObject := Proc();
  ShowMessage(TMyClass(MyObject).FName);
end;

function TForm2.GetMyClass: TMyClass;
var
  MyClass: TMyClass;
begin
  MyClass := TMyClass.Create;
  MyClass.FName := 'sss';
  Result := MyClass;
end;

function TForm2.Proc(): TObject;
begin
  Result:= GetMyClass;
end;
...
Рейтинг: 0 / 0
03.12.2021, 09:10
    #40116932
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
DimaBr, хочется с var разобраться.
А в вашем коде TMyClass(MyObject) разве не нужно уничтожать когда поработали с ним здесь?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TForm2.Button1Click(Sender: TObject);
var
  MyObject: TObject;
begin
// почему бы не написать ФУНКЦИЮ
  MyObject := nil;
  try
    MyObject := Proc();
    ShowMessage(TMyClass(MyObject).FName);
  finally
    FreeAndNil(MyObject);
  end;
end;



Правильно будет?
...
Рейтинг: 0 / 0
03.12.2021, 09:28
    #40116935
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
wsnet
хочется с var разобраться.

Если var, то этот объект, изменённый в процедуре Proc, будет виден вне этой процедуры. Если без var, то этот объект будет меняться внутри процедуры Proc, то наружу из неё не выйдет.
AV у вас не в процедуре Proc, а после, когда вы обращаетесь к объекту, которого нет.
...
Рейтинг: 0 / 0
03.12.2021, 09:33
    #40116936
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
Без var, указатеь MyObject ссылкается в призвольно место (у вас).
И ShowMessage естественно падает
...
Рейтинг: 0 / 0
03.12.2021, 09:35
    #40116937
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
goldmi45, DimaBr спасибо, а как удалить созданный MyClass: TMyClass?

Корректно ли будет?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TForm2.Button1Click(Sender: TObject);
var
  MyObject: TObject;
begin
// почему бы не написать ФУНКЦИЮ
  MyObject := nil;
  try
    MyObject := Proc();
    ShowMessage(TMyClass(MyObject).FName);
  finally
    FreeAndNil(MyObject);
  end;
end;
...
Рейтинг: 0 / 0
03.12.2021, 09:42
    #40116943
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
goldmi45
Если var, то этот объект, изменённый в процедуре Proc, будет виден вне этой процедуры. Если без var, то этот объект будет меняться внутри процедуры Proc, то наружу из неё не выйдет.

В случае с объектом var или нет - не важно. Объект (его свойства) можно менять и они никуда не денутся.
Это же касается только самой переменной, а не объекта (ссылки на него).
...
Рейтинг: 0 / 0
03.12.2021, 10:10
    #40116955
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
wadman
В случае с объектом var или нет - не важно. Объект (его свойства) можно менять и они никуда не денутся.
Это же касается только самой переменной, а не объекта (ссылки на него).

Только он сам объект в процедуре создаёт, а не его свойства меняет...
...
Рейтинг: 0 / 0
03.12.2021, 10:13
    #40116959
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
wsnet
2. Нет ли в приведенном коде утечки памяти?
Есть. Должно быть так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm2.Button1Click(Sender: TObject);
var
  MyObject: TObject;
begin
  MyObject := nil;  // Если proc не изменит ссылку
  try
    Proc(MyObject);
    ShowMessage(TMyClass(MyObject).FName);
  finally
    MyObject.Free;
  end;
end;


wsnet
Корректно ли будет?
Корректно. Но лучше так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm2.Button1Click(Sender: TObject);
var
  MyObject: TObject;
begin
  MyObject := Proc();
  try
    ShowMessage(TMyClass(MyObject).FName);
  finally
    MyObject.Free;
  end;
end;
...
Рейтинг: 0 / 0
03.12.2021, 11:36
    #40116975
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по передаче объекта в процедуру
alekcvp
wadman
В случае с объектом var или нет - не важно. Объект (его свойства) можно менять и они никуда не денутся.
Это же касается только самой переменной, а не объекта (ссылки на него).

Только он сам объект в процедуре создаёт, а не его свойства меняет...

Прошу прощения, не обратил на это внимание. :)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос по передаче объекта в процедуру / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]