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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2007, 19:02   #1
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
Восклицание проблемы с TFileStream

У меня опять проблемы с TFileStream. Почему, когда я записываю:

var
i,int:integer;
fs:TFileStream;
Str:string[255];
ms:TMemoryStream;
int6:int64;
begin
TPicture(TrVwObject.Items.Item[i].Data).Bitmap.SaveToStream(ms);
int6 := ms.Size;
fs.Write(int6, sizeof(int6));
fs.CopyFrom(ms,0);
end

эта картинка в файл записывается. А когда я считываю

fs.Read(str, sizeof(str));

fs.Read(int6, sizeof(int6));
ms.CopyFrom(fs, 0);
int6:=ms.Size;


Pic:=TPicture.Create;
Pic.Bitmap.LoadFromStream(ms);
with Form1.TrVwObject.Items.Add(nil, str) do
Data := Pic;

то в ms ничего нет!!! А картинка "равна нулю"
andrey4623 вне форума Ответить с цитированием
Старый 24.10.2007, 19:21   #2
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

Что-то ничего не получается
andrey4623 вне форума Ответить с цитированием
Старый 24.10.2007, 19:50   #3
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

а кто память будет выделять ?
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 26.10.2007, 20:07   #4
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

В смысле память выделять? под что?
andrey4623 вне форума Ответить с цитированием
Старый 26.10.2007, 20:30   #5
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Цитата:
Сообщение от andrey4623 Посмотреть сообщение
Что-то ничего не получается
А почему вы вторым параметром CopyFrom передаете 0? Этот параметр означает количество байт для копирования, начиная с позиции Position в потоке-источнике. Это во-первых. А во-вторых, почему просто не сделать SaveToFile/LoadFromFile?
Slovinsky вне форума Ответить с цитированием
Старый 26.10.2007, 20:37   #6
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Вообще лучше расскажите в какой последовательности вы хотите сохранять в файл данные, потому что из вашего кода это не совсем ясно. Если я правильно телепатировал и формат такой:
str - 256 байт
size - 8 байт
Picture - xxx байт
то непонятно зачем такие извращения? Или у вас файле хранится несколько таких структур?
Slovinsky вне форума Ответить с цитированием
Старый 26.10.2007, 20:53   #7
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

В общем, если несколько структур, то код примерно такой:

procedure SaveDataToFileStream(Fs: TFileStream; Bitmap: TBitmap; Name: String);
var
Ms: TMemoryStream;
Size: Integer;
begin
// Пишем длину имени
Size:=Length(Str);
Fs.WriteBuffer(Size,SizeOf(Integer) );
// Пишем само имя
Fs.WriteBuffer(PChar(Name)^,Size);
// Пишем данные
Ms:=TMemoryStream.Create;
try
Bitmap.SaveToStream(Ms);
Size:=Ms.Size;
// Сначала пишем длину данных
Fs.WriteBuffer(Size,SizeOf(Integer) );
// Теперь сами данные
Ms.Seek(0,soFromBeginning);
Fs.CopyFrom(Ms,Size);
finally
Ms.Free;
end;
end;

procedure LoadDataToFileStream(Fs: TFileStream; Bitmap: TBitmap; var Name: String);
var
Ms: TMemoryStream;
Size: Integer;
begin
// Читаем длину имени
Fs.ReadBuffer(Size,SizeOf(Integer)) ;
// Читаем само имя
SetLength(Name,Size);
Fs.ReadBuffer(PChar(Name)^,Size);
// Читаем данные
Ms:=TMemoryStream.Create;
try
// Читаем длину данных
Fs.ReadBuffer(Size,SizeOf(Integer)) ;
// Сами данные
Ms.CopyFrom(Fs,Size);
// Теперь загружаем их в Bitmap
Bitmap.LoadFromStream(Ms);
finally
Ms.Free;
end;
end;

Код в среде не проверял, писал на коленке. Если опечатался - исправьте.
Slovinsky вне форума Ответить с цитированием
Старый 26.10.2007, 20:56   #8
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Так и есть, опечатался как минимум один раз. Исправляюсь:

procedure LoadDataToFileStream(Fs: TFileStream; Bitmap: TBitmap; var Name: String);
var
Ms: TMemoryStream;
Size: Integer;
begin
// Читаем длину имени
Fs.ReadBuffer(Size,SizeOf(Integer)) ;
// Читаем само имя
SetLength(Name,Size);
Fs.ReadBuffer(PChar(Name)^,Size);
// Читаем данные
Ms:=TMemoryStream.Create;
try
// Читаем длину данных
Fs.ReadBuffer(Size,SizeOf(Integer)) ;
// Сами данные
Ms.CopyFrom(Fs,Size);
// Теперь загружаем их в Bitmap
Ms.Seek(0,soFromBeginning);
Bitmap.LoadFromStream(Ms);
finally
Ms.Free;
end;
end;
Slovinsky вне форума Ответить с цитированием
Старый 01.11.2007, 20:00   #9
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

Спасибо большое! 2 недели мучился, ничего не получалось - а тут все работает! respect вам, чуваки!!!
andrey4623 вне форума Ответить с цитированием
Старый 01.11.2007, 20:44   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Slovinsky Посмотреть сообщение
А почему вы вторым параметром CopyFrom передаете 0? Этот параметр означает количество байт для копирования, начиная с позиции Position в потоке-источнике. Это во-первых.
If Count is 0, CopyFrom sets Source position to 0 before reading and then copies the entire contents of Source into the stream.
Это из описания метода.
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с record,string,TFileStream AngelOfDeath Общие вопросы Delphi 6 31.05.2008 11:24
Передача функции TServerSocket и TFileStream dns-s Работа с сетью в Delphi 2 26.03.2008 21:15
сохранение изображения с TFileStream andrey4623 Общие вопросы Delphi 10 20.10.2007 20:28
Проблемы с DLL Дмитрий2006 Общие вопросы C/C++ 5 15.10.2007 12:43
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22