powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос по передаче объекта в процедуру
10 сообщений из 10, страница 1 из 1
Вопрос по передаче объекта в процедуру
    #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
Вопрос по передаче объекта в процедуру
    #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
Вопрос по передаче объекта в процедуру
    #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
Вопрос по передаче объекта в процедуру
    #40116935
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
хочется с var разобраться.

Если var, то этот объект, изменённый в процедуре Proc, будет виден вне этой процедуры. Если без var, то этот объект будет меняться внутри процедуры Proc, то наружу из неё не выйдет.
AV у вас не в процедуре Proc, а после, когда вы обращаетесь к объекту, которого нет.
...
Рейтинг: 0 / 0
Вопрос по передаче объекта в процедуру
    #40116936
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без var, указатеь MyObject ссылкается в призвольно место (у вас).
И ShowMessage естественно падает
...
Рейтинг: 0 / 0
Вопрос по передаче объекта в процедуру
    #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
Вопрос по передаче объекта в процедуру
    #40116943
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
Если var, то этот объект, изменённый в процедуре Proc, будет виден вне этой процедуры. Если без var, то этот объект будет меняться внутри процедуры Proc, то наружу из неё не выйдет.

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

Только он сам объект в процедуре создаёт, а не его свойства меняет...
...
Рейтинг: 0 / 0
Вопрос по передаче объекта в процедуру
    #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
Вопрос по передаче объекта в процедуру
    #40116975
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
wadman
В случае с объектом var или нет - не важно. Объект (его свойства) можно менять и они никуда не денутся.
Это же касается только самой переменной, а не объекта (ссылки на него).

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

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


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