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

спасибо!



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

Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.044 c
3-1158317143
Sergey_b
2006-09-15 14:45
2006.11.12
выбор данных, в соответствии с иерархией


3-1157979045
NotGooDP
2006-09-11 16:50
2006.11.12
Программное востановление БД


15-1160665605
Marser
2006-10-12 19:06
2006.11.12
Ура!


15-1161680315
ANB
2006-10-24 12:58
2006.11.12
Баянище


2-1161891637
---------
2006-10-26 23:40
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский