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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2010, 00:51   #1
Gumer
Пользователь
 
Регистрация: 16.01.2010
Сообщений: 43
По умолчанию tstrings.loadfromstream

Вот имеется такой код.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var ms:TMemoryStream;
    st:TStrings;
begin
ms:=tmemorystream.create;
st:=tstringlist.create;

//1
idhttp1.Get('http://bestgames.moy.su/test.txt',ms);
st.LoadFromStream(ms);
if st.count>0 then
 showMessage(st.Strings[0]);

st.Free;
ms.Free;

ms:=tmemorystream.create;
st:=tstringlist.create;

//2
ms.LoadFromFile('test.txt');
st.loadfromstream(ms);
if st.count>0 then
 showMessage(st.strings[0]);

st.Free;
ms.Free;
end;
В первом случае ничего не выскакивает, во втором - первая строка из файла (все как надо), хотя файл из интернета и на компьютере абсолютно одинаковые.

Почему так и как это исправить?
Gumer вне форума Ответить с цитированием
Старый 01.07.2010, 08:16   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А не проще ли:
Код:
st.text:=idhttp1.Get('http://bestgames.moy.su/test.txt');
if st.count>0 then
 showMessage(st.Strings[0]);
Или тебе принципиально с Stream классами работать нужно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2010, 14:01   #3
Gumer
Пользователь
 
Регистрация: 16.01.2010
Сообщений: 43
По умолчанию

Проще, спасибо!

Но все равно момент непонятный, хотелось бы разобраться.
Gumer вне форума Ответить с цитированием
Старый 01.07.2010, 14:47   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
хотелось бы разобраться.
Там какой-то прикол с Стримами. Вообще они достаточно криво работают...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2010, 15:35   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

ms.SaveToFile и проверить, может оно вообще не загружает ничего. И st:TStringList для надёжности
пыщь

Последний раз редактировалось JTG; 01.07.2010 в 15:42.
JTG вне форума Ответить с цитированием
Старый 01.07.2010, 16:23   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
хотя файл из интернета и на компьютере абсолютно одинаковые.
но кто сказал что файл БЫЛ получен.

Код:
idhttp1.Get('http://bestgames.moy.su/test.txt',ms);
//ЗДЕСЬ надо проверить что файл был получен
st.LoadFromStream(ms);
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 01.07.2010, 18:36   #7
Gumer
Пользователь
 
Регистрация: 16.01.2010
Сообщений: 43
По умолчанию

Я сначала через файлы и работал, но потом увидел, что это можно сделать через Stream.

Код:
idhttp1.Get('http://bestgames.moy.su/test.txt',ms);
ms.SaveToFile('test2.txt');
st.LoadFromFile('test2.txt');
Вот так работает.

И вот еще:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var ms:TMemoryStream;
    st:TStrings;
begin
ms:=tmemorystream.create;
st:=tstringlist.create;

//1
idhttp1.Get('http://bestgames.moy.su/test.txt',ms);
st.LoadFromStream(ms);
if st.count>0 then
 showMessage(st.Strings[0]);

//отсюда я убрал ms.free (см. первое сообщение)

//2
ms.LoadFromFile('test.txt');
st.loadfromstream(ms);
if st.count>0 then
 showMessage(st.strings[0]);

st.Free;
ms.Free;
end;
Выдает только одно сообщение, из второго случая, наверное, и выдает "ue", хотя в файле 3 строки:
red
green
blue

Должно и выскакивало сообщение "red".

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

а кто после загрузки будет смещать позицию потока в ноль?
Цитата:
idhttp1.Get('http://bestgames.moy.su/test.txt',ms);
ms.Position:=0;
st.LoadFromStream(ms);
это дырка ИнДи, они забыли это сделать...

а при загрузке с файла позиция восстанавливается.
Цитата:
Вообще они достаточно криво работают...
пока не увижу аргументов не поверю
тысячи раз с ними работал, и все ровно
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.07.2010, 20:05   #9
MMM_Corp
Пользователь
 
Регистрация: 24.03.2010
Сообщений: 17
По умолчанию

потоки - отлично работаюь, не надо ля-ля...

а где тут:
Цитата:
Position:=0;
компилятор сам будет ставить ?
MMM_Corp вне форума Ответить с цитированием
Старый 05.07.2010, 10:00   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
тысячи раз с ними работал
Значит мне не везло, но глюков я нахватался при работе с потоками
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с TStrings GBAXA Общие вопросы Delphi 1 30.06.2010 21:15
Length и TStrings k1r1ch Общие вопросы Delphi 5 24.06.2009 14:52
LoadFromStream из оперативной памяти - возможно ли? Олвин Общие вопросы Delphi 3 17.04.2009 16:23
Почему после передачи tStream методами Indy не работает tBitmap.loadFromStream ? Altera Работа с сетью в Delphi 2 21.03.2009 15:35
Функции и TStrings tebeen Паскаль, Turbo Pascal, PascalABC.NET 7 18.09.2007 20:09