На главную Наши проекты:
Журнал   ·   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_
Страницы: (3) 1 2 [3]  все  ( Перейти к последнему сообщению )  
> Сохранение записи сложной структры в файл
    R@RED
    Цитата
    Цитата (Virtuals @ Сегодня, 08:33)
    sizeof(mass1) =4 !!! как думаеш почему?

    Почему же?

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

    Цитата
    то как например я должен обходиться без динамических массивов?

    а как вы узнаете размер вашего массива? ;) чтоб не вызвать AV
    если для строк еще боле менее узнать размер (ну напр по терминирующему #0)
    то как узнать размер структуры
    ExpandedWrap disabled
      mass2 : array of integer;

    ?
    в от с
    ExpandedWrap disabled
      mass2 : array of string;


    вообще грабли, вот разберем этот пример

    mass2 : array of string;
    есть не что иное как
    указатель на область памяти, где хранится
    массив, произвольной длинны, указателей, которые ссылаются на
    области памяти, произвольной длинны, где данные, теоритически, оканчиваются на #0

    вот мы и пришли к тому что "сложные" структуры, (тоесть такие где используются переменные, с неизвестным размером") лучше сохранять в какую либо БД, а какая это БД будет вам решать, но учтите что в ней каждый раз должно сохранятся неизвестное количество полей с произвольной длинной

    ЗЫ смотрите в сторону XML
    Сообщение отредактировано: Virtuals -
      Цитата Virtuals @
      потому что это указатель pointer
      Потом уже догадался )
      Цитата Virtuals @
      есть не что иное как указатель на область памяти, где хранится, массив, произвольной длинны, указателей, которые ссылаются на области памяти, произвольной длинны, где данные, теоритически, оканчиваются на #0
      Ясненько! )
      Цитата Virtuals @
      вот мы и пришли к тому что "сложные" структуры, (тоесть такие где используются переменные, с неизвестным размером") лучше сохранять в какую либо БД
      Не катит, не спрашивайте почему, просто БД в этом случае мне не подходит...
      Ладно, я уже почти смирился со способом предложенным Демо. )) Всем спасибо, вопрос решен.
        R@RED

        Есть один вариант. Но насколько он сложен(или прост) не скажу, пока не попробую реализовать сам.
        Подумаю немного-)
          Буду очень рад свежей идее! =)
            Я тебе уже дал идею в #2. То, что говорит Rouse по этому поводу - фигня. Но если уж хочется подстраховаться, то можно писать файл в текстовом виде, там уж разночтений не будет.
              Пример заготовки для копирования в TStream любой структуры:
              Необходимо описание самой структуры (packed record) и строка с описанием типов полей: один символ - одно поле в структуре.
              Это лишь заготовка, необходимо тестировать в различных условиях.

              ExpandedWrap disabled
                unit uTypes;
                 
                interface
                 
                uses
                  Classes;
                 
                type
                 
                  tRec=packed record
                    fString: String;
                    fInt: Integer;
                    fInt64: Int64;
                    fBoolean: Boolean;
                  end;
                 
                function GetRec(PointerToRecord: Pointer;
                  RecordSH: String; Stream: TStream): Integer;
                function PutRec(PointerToRecord: Pointer;
                  RecordSH: String; Stream: TStream): Integer;
                 
                const
                  RecSh='si6b';
                 
                implementation
                 
                function GetRec(PointerToRecord: Pointer;
                  RecordSH: String; Stream: TStream): Integer;
                var
                  p: Pointer;
                  c: Char;
                  i: integer;
                  Len: Integer;
                begin
                  Result := 0;
                  p := PointerToRecord;
                  for i := 1 to Length(RecordSH) do
                  begin
                    c := UpCase(RecordSH[i]);
                    case c of
                      'S':
                        begin
                          Stream.ReadBuffer(Len,SizeOf(Integer));
                          SetLength(PString(p)^,Len);
                          Stream.ReadBuffer(PString(p)^[1],Len);
                          p := Pointer(Integer(p)+SizeOf(String));
                          Result := Result + SizeOf(String)+Len;
                        end;
                      'I':
                        begin
                          Stream.ReadBuffer(PInteger(p)^,SizeOf(Integer));
                          p := Pointer(Integer(p)+SizeOf(Integer));
                          Result := Result + SizeOf(Integer);
                        end;
                      '6':
                        begin
                          Stream.ReadBuffer(PInt64(p)^,SizeOf(Int64));
                          p := Pointer(Integer(p)+SizeOf(Int64));
                          Result := Result + SizeOf(Int64);
                        end;
                      'B':
                        begin
                          Stream.ReadBuffer(PBoolean(p)^,SizeOf(Boolean));
                          p := Pointer(Integer(p)+SizeOf(Boolean));
                          Result := Result + SizeOf(Boolean);
                        end;
                    end;
                  end;
                end;
                 
                function PutRec(PointerToRecord: Pointer;
                  RecordSH: String; Stream: TStream): Integer;
                var
                  p: Pointer;
                  c: Char;
                  i: integer;
                  Len: Integer;
                begin
                  Result := 0;
                  p := PointerToRecord;
                  for i := 1 to Length(RecordSH) do
                  begin
                    c := UpCase(RecordSH[i]);
                    case c of
                      'S':
                        begin
                          Len := Length(PString(p)^);
                          Stream.WriteBuffer(Len,SizeOf(Integer));
                          Stream.WriteBuffer(PString(p)^[1],Len);
                          p := Pointer(Integer(p)+SizeOf(String));
                          Result := Result + SizeOf(String)+Len;
                        end;
                      'I':
                        begin
                          Stream.WriteBuffer(PInteger(p)^,SizeOf(Integer));
                          p := Pointer(Integer(p)+SizeOf(Integer));
                          Result := Result + SizeOf(Integer);
                        end;
                      '6':
                        begin
                          Stream.WriteBuffer(PInt64(p)^,SizeOf(Int64));
                          p := Pointer(Integer(p)+SizeOf(Int64));
                          Result := Result + SizeOf(Int64);
                        end;
                      'B':
                        begin
                          Stream.WriteBuffer(PBoolean(p)^,SizeOf(Boolean));
                          p := Pointer(Integer(p)+SizeOf(Boolean));
                          Result := Result + SizeOf(Boolean);
                        end;
                    end;
                  end;
                end;
                 
                end.


              Пример использования:

              ExpandedWrap disabled
                procedure TForm1.Button1Click(Sender: TObject);
                type
                  pRec=^TRec;
                var
                  fs: TFileStream;
                  tr: PRec;
                  tr1: TRec;
                begin
                  New(tr);
                  tr^.fString := 'ПРоверка записи строки в файл';
                  tr^.fInt := 1;
                  tr^.fInt64 := 2;
                  tr^.fBoolean := True;
                  fs := TFileStream.Create('c:\test.dat', fmCreate);
                  try
                    uTypes.PutRec(tr,RecSH,fs);
                  finally
                    fs.Free;
                    Dispose(tr);
                  end;
                 
                  fs := TFileStream.Create('c:\test.dat', fmOpenRead);
                  try
                    uTypes.GetRec(@tr1,RecSH,fs);
                  finally
                    fs.Free;
                  end;
                  ShowMessage(tr1.fString+'/'+
                    IntToStr(tr1.fInt)+'/'+
                    IntToStr(tr1.fInt64)+'/'+
                    IntToStr(Integer(tr1.fBoolean)));
                end;
              Сообщение отредактировано: Демо -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:
              Страницы: (3) 1 2 [3]  все


              Рейтинг@Mail.ru
              [ Script execution time: 0,0311 ]   [ 16 queries used ]   [ Generated: 2.05.24, 04:16 GMT ]