Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как передать данные из TMemoryStream в динамический массив? [D6, XP]


Petrovich ©   (2007-11-28 13:58:00) 

Подскажите в чем ошибка. Delphi 6

Задача: в поток читается бинарный файл. Затем эти данные надо передать в динамический массив.

Var Stream1, Stream2 : TStream;
     Size                   : Integer;
     actual                : Integer;
     TestArray           : Array of Byte;

If not OpenDialog1.Execute
then
 Exit
else
 Begin
   Stream1:=TFilestream.Create(OpenDialog1.FileName,fmOpenRead);
   Stream2:=TMemoryStream.Create;
   Stream2.Clear;
   Stream2.LoadFromStream(Stream1);
   Stream2.Position:=0;
   Size:=Stream2.Size;

//Создаем динамический массив, с размером, равным считанному файлу
   SetLength(TestArray,Size);
// actual - дополнительная переменная для отладки. Используется в просмотрщике.
   actual:=Length(TestArray)*SizeOf(byte);
// В данном случае actual показывает реальный размер созданного массива

// Присваиваем адрес места размещения данных в потоке массиву.
  TestArray:=Stream2.Memory;
  actual:=Length(TestArray)*SizeOf(byte);
//Опа! Массив стал другого размера. И не факт, что там то, что надо.

 End;


Anatoly Podgoretsky   (2007-11-28 16:13:00) [1]

> Dennis I. Komarov  (28.11.2007 15:25:08)  [8]

А абстрагировать в состоянии

SizeOf(Type)

А то у тебя получится как получилось у любителей вместо Integer указывать цифровую программу.
А получилось с ними страшное, их программы прекратили работать при переходе на Д2 и выше.


Сергей М.   (2007-11-28 15:28:00) [2]


> TestArray:=Stream2.Memory;


Сам-то ты понял, что тем самым сказал ?


Dennis I. Komarov   (2007-11-28 15:25:00) [3]

> [7] Anatoly Podgoretsky ©   (28.11.07 15:18)

А я не говорил, что она не правильная, я говорил что она мне понравилась:

SizeOf(byte) => Считаем сколько байт занимает байт


Anatoly Podgoretsky   (2007-11-28 15:18:00) [4]


> Dennis I. Komarov ©   (28.11.07 14:58) [6]

Ты уверен, что сказал умную вещь?
Как раз эта часть у автора правильная, в отличии от того что выше.


Dennis I. Komarov   (2007-11-28 14:58:00) [5]

+ Мне еще вот это понравились:

> SizeOf(byte);


Dennis I. Komarov   (2007-11-28 14:57:00) [6]

> [4] KilkennyCat ©   (28.11.07 14:52)

Ну, его еще надо суметь отыскать. Чем спасибо сказать, лучше еще и повыпендриваться.


KilkennyCat   (2007-11-28 14:52:00) [7]


> Petrovich

Вам ответ дали. Или надо было еще поклоны отбить и пятки поцеловать?


Petrovich   (2007-11-28 14:47:00) [8]

Рамилю и Reindeer Moss Eater

Зубоскалить и ерничать большого ума не надо. Интеллекта, впрочем, тоже.

Это конференция для новичков.  Не способны дать ответ - лучше помолчите, за умных сойдете.


Рамиль   (2007-11-28 14:19:00) [9]

Stream1.Read(TestArray[0], Size);


> // Присваиваем адрес места размещения данных в потоке массиву.
>
>   TestArray:=Stream2.Memory;

До чего элегантное решение...


Reindeer Moss Eater   (2007-11-28 14:06:00) [10]

А сразу-то в массив читать прямо из файлстрима - не модно?


Наверх

Титульная страница Поиск, карта сайта Написать письмо