
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.172.111.47] |
![]() |
|
![]() |
|
|
Здравствуйте! как вернуть, переслать, отправить параметр из функции?
функция: ![]() ![]() function LoadFile(FileName: TFileName):string; var MemStr: TMemoryStream; Title,s: String; begin MemStr:= TMemoryStream.Create; try MemStr.LoadFromFile(FileName); MemStr.Seek(0, soFromBeginning); // Title := ReadStreamStr( MemStr ); finally MemStr.Free; end; end; кнопка ![]() ![]() ![]() procedure TForm1.Button1Click(Sender: TObject); begin LoadFile('test.txt'); end; как сделать так: ![]() ![]() ![]() procedure TForm1.Button1Click(Sender: TObject); begin LoadFile('test.txt'); memo1.Lines.LoadFromStream(MemStr); и label1.caption:=MemStr.size; end; |
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
Если надо вернуть параметр, тогда используйте var или out
![]() ![]() function LoadFile(FileName: TFileName; out MemStr: TMemoryStream):string; begin MemStr:= TMemoryStream.Create; try MemStr.LoadFromFile(FileName); MemStr.Seek(0, soFromBeginning); Result := ReadStreamStr(MemStr); except MemStr.FreeAndNil; end; end; |
![]() |
Сообщ.
#4
,
|
|
Цитата macomics @ FreeAndNil может тогда уж? ![]() |
Сообщ.
#5
,
|
|
|
Цитата Rouse_ @ Все равно. Он же ошибки не проверяет в коде. А так у него вылезет обращение к адресу $00000000 и будет долго тупить. FreeAndNil может тогда уж? |
Сообщ.
#6
,
|
|
|
Цитата leon2009 @ Здравствуйте! как вернуть, переслать, отправить параметр из функции? Могу ошибаться, но функция LoadFile не присваивает ничего переменной Result - соответсвенно, ничего не будет возвращено наружу Далее: MemStr является локальной переменной функции, но в обработчиках формы (второй вариант) к ней пытаются достучаться Третье: что если файл размером N гигабайт? Попытка прочитать его весь сразу никогда не сможет быть успешной. |
![]() |
Сообщ.
#7
,
|
|
macomicsдык а так у него вылезет AV по рандомному адресу и тупить придется с более хитрым числом
![]() По правильному делать надо так: ![]() ![]() except MemStr.FreeAndNil; raise; end; |
Сообщ.
#8
,
|
|
|
Цитата Rouse_ @ По правильному не стоит вообще злоупотреблять try except/finally end. У него это все описано в функции. Стоит просто вернуть статус неудачной загрузки файла в качестве результата работы функции, а не лепить кучу вложенных блоков try. По правильному делать надо так: |
![]() |
Сообщ.
#9
,
|
|
Так работает:
![]() ![]() function LoadFile(FileName: TFileName):TMemoryStream; var MemStr: TMemoryStream; Title,s: String; begin Result:= TMemoryStream.Create; try Result.LoadFromFile(FileName); Result.Seek(0, soFromBeginning); finally //Result.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin memo1.Lines.LoadFromStream(LoadFile('c:\Install.log')); end; Добавлено или вот так: ![]() ![]() Type TR = record MemStr:TMemoryStream; Size:int64; end; function LoadFile(FileName: TFileName):TR; begin Result.MemStr:= TMemoryStream.Create; try Result.MemStr.LoadFromFile(FileName); Result.MemStr.Seek(0, soFromBeginning); Result.size:=Result.MemStr.Size; finally end; end; procedure TForm1.Button1Click(Sender: TObject); Var TR1:TR; begin TR1:=LoadFile('c:\Install.log'); memo1.Lines.LoadFromStream(TR1.MemStr); label1.caption:=IntToStr(TR1.size); end; |
![]() |
Сообщ.
#10
,
|
|
А вообще проще memo скормить файл и получить длину через memo.GetTextLen чем городить огород с функцией которая должна в памяти держать файл
|
![]() |
Сообщ.
#11
,
|
|
Кстати а в моем примере будет утечка памяти если многократно вызывать функцию где есть TStream.Create и не освобождать ее?
Или нужно перед созданием проверять что она существует и удалять ее через free? Или при create она просто перепишется? |
Сообщ.
#12
,
|
|
|
Если вы не вызовите TR1.MemStr.Free тогда будет утечка памяти.
Это легко проверить если взять вашу программу и файл размером длиной ок. 64-512 кб и загружать его несколько раз. При это открыв Диспетчер задач вы наглядно увидите увеличение объема памяти у вашей программы. |