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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2011, 21:07   #1
onkofe
 
Регистрация: 04.02.2010
Сообщений: 5
По умолчанию Изменение переменной в процедуре

Делаю так
Код:
procedure TForm1.Test(var X1: TstringList);
begin
  Memo1.Lines.Add(#13#10+' В функции было '+ IntToStr(X1.Count));
  X1.Delete(0);
  Memo1.Lines.Add(' В функции стало '+ IntToStr(X1.Count)+#13#10);
end;

procedure TForm1.Button1Click(Sender: TObject);
var x: Integer;
    List1: TStringList;
begin
  List1:= TStringList.Create;
  try
    for x:=0 to 10 do List1.Add(IntToStr(x));
    Memo1.Lines.Add('Всего было '+ IntToStr(List1.Count));
    Test(List1);
    Memo1.Lines.Add('Всего стало '+ IntToStr(List1.Count));
  finally
    List1.Free;
  end;
end;
Получаю:
Код:
Всего было 11

 В функции было 11
 В функции стало 10

Всего стало 10
Пробовал вот так
Код:
procedure TForm1.Test(X1: TstringList);
но не помогает (

Почему из первоначального TStringList удаляется строка и как сделать чтобы не удалялась?

Последний раз редактировалось onkofe; 06.11.2011 в 21:13.
onkofe вне форума Ответить с цитированием
Старый 06.11.2011, 21:13   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
X1.Delete(0);
вот и удаляется.
и var там не надо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.11.2011, 21:15   #3
onkofe
 
Регистрация: 04.02.2010
Сообщений: 5
По умолчанию

И как быть тогда?
Ведь наверное если бы я хотел удалить строку из List1, я бы не стал вызывать для этого функцию Test()

Последний раз редактировалось onkofe; 06.11.2011 в 21:20.
onkofe вне форума Ответить с цитированием
Старый 06.11.2011, 21:20   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам надо чтоб передалась компия объекта?
руками создавайте копию, и через Assign сравняйте их(для TStrings(и потомков) работает)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.11.2011, 21:23   #5
onkofe
 
Регистрация: 04.02.2010
Сообщений: 5
По умолчанию

я изучаю различие в передачи параметров в функцию

procedure TForm1.Test(X1: TstringList);
procedure TForm1.Test(var X1: TstringList);
procedure TForm1.Test(out X1: TstringList);
procedure TForm1.Test(const X1: TstringList);
onkofe вне форума Ответить с цитированием
Старый 06.11.2011, 21:31   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы бы сначало изучили что такое объекты(class) и как они хранятся.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.11.2011, 21:50   #7
onkofe
 
Регистрация: 04.02.2010
Сообщений: 5
По умолчанию

В книге черным по белому написано что при передаче по значеню значение аргументов копируется и на этом связь между аргументами и переменными разрывается.
Но как видим на деле ничего подобного не происходит...
onkofe вне форума Ответить с цитированием
Старый 06.11.2011, 21:52   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

объекты хранятся по указателю на данные, потому копируется этот указатель.
объекты это вам не рядовая переменная.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.11.2011, 22:04   #9
onkofe
 
Регистрация: 04.02.2010
Сообщений: 5
По умолчанию

то есть только таким образом?

Код:
procedure TForm1.Test(X1: TstringList);
var Test: TStringList;
begin
  Test:= TStringList.Create;
  Test.Assign(X1);
  Memo1.Lines.Add(#13#10+' В функции было'+ IntToStr(Test.Count));
  try
    Test.Delete(0);
    Memo1.Lines.Add(' В функции стало'+ IntToStr(Test.Count)+#13#10);
  finally
    Test.Free;
  end;
end;
onkofe вне форума Ответить с цитированием
Старый 06.11.2011, 22:44   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

да, правда тут особо смысла нет, но по крайней мере исходный обьект не меняется.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение переменной в Timer Welotirit Общие вопросы Delphi 6 13.03.2011 19:27
Изменение переменной Алексей_xXx Общие вопросы C/C++ 1 11.12.2009 10:49
преобразование переменной AnsiString в PAnsiChar для использования в процедуре loadlibrary The Best Общие вопросы Delphi 2 12.07.2009 20:42
Изменение переменной Ant1Player PHP 8 30.03.2009 22:07
Изменение переменной yura-cat Помощь студентам 7 20.09.2008 17:42