Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.12;
Скачать: CL | DM;

Вниз

Загрузка StringList из буфера..   Найти похожие ветки 

 
pathfinder   (2006-10-24 11:13) [0]

Добрый день.

   Stream := TFileStream.Create(FileIn, fmOpenRead);
   Size := Stream.Size;
   GetMem(Buffer, Size);
   Stream.ReadBuffer(Buffer^, Size);

Подскажите, пожалуйста, как теперь загрузить данные из буфера в стринглист?


 
Dmitrij_K   (2006-10-24 11:18) [1]

StringList.LoadFromStream(Stream);
ку?


 
pathfinder   (2006-10-24 11:21) [2]

Т.е. содержимое буфера которое мы заполняем методом ReadBuffer и собственно Stream в LoadFromStream есть одно и то же?


 
Сергей М. ©   (2006-10-24 11:24) [3]


> Т.е. содержимое буфера которое мы заполняем методом ReadBuffer


Метод TStream.ReadBuffer не заполняет буфер, а читает из буфера


 
Джо ©   (2006-10-24 11:25) [4]

> [2] pathfinder   (24.10.06 11:21)
> Т.е. содержимое буфера которое мы заполняем методом ReadBuffer
> и собственно Stream в LoadFromStream есть одно и то же?

А вот ты посмотри на реализацию TStringList.LoadFromStream. Это несложно, достаточно, удерживая контрол, щелкнуть на TStringList в тексте программы.


 
Джо ©   (2006-10-24 11:27) [5]

> [3] Сергей М. ©   (24.10.06 11:24)
>
> > Т.е. содержимое буфера которое мы заполняем методом ReadBuffer
>
>
> Метод TStream.ReadBuffer не заполняет буфер, а читает из
> буфера

Нет, он пишет данные В буфер.


 
pathfinder   (2006-10-24 11:27) [6]


> Сергей М. ©   (24.10.06 11:24) [3]
>
> > Т.е. содержимое буфера которое мы заполняем методом ReadBuffer
>
>
> Метод TStream.ReadBuffer не заполняет буфер, а читает из
> буфера

мм.. "ReadBuffer (public)  Reads bytes from the stream into Buffer. " Borland® Copyright © 2005 Borland Software Corporation. All rights reserved.


 
Dmitrij_K   (2006-10-24 11:27) [7]


> Метод TStream.ReadBuffer не заполняет буфер, а читает из
> буфера

может вы ошибаетесь?
Reads bytes from the stream into Buffer.
???


 
pathfinder   (2006-10-24 11:29) [8]


> Dmitrij_K   (24.10.06 11:27) [7]
>
> > Метод TStream.ReadBuffer не заполняет буфер, а читает
> из
> > буфера
>
> может вы ошибаетесь?
> Reads bytes from the stream into Buffer.
> ???

тогда уж не я..а Borland)


 
Dmitrij_K   (2006-10-24 11:47) [9]

pathfinder
я не к вам обращался


 
pathfinder   (2006-10-24 12:08) [10]


> Dmitrij_K   (24.10.06 11:47) [9]
> pathfinder
> я не к вам обращался

да..это я невнимательно прочитал ваше сообщение..


 
pathfinder   (2006-10-24 12:18) [11]

Получается теперь чтобы загрузить данные из Buffer в  StringList надо создать новый поток MemoryStream, а потом уже из него делать    StringList.LoadFromStream(Stream)?


 
Dmitrij_K   (2006-10-24 12:21) [12]


> Получается теперь чтобы загрузить данные из Buffer в  StringList
> надо создать новый поток MemoryStream

Нет!
Можно из любого наследника Tsteam у кого есть метод Read()
напримет
TFileStream TMemoryStream


 
Джо ©   (2006-10-24 12:26) [13]

>
>
> [11] pathfinder   (24.10.06 12:18)
> Получается теперь чтобы загрузить данные из Buffer в  StringList
> надо создать новый поток MemoryStream, а потом уже из него
> делать    StringList.LoadFromStream(Stream)?

Откуда у тебя данные в Buffer появляются?


 
pathfinder   (2006-10-24 12:30) [14]

Аа..получается, что экземпляр TStream это как ссылка на какие-то данные, которые читаются из внешнего источника в буфер. А при использовании методаTStrings.LoadFromStream данные будут опять читаться из файла ассоциированного с экз. TFileStream. Как ReadBuffer, только не в буфер, а в стринглист..
А если я прочитал данные из файла в буфер, а потом изменил буффер

  Stream := TFileStream.Create(FileIn, fmOpenRead);
  Size := Stream.Size;
  GetMem(Buffer, Size);
  Stream.ReadBuffer(Buffer^, Size);

  Buffer:=Change(Buffer);

то как мне теперь загрузить в стринглист данные именно из Buffer, а не читать их опять из файла?


 
Dmitrij_K   (2006-10-24 12:36) [15]


> то как мне теперь загрузить в стринглист данные именно из
> Buffer

Без дополнительных преобразований никак


 
Dmitrij_K   (2006-10-24 12:38) [16]

var S:String;
SetString(S, Pointer(Buffer), Size);
StringList.SetTextStr(S);


 
Сергей М. ©   (2006-10-24 12:44) [17]


> Джо ©   (24.10.06 11:27) [5]


Да. согласен.
Заклинило меня что-то.


 
pathfinder   (2006-10-24 12:53) [18]


> Dmitrij_K   (24.10.06 12:38) [16]
> var S:String;
> SetString(S, Pointer(Buffer), Size);
> StringList.SetTextStr(S);

Это вместо LoadFromStream значит?
только вот на SetTextStr появляется undeclared identifier..


 
Dmitrij_K   (2006-10-24 12:55) [19]

тогда так
var S:String;
SetString(S, Pointer(Buffer), Size);
StringList.Test := S


 
Джо ©   (2006-10-24 12:55) [20]

> только вот на SetTextStr появляется undeclared identifier..

StringList.Text := S;


 
pathfinder   (2006-10-24 13:00) [21]

точно..заработало
 SetString(S, PChar(Buffer), Size);
 List.Text := S;


 
pathfinder   (2006-10-24 13:00) [22]

спасибо!


 
Dmitrij_K   (2006-10-24 13:05) [23]

офтоп
чё, всем в школе задали дом. задание по классу TStringList?


 
pathfinder   (2006-10-24 13:07) [24]

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


 
pathfinder   (2006-10-24 13:08) [25]

Или надо создавать новый поток и использовать метод TStrings.SaveToStream?


 
pathfinder   (2006-10-24 13:09) [26]


> Dmitrij_K   (24.10.06 13:05) [23]
> офтоп
> чё, всем в школе задали дом. задание по классу TStringList?
>

если бы в школе:)


 
Джо ©   (2006-10-24 13:09) [27]

Вот чего я еще в этой ветке не видел, так это объявления переменной Buffer.


 
Dmitrij_K   (2006-10-24 13:09) [28]


> а есть обратная процедура, чтобы измененные данные из стринглиста
> закатать назад в буфер?

StringList.Text - вот тебе буфер
или
StringList.SaveToStream


 
pathfinder   (2006-10-24 13:55) [29]

Тут суть такая:
var
 Stream  : TFileStream;
 Size    : integer;
 Buffer  : Pointer;
 List : TStringList;
 S   :String;
begin
1. читаю данные из файла в буфер
    Stream := TFileStream.Create(FileIn, fmOpenRead);
    Size := Stream.Size;
    GetMem(Buffer, Size);
    Stream.ReadBuffer(Buffer^, Size);
2. произвожу некоторые манипуляции с ними
    BUffer:=Change(Buffer);
3. Загружаю измененные данные в стринглист
     List:=TstringList.Create;
     SetString(S, PChar(Buffer), Size);
     List.Text := S;
4. произвожу опять некоторые манипуляции
5. Потом надо бы их скопировать в Buffer и произвести с ними манипуляции обратные тем, что были в п.2
6. Сохранить данные из буфера в файл.


 
pathfinder   (2006-10-24 14:20) [30]

делаю в п.5 следующее
     Stream2 := TMemorystream.Create;
     List.SaveToStream(Stream2);
     Size := Stream2.Size;
     GetMem(Buffer, Size);
     Stream2.ReadBuffer(Buffer^, Size);  <-здесь stream read error :(


 
Dmitrij_K   (2006-10-24 14:44) [31]

п5
String := StringList.Text;
CopyMemory(Buffer, @String[1], Size);


 
pathfinder   (2006-10-24 14:59) [32]

а что означает [1] после @string?
и почему не работает system.Move(@S[1], Buffer, Size);?


 
Anatoly Podgoretsky ©   (2006-10-24 15:02) [33]

Индексы у строковой переменной означают номер символа, это видишь ли массив символов.


 
pathfinder   (2006-10-24 15:21) [34]


> Индексы у строковой переменной означают номер символа, это
> видишь ли массив символов.

понял..это же указатель..на первый символ


 
pathfinder   (2006-10-24 15:24) [35]

и с Move понял..system.Move(S, Buffer, SizeOf(s));
а что лучше использовать CopyMemory или Move?


 
pathfinder   (2006-10-24 16:56) [36]

что-то никак не могу разобраться..
как сохранить стринглист в буффер
var
 List    : TStringlist;
 Buffer : Pointer;
 S       : string;
begin
   S := List.Text;
   Size := Sizeof(S);
   GetMem(Buffer, Size);
   CopyMemory(Buffer, @S[1], Size);

сохраняется только часть информации из стринглиста..что я не так делаю?


 
Amoeba ©   (2006-10-24 17:07) [37]

А что отладчик показывает относительно значения Size? На каком месте обрывается информация?


 
pathfinder   (2006-10-24 17:23) [38]

значение Size = 4 , в стринг листе 4 строки сохраняется только часть первой..


 
Dmitrij_K   (2006-10-24 19:17) [39]

не   Size := Sizeof(S);
а
  Size := Length(S);


 
pathfinder   (2006-10-24 19:45) [40]


> Dmitrij_K   (24.10.06 19:17) [39]
> не   Size := Sizeof(S);
> а
>   Size := Length(S);

спасибо!



Страницы: 1 2 вся ветка

Текущий архив: 2006.11.12;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.039 c
15-1161593916
Сатир
2006-10-23 12:58
2006.11.12
Free and nil


2-1161857520
Khabibulin
2006-10-26 14:12
2006.11.12
MailSlot


2-1161782928
vitv
2006-10-25 17:28
2006.11.12
lookup в гриде


1-1159807810
BadTester
2006-10-02 20:50
2006.11.12
Как горячими клавишами переключать пункты в MainMenu?


2-1161851146
dest81
2006-10-26 12:25
2006.11.12
access &amp; bde