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


    Ты скажи мне, фундаментальный тип всегда останется неизменного размера?;) Уверен в том?
      Write заменить на WriteBuffer а по поводу SizeOf есть вот такой вопросик:
      SizeOf(Char) = ? ;)
        Хых, страшно рад, что мой вопрос вызвал такой оживленный спор... =)
        Цитата Rouse_ @
        TSampleRec=record
        Text: String;
        Num: Integer;
        end;


        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;

        Rouse, если бы все было так просто, я бы и вопрос не задавал! ) Такая мысль мне и самому приходила. Согласен, что так рекорд успешно запишется, но если учесть, что в нем несколько десятков полей, многие из которых также являются записями, которые также содержать большое количество полей и динамических массивов... К тому же размер файла существенно возрастет, если перед каждой переменной записывать ее размер, да и скорость будет не совсем приемлимой... Я уж не говорю о том, что я просто запарюсь печетать! =\
        Может есть другой способ?
          Ins! Rouse! Блин, ну создали бы что-ли отдельную ветку "Филосифия Delphi"! )) А у меня сейчас есть реальный вопрос и совсем не много времени! Плиз, ребята, помогите разобраться!
            R@RED приведи пример твоей записи попробую помочь ...

            Сообщения были разделены в тему "Фундаментальные и общие типы данных"
              хм нифигасе нафлудили, и кто?, люди облаченные властью и знаниями :P
              а про то что помочь топикстартеру забыли? а проблема имхо на поверхности!
              R@RED
              ExpandedWrap disabled
                type
                TProject =record
                num:word;
                doc:array[1..128] of char;
                end
                ..
                var Project:TProject;
                ...
                WriteBuffer(Project, SizeOf(Project));

              сработает!
              а вот
              ExpandedWrap disabled
                type
                TProject =record
                num:word;
                doc:Pchar;
                end
                ..
                var Project:TProject;
                ...
                WriteBuffer(Project, SizeOf(Project));

              нет! а почему? догадался?

              ЗЫ примерчик офтопа
              ExpandedWrap disabled
                как то раз пришел один ко мне на работе и говорит типа ты че лох говориш что песенки занимают примерно 1метр/минута, вот у меня на дискете 400 песен и еще место осталось. и как вы думаете что было на дискете? правильно... 400 ярлыков, у дома у него все работало


              не используй указательные типы (pchar это указатель на на массив символов, имеет размер sizeof(pointer), а данные находятся в другой области памяти) 8-)
                Цитата andrew.virus @
                приведи пример твоей записи попробую помочь ...

                Ок, по определенным причинам не могу привести конкретно свой рекорд, но приведу подобный, если удасться сохранить его, то и проблема будет решена:
                ExpandedWrap disabled
                  type TRecType1 = (rtRTV1, rtRTV2);
                  type TRecType2 = set of (rttRTV1, rttRTV2);
                   
                  type TSubRec = record
                      str1   : string;
                      str2   : ShortString;
                      int1   : integer;
                      int2   : LongInt;
                      _type  : TRecType1;
                      _type1 : TRecType2;
                      mass1  : array of string;
                      mass2  : array of integer;
                      bool1 : boolean;
                  end;
                   
                  type TProject = record
                      mass1 : array of TSubRec;
                      str1  : string;
                      int1  : LongInt;
                      int2  : integer;
                      bool1 : boolean;
                  end;

                Только необходимо учитывать, что полей и типов гораздо больше, так что способ Демо не подходит. Есть идеи? =)
                Сообщение отредактировано: R@RED -
                  R@REDмой пост выше читал?
                  sizeof(mass1) =4 !!! как думаеш почему?
                  кстати string тоже указатель :D
                  фиксированный только ShortString

                  Добавлено
                  в твоем примере

                  type TRecType1 = (rtRTV1, rtRTV2);
                  type TRecType2 = set of (rttRTV1, rttRTV2);

                  type TSubRec = record
                  str1 : string;
                  str2 : ShortString;
                  int1 : integer;
                  int2 : LongInt;
                  _type : TRecType1;
                  _type1 : TRecType2;
                  mass1 : array of string;
                  mass2 : array of integer;
                  bool1 : boolean;
                  end;

                  type TProject = record
                  mass1 : array of TSubRec;
                  str1 : string;
                  int1 : LongInt;
                  int2 : integer;
                  bool1 : boolean;
                  end;
                  это ошибки
                  Сообщение отредактировано: Virtuals -
                    Цитата Virtuals @
                    sizeof(mass1) =4 !!! как думаеш почему?

                    Почему же?
                    Цитата Virtuals @
                    это ошибки

                    Что значит ошибки, если мне необходимо использование именно этих типов? Если string на какой то подобный строковой тип я еще смогу заменить, то как например я должен обходиться без динамических массивов?
                    Извини, если чего-то не понял, буду рад, если приведешь правильный пример записи.
                      R@RED
                      Универсального решения для сохранения структур в файл нет.
                      Принцип понятен, остальное - кодирование.
                      Т.е. каждую структуру нужно обрабатывать по-своему.
                        Цитата Демо @
                        каждую структуру нужно обрабатывать по-своему.

                        Цитата R@RED @
                        Согласен, что так рекорд успешно запишется, но если учесть, что в нем несколько десятков полей, многие из которых также являются записями, которые также содержать большое количество полей и динамических массивов... К тому же размер файла существенно возрастет, если перед каждой переменной записывать ее размер, да и скорость будет не совсем приемлимой...

                        Я правильно понял, что в моем случае обрабатывать структуры по одтельности - это единственный путь и ни смотря на все минусы альтернативного решения нет? =(
                          Цитата R@RED @
                          Я правильно понял, что в моем случае обрабатывать структуры по одтельности - это единственный путь и ни смотря на все минусы альтернативного решения нет? =(


                          Именно так.
                          А что, у тебя их так много?

                          Если структуры - своеобразные наследники друг друга, то альтернативный вариант - создание классов наследников, которые умеют писать себя в поток. Это поможет упростить код и умегьшить его объём.
                            Цитата Демо @
                            создание классов наследников, которые умеют писать себя в поток. Это поможет упростить код и умегьшить его объём.
                            Это уже интереснее... А как можно реализовать умение "писать себя в поток", если опять же не пробегать все элементы по отдельности?
                              Цитата R@RED @
                              А как можно реализовать умение "писать себя в поток", если опять же не пробегать все элементы по отдельности?


                              Писать каждый элемент в любом случае придётся. Упрощение возможно лишь в случае наследования когда каждый наследник лишь добавляет новые поля для записи, а предок уже умеет работать с остальными полями.
                              Сообщение отредактировано: Демо -
                                Оуу... Ясно! Что ж, видимо все таки придеться писать все по очереди... =\ Ладно, спасибо за ответы, буду рад если у кого то еще появятся какие то идеи.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


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