Главная страница
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);

спасибо!


 
pathfinder   (2006-10-24 20:12) [41]

столкнулся еще и с такой проблемой, что при попытке загрузить в стринглист текст. файла большого размера > 1 мб в стринглисте оказывается только несколько каких-то символов.. А у стринглиста есть ограничение на количество символов или строк?


 
pathfinder   (2006-10-24 20:18) [42]

хотя почему-то чисто текстовый файл больше 7 мб (250000 строк) загрузился, а WindowsUpdate.log чуть больше мегабайта - нет.. Может это связано с какими-то служебными символами..


 
Сергей М. ©   (2006-10-25 08:32) [43]


> у стринглиста есть ограничение на количество символов или
> строк?


Есть. Но в дан.случае оно тебя не касается.


> WindowsUpdate.log чуть больше мегабайта - нет


WindowsUpdate.log - не чисто текстовый файл (содержит и текстовые и бинарные данные), потому и возникла с ним проблема.


 
Сергей М. ©   (2006-10-25 08:36) [44]

Пример гекс-дампа этого файла:

001526E0:  65 3A 20 53 65 72 76 69 &#9474; 63 65 20 65 78 69 74 20   e: Service exit
001526F0:  5B 45 78 69 74 20 63 6F &#9474; 64 65 20 3D 20 30 78 32   [Exit code = 0x2
00152700:  34 30 30 30 31 5D 0D 0A &#9474; 32 30 30 36 2D 30 34 2D   40001]&#9834;&#9689;2006-04-
00152710:  30 34 09 31 31 3A 31 33 &#9474; 3A 30 34 09 20 39 33 36   04&#9675;11:13:04&#9675; 936
00152720:  09 33 31 30 09 53 65 72 &#9474; 76 69 63 65 09 2A 2A 2A   &#9675;310&#9675;Service&#9675;***
00152730:  2A 2A 2A 2A 2A 2A 2A 2A &#9474; 2A 2A 0D 0A 00 00 00 00   **********&#9834;&#9689;
00152740:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
00152750:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
00152760:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
00152770:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
00152780:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
00152790:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
001527A0:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
001527B0:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
001527C0:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
001527D0:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
001527E0:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
001527F0:  00 00 00 00 00 00 00 00 &#9474; 00 00 00 00 00 00 00 00
00152800:  96 FC FF FF 84 C0 75 13 &#9474; 8B 4D FC 8B 01 EB 04 8B   Ц№  Д&#9492;u&#8252;ЛM№Л&#9786;ы&#9830;Л
00152810:  06 8B CE 6A 01 FF 10 33 &#9474; C0 EB 03 8B 45 FC 5F 5E   &#9824;Л&#9580;j&#9786; &#9658;3&#9492;ы&#9829;ЛE№_^
00152820:  5B C9 C2 04 00 8B C1 D9 &#9474; EE 8B 4C 24 04 8B 11 89   [&#9556;&#9516;&#9830; Л&#9524;&#9496;юЛL$&#9830;Л&#9668;Й
00152830:  10 8B 49 04 D9 58 08 89 &#9474; 48 04 C2 04 00 8B C1 8B   &#9658;ЛI&#9830;&#9496;X&#9688;ЙH&#9830;&#9516;&#9830; Л&#9524;Л
00152840:  4C 24 04 8B 11 89 10 8B &#9474; 49 04 89 48 04 8B 4C 24   L$&#9830;Л&#9668;Й&#9658;ЛI&#9830;ЙH&#9830;ЛL$

Как видишь, начиная с символа, выделенного жирным, и до конца в файле идут бинарные данные.


 
pathfinder   (2006-10-25 09:59) [45]


> Сергей М. ©   (25.10.06 08:36) [44]

Спасибо.



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

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

Наверх




Память: 0.57 MB
Время: 0.062 c
15-1161677647
daser
2006-10-24 12:14
2006.11.12
Как узнать размер кластера на NTFS ( Win2003)?


15-1161775937
Шариков
2006-10-25 15:32
2006.11.12
Опера на яве !!


15-1161790654
Kerk
2006-10-25 19:37
2006.11.12
Пиво. Ice.


8-1144416142
NightLord
2006-04-07 17:22
2006.11.12
TGA and GLScene


2-1162191258
Alex_C
2006-10-30 09:54
2006.11.12
Координаты мыши в мемо