Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];

Вниз

Загрузка 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.152 c
3-1158044838
SergP.
2006-09-12 11:07
2006.11.12
Как узнать тип поля в открытом датасете?


15-1161670447
zdm
2006-10-24 10:14
2006.11.12
mdi


3-1158054943
tomkat
2006-09-12 13:55
2006.11.12
Список таблиц базы Oracle


3-1157984318
abba
2006-09-11 18:18
2006.11.12
Структуированные записи


15-1161954746
Гарри Поттер
2006-10-27 17:12
2006.11.12
грядет сухой закон?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский