На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> TReader - помогите найти ошибку
    Вот код:
    ExpandedWrap disabled
      procedure TForm1.sButton1Click(Sender: TObject);
      var
      rr : TReader;
      tw : TWriter;
      f, rf : textfile;
      s, cr : string;
      i : integer;
      size : longint;
      buf : Pointer;
      rc : TResourceStream;
      fs : TFileStream;
      ms : TMemoryStream;
      db : array[1..150000] of string;
      begin
      i := 1;
      rc := TResourceStream.Create(hInstance,'rc_dt', RT_RCDATA);
      ms := TMemoryStream.Create;
      ms.SetSize(20000000);
      ms.CopyFrom(rc, rc.Size);
      ms.Seek(0,0);
      rr := TReader.Create(ms, 4096);
       
      rr.ReadListBegin;
       
       while not rr.EndOfList do begin
       s := rr.ReadString;
       db[i] := s;
       inc(i);
       end;
      rr.ReadListEnd;
      rr.Free;
      rc.Free;
       
       
      if FileExists('data.tmp') then DeleteFile('data.tmp');
      ShowMessage(db[1]);
      ShowMessage(IntToStr(size));
      end;


    Ошибка "Invalid property value" выдаётся на строке rr.ReadListBegin; :wall:

    Моя цель - это построчно считать данные из потока и занести их в массив.
    Сообщение отредактировано: bur80 -
      а что в потоке? dfm?
      если да, то какой(binary/text)?
        В потоке текстовый файл, а что есть разница ? :huh: У меня в ресурсе внутри exe`шника зашифрованный текстовый файл, я его оттуда хочу выдернуть в поток и потом построчно загнать в массив а уже из массива дешифровать и выдавать в качестве результатов пользователю.
        Сообщение отредактировано: bur80 -
          Может у кого есть какие нибудь мысли как решить проблему ?
            Цитата bur80 @
            В потоке текстовый файл, а что есть разница ?

            да, TReader ожидает, что в потоке содержится необходимая служебная информация, т.е. файл в ресурсе имеет необходимый формат(dfm)

            вот такой файл, например:
            ExpandedWrap disabled
              object Test: TTest
                List = (
                  'A'
                  'B'
                  'C')
              end

            можно прочитать так:
            ExpandedWrap disabled
              Procedure ReadTextDFM(ResName:String;List:TStrings);
              Var
                RS,MS:TStream;
                R:TReader;
              begin
                List.Clear;
                RS:=TResourceStream.Create(hInstance,ResName,RT_RCDATA);
                Try
                  MS:=TMemoryStream.Create;
                  Try
                    ObjectTextToBinary(RS,MS);
                    MS.Position:=0;
                    R:=TReader.Create(MS,1024);
                    Try
                      R.ReadSignature;
                      R.ReadStr; //TTest
                      R.ReadStr; //Test
                      R.ReadStr; //List
                      R.ReadListBegin;
                      While Not R.EndOfList Do
                        List.Append(R.ReadString);
                      R.ReadListEnd;
                      R.ReadListEnd;
                    Finally
                      R.Free;
                    End;
                  Finally
                    MS.Free;
                  End;
                Finally
                  RS.Free;
                End;
              End;


            только зачем эта морока с TReader?
            прочитай ресурс в строку и уже её расковыривай...
              Смахивает на то что rr.ReadListBegin; + rr.ReadListEnd; не нужны.

              Если ваш ресурс это просто текст - то точно не нужны, в противном случае предоставьте код записи в этот поток коотрый в ресурсе, или хотя бы дамп этого ресурса.
                Shaggy, я решил эту проблему по другому. Я из потока данные загружаю в StringList и уже с ним работаю.

                -Added
                Цитата alex_sporik @
                Смахивает на то что rr.ReadListBegin; + rr.ReadListEnd; не нужны.

                Если ваш ресурс это просто текст - то точно не нужны, в противном случае предоставьте код записи в этот поток коотрый в ресурсе, или хотя бы дамп этого ресурса.

                Тут проблема была, по всей видимости, в том что ресурс он как бы текст, но зашифрованный и поэтому из-за недопустимых символов в тексте поток не читался.
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0649 ]   [ 15 queries used ]   [ Generated: 17.06.25, 01:55 GMT ]