На главную Наши проекты:
Журнал   ·   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  все  ( Перейти к последнему сообщению )  
> Сохранение записи сложной структры в файл
    Здравстсвуйте!

    Никак не получается сохранить в файл record, а затем вновь загрузить его! Запись имеет большой размер, состоит из полей разного типа, безразмерных массивов, переменных других типой(определенных) мной.

    Пробовал очень просто, через поток:
    ExpandedWrap disabled
      var
        fs: TFileStream;
      begin
        if sd.Execute then begin
          fs:=TFileStream.Create(sd.FileName,fmCreate);
          fs.WriteBuffer(Project, SizeOf(Project));
          fs.Free;
        end;
      end;

    Ну и соответственно загрузка:
    ExpandedWrap disabled
      var
        fs: TFileStream;
      begin
        if not od.Execute then exit;
       
        fs:=TFileStream.Create(od.FileName,fmOpenRead);
        fs.ReadBuffer(Project, fs.Size);
        fs.Free;
      end;

    Ничего не получилось... (( Подскажите как это реализовать? Заранее спасибо!
    Сообщение отредактировано: R@RED -
      Цитата R@RED @
      безразмерных массивов,

      Ну не безразмерных, конечно, а динамических :)
      Поэтому и не получается. Самое простое - сделай не запись, а потомка TComponent. Все, что нужно сохранять, объяви как published property. И потом просто используй поток.
        Цитата R@RED @
        Подскажите как это реализовать? Заранее спасибо!
        Показывать надо не только краешек, ниже спускать, как у доктора, иначе тебе никто не поможет. Что за Project?
          ExpandedWrap disabled
              TSampleRec=record
                Text: String;
                Num: Integer;
              end;


          ExpandedWrap disabled
              i: integer;
              sr: TSampleRec;
              fs: TFileStream;
            begin
             
              sr.Text := 'test text';
              sr.Num := 19;
             
            //  Пишем
              fs := TFileStream.Create('c:\temp\file.tst', fmCreate);
              try
                i := Length(sr.Text);
                fs.Write(i,4);
                fs.Write(sr.Text[1],Length(sr.Text));
                fs.Write(sr.Num,4);
              finally
                fs.Free;
              end;
             
            //  Читаем
              fs := TFileStream.Create('c:\temp\file.tst', fmOpenRead);
              try
                fs.Read(i,4);
                SetLength(sr.Text,i);
                fs.Read(sr.Text[1],i);
                fs.Read(sr.Num,4);
              finally
                fs.Free;
              end;
            Цитата Romkin @
            Все, что нужно сохранять, объяви как published property. И потом просто используй поток.

            Угу, а потом когда в след версии измениться логика чтения/сохранения RTTI свойств, попробуй всю эту байду прочитать :)
              Если косяк именно из-за дин. массивов, то почему бы в структуре не хранить число элементов и написть свою процедуру считывания данных, а не потоком ?
                Цитата Демо @
                fs.Write(i,4);


                Опять Демо новичков плохому учит! :D
                  Цитата --Ins-- @
                  Опять Демо новичков плохому учит!


                  :D

                  Это почему это? -))
                    Цитата Демо @
                    Это почему это? -))


                    http://ru.wikipedia.org/wiki/Магическое_число_(программирование) - см. "Плохая практика программирования"
                    Про SizeOf слышал? ;)
                      Цитата --Ins-- @
                      Про SizeOf слышал?


                      Увы, переносимости в любом случае не будет.
                      Как раз в этом случае integer не может менять длину. Оно ОБЯЗАНО быть 4 байта. Иначе нет смысла хранить данные таким образом.

                      Добавлено
                      PS.
                      Википедия - весьма спорный аргумент.
                      Я бы сказал, что ей доверять нельзя ВООБЩЕ.
                        Цитата Демо @
                        Увы, переносимости в любом случае не будет.


                        Уверен? А чем тогда отличаются фундаментальные типы от общих? А конкретно, Longint от Integer?

                        Добавлено
                        Цитата Демо @
                        Википедия - весьма спорный аргумент.


                        Согласен, но не в данном случае ;)
                          Цитата --Ins-- @
                          Уверен? А чем тогда отличаются фундаментальные типы от общих? А конкретно, Longint от Integer?


                          Поможет ли SizeOf в случае переноса данных с одного ПК на другой, если на одном целый тип будет занимать 8 байт, а на другом 4?
                          Думаю, что нет. Поэтому в этом случае неприменим SizeOf.
                            Цитата Демо @
                            Поможет ли SizeOf в случае переноса данных с одного ПК на другой, если на одном целый тип будет занимать 8 байт, а на другом 4?
                            Думаю, что нет. Поэтому в этом случае неприменим SizeOf.


                            Тэкс, ты вопроса про общие и фундаментальные типы не понял... Что ж, спрошу без намеков... SizeOf(Longint) применим?
                              Цитата --Ins-- @
                              Тэкс, ты вопроса про общие и фундаментальные типы не понял... Что ж, спрошу без намеков... SizeOf(Longint) применим?


                              Longint применим;)

                              Добавлено
                              В смысле Sizeof(Longint)...
                                Демо, ну дык чего ты мне доказываешь :) Видишь, и SizeOf применим, и переносимость, и нет "магических чисел" в коде
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0672 ]   [ 16 queries used ]   [ Generated: 19.04.24, 03:14 GMT ]