Форум: "Начинающим";
Текущий архив: 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 │ 63 65 20 65 78 69 74 20 e: Service exit
001526F0: 5B 45 78 69 74 20 63 6F │ 64 65 20 3D 20 30 78 32 [Exit code = 0x2
00152700: 34 30 30 30 31 5D 0D 0A │ 32 30 30 36 2D 30 34 2D 40001]♪◙2006-04-
00152710: 30 34 09 31 31 3A 31 33 │ 3A 30 34 09 20 39 33 36 04○11:13:04○ 936
00152720: 09 33 31 30 09 53 65 72 │ 76 69 63 65 09 2A 2A 2A ○310○Service○***
00152730: 2A 2A 2A 2A 2A 2A 2A 2A │ 2A 2A 0D 0A 00 00 00 00 **********♪◙
00152740: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
00152750: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
00152760: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
00152770: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
00152780: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
00152790: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
001527A0: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
001527B0: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
001527C0: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
001527D0: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
001527E0: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
001527F0: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
00152800: 96 FC FF FF 84 C0 75 13 │ 8B 4D FC 8B 01 EB 04 8B Ц№ Д└u‼ЛM№Л☺ы♦Л
00152810: 06 8B CE 6A 01 FF 10 33 │ C0 EB 03 8B 45 FC 5F 5E ♠Л╬j☺ ►3└ы♥ЛE№_^
00152820: 5B C9 C2 04 00 8B C1 D9 │ EE 8B 4C 24 04 8B 11 89 [╔┬♦ Л┴┘юЛL$♦Л◄Й
00152830: 10 8B 49 04 D9 58 08 89 │ 48 04 C2 04 00 8B C1 8B ►ЛI♦┘X◘ЙH♦┬♦ Л┴Л
00152840: 4C 24 04 8B 11 89 10 8B │ 49 04 89 48 04 8B 4C 24 L$♦Л◄Й►ЛI♦ЙH♦Л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.072 c