Внимательнее со строками!
Когда-то, очень давно, я не мог понять, почему код, подобный тому, что ниже, возвращал не правильный результат:
function GetText: string;
begin
Result := Result + '...';
end;
procedure TForm1.FormCreate(Sender: TObject);
var
lStr: string;
Idx: Integer;
begin
lStr := 'Text';
for Idx := 1 to 3 do
lStr := lStr + '.';
Label1.Caption := lStr;
lStr := GetText;
Label2.Caption := lStr;
end;
Как по вашему, что будет в Label2? Если вы думаете, что там будет '...', то вы сильно ошибаетесь, как и я в то время.
В Label2 будет 'Text......' и вот почему: Result в функциях, это не локальная переменная, а параметр-переменная, т.е.
function GetText: string;
идентична
procedure GetText(var Result: string);
Далее еще интереснее. В связи с тем, что мы присваиваем значение функции определенной переменной, эта-же переменная передается в функцию, т.е. фактически мы имеем следующий вызов:
lStr := GetText(lStr);
Теперь понятно, почему мы получаем существующий результат?
P.S.: кстати, данная проблема (точнее, "неявность"), давно известна. Например в книге А.Б. Григорьева на странице 444 она хорошо описана. Жаль у меня не было этой книги тогда, но сейчас есть =). Советую преобрести - там очень большой и полезный раздел по сокетам.
+2