Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Почему No value?


Автор: Gnusss 20.5.2005, 23:03
Привет всем!
Например есть у меня процедура подобная этой:
Код

procedure Fun(Const Val; R: String);
var
 Ms: TMemoryStream;
begin
 Ms:= TMemoryStream.Create;
 Ms.WriteBuffer(Val,SizeOf(Val));
 Ms.Position:= Ms.Size;
 Ms.Free;
 if R = '' then
  R:= ' ';
end;
Я делаю например так:
Код

Fun('Hello!','World!');
// Или так:
Fun(Buff,'World!'); // Buff - Структура типа TRecord

Но в процедуре Fun Val всегда "(No value)".
Почему? Я вообще не понимаю.

Заранее спасибо за ответ!

Автор: SPrograMMer 20.5.2005, 23:15
Gnusss
Цитата(Gnusss @ 20.5.2005, 23:03)
Код

procedure Fun(Const Val; R: String);

должно быть
Код

procedure Fun(VAR Val; R: String);

Автор: Gnusss 20.5.2005, 23:18
to SPrograMMer
неа у меня все равно "(No value)" smile

Автор: Fantasist 20.5.2005, 23:35
Цитата(Gnusss @ 20.5.2005, 20:18)
неа у меня все равно "(No value)" smile


Ну так отладчик же не знает тип этой переменной, что он тебе отображать должен?

Нажми Ctrl+F7, напиши там "PChar(@Val)" и любуйся. smile

Автор: Rouse_ 21.5.2005, 01:45
Цитата(Fantasist @ 21.5.2005, 00:35)
Нажми Ctrl+F7, напиши там "PChar(@Val)" и любуйся.

Занимательно... У нас за такое сразу увольняют.

Цитата(Gnusss @ 21.5.2005, 00:18)
неа у меня все равно "(No value)" 

Видимо ты забыл про банальное приведение типов. Вот смотри сюда:
Код

procedure Fun(var Val; R: String);
var
 Ms: TMemoryStream;
begin
 Ms:= TMemoryStream.Create;
 Ms.WriteBuffer(BOOL(Val),SizeOf(BOOL(Val)));
 Ms.Position:= Ms.Size;
 Ms.Free;
 if R = '' then
  R:= ' ';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  A: BOOL;
begin
  A:= True;
  Fun(A, 'World!');
end;

А теперь вопрос, каким макаром ты хочешь реальзовать правильное выполнение своей процедуры без обязательной передачи указателя типа данных?

Автор: Gnusss 21.5.2005, 08:36
Цитата(Rouse_ @ 21.5.2005, 01:45)
А теперь вопрос, каким макаром ты хочешь реальзовать правильное выполнение своей процедуры без обязательной передачи указателя типа данных?

Таким же как работает Write у Stream и SendBuffer у TIdUDPClient.
И к тому же в процедуру я передаю РАЗНЫЕ(!) структуры типа TRecord.

Автор: p0s0l 21.5.2005, 12:31
Цитата(Rouse_ @ 21.5.2005, 01:45)
Занимательно... У нас за такое сразу увольняют.
Объясни, что тут такого ужасно неправильного, за что можно сразу уволить ?
Я бы также сделал, если бы знал, что в параметре передаётся строковая константа...

Автор: помогите 21.5.2005, 19:59
Ну люди. проблема же еще не рашина.

Автор: Fantasist 22.5.2005, 00:14
Цитата(Rouse_ @ 20.5.2005, 22:45)
Занимательно... У нас за такое сразу увольняют.


Че, за польлзование отладчиком у вас увольняют? Не, я к вам работать не пойду. smile

Цитата
Ну люди. проблема же еще не рашина.


Почему?

Автор: Гость_Gnusss 22.5.2005, 07:10
Цитата(Fantasist @ 22.5.2005, 00:14)
Почему?

Ну, потому - что моя процедура все еще не работает.
У меня в эту процедуру передаются разные структуры типа TRecord. Как я эту могу ему указать?

Автор: Fantasist 22.5.2005, 19:53
Цитата
Ну, потому - что моя процедура все еще не работает.


Ну так а в чем заключается ее "не работает"? Ту процедуру что ты привел вообще никаких результатов видимых не оставляет (пишишь что-то в память и освобождаешь сразу же). Почему отладчик "no value" показывает уже объяснили.

Единственно что не будет работать это SizeOf(Val) - тип Val неизвестен, по этому SizeOf будет всегда возвращать 0.

Цитата
У меня в эту процедуру передаются разные структуры типа TRecord. Как я эту могу ему указать?


Вот так:
Код

procedure Fun(Const Val:TRecord; R: String);


Автор: Gnusss 22.5.2005, 22:20
Цитата(Fantasist @ 22.5.2005, 19:53)
Ту процедуру что ты привел вообще никаких результатов видимых не ...

Вобщето это процежура для примера, в реальном приложении у меня другая.
Цитата(Fantasist @ 22.5.2005, 19:53)
очему отладчик "no value" показывает уже объяснили

Ну это я понял. smile
Цитата(Fantasist @ 22.5.2005, 19:53)
Вот так:
Код

procedure Fun(Const Val:TRecord; R: String);

Неа, или ты мне предлагаеш вместо TRecord написать тип моих структур?
Тогда у меня в приложении будет где-то 15+ почти одинаковых(только каждая под свою структуру) процедур.

Автор: SPrograMMer 22.5.2005, 23:50
Цитата(Gnusss @ 22.5.2005, 22:20)
Тогда у меня в приложении будет где-то 15+ почти одинаковых(только каждая под свою структуру) процедур

ну тада прямой путь к ООП, написать "класс" родитель, а отнего клепать производные, Тип параметра в самой подпрограмме будет родительский

"класс" в кавычках, потому как я поонимаю он просто будетсодержать ТОЛЬКО данные <=> записи, но с расширенными возможностями! smile

Автор: Gnusss 23.5.2005, 00:52
Меня осенило!!! smile
Я все думал почему Write у Stream работает, а у меня вроде тоже самое а не работает.
И вдруг меня осенило Второй параметр у Write это размер(!), и я понял что надо передавать в процедуру еще и размер. Изменив процедуру, у меня все заработало(!). Ура товарищи smile
И не пришлось создавать много одинаковых процедур и прибегать а ООП.
Всем спасибо! Тема закрыта!

Автор: Fantasist 23.5.2005, 01:36
Gnusss Хорошо, но в следующий раз постарайся вопрос формулировать так, чтобы и нам было понятно, что тебе нужно, если конечно хочешь ответ на свой вопрос получить, а не на какие-то другие, как здесь и случилось.




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)