Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Вопрос к знающим. Мне нужно определить разницу в TSystemTime. Проблема что откуда то берутся 7 минут и 9 секунд.  

    Попробуй для теста все это перегнать в TDateTime, найти разницу и вывести.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 14:18 09-08-2011
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть файл, который нужно интерпретировать, есть текстовое описание формата данных, который он использует для хранения. Формат описывает эти данные так:
    для каждого параметра какой-либо конкретной секции указывается -
    офсет (от начала секции или файла), длина данных (в байтах), тип данных (word, dword, string и т. д.)
    Я описал некоторые структуры в соответствии с этими данными.
    Как прочитать данные теперь из файла в эти структуры? Использовать обычные методы чтения файла?

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 13:54 17-08-2011 | Исправлено: DmitryKz, 18:02 17-08-2011
    YuriyRR



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz

    Цитата:
    Как прочитать данные теперь из файла в эти структуры? Использовать обычные методы чтения файла?

    Да. Только структуры должны быть упакованы.

    Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 19:17 17-08-2011
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Только структуры должны быть упакованы

    А почему, объясните, пожалуйста? Это не снизит время доступа к полям?

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 20:14 17-08-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    В файле они наверняка будут упакованы, так что у вас нету выбора.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 20:26 17-08-2011
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Понял, спасибо...
     
    Задам ещё один вопрос:
    даных много, секции имеют древовидную структуру, подразделяясь на подсекции и далее... мне все данные не нужны, но интерес к вопросу не только теоретический:
     
    мой код (нет-нет, это не для г...кода выглядит так:
     

    Код:
    function по заполнению структуры(File: TFileStream): TStruct;
    var
      struct: TStuct;               // структура здесь, в функции
      bf: array of Byte;            // массив байтов (буфер)
      lbf: Int64;                      // длина буфера
    //одно поле структуры получаю так:
      lbf := sizeof(struct.Id);
      SetLength(bf, lbf);
      File.Read(bf, lbf);
      struct.Id := DWORD(&bf);
      ... // далее по тому же способу получаю остальные поля
     
      Result := struct;
     

     
    Как для всего разветвления данных в файле унифицировать этот однообразный процесс???

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 20:29 17-08-2011 | Исправлено: DmitryKz, 21:00 17-08-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    А зачем читать отдельные поля? Можно ведь сразу всю структуру: File.Read(struct, SizeOf(struct)) по крайней мере если у вас с упаковкой и выравниванием все в порядке.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 21:05 17-08-2011
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    И в плане оптимизации:   SetLength(bf, lbf) не обязательно делать каждый раз при чтении очередной записи, достаточно один раз выставить размер буфера по максимуму

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 21:18 17-08-2011
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Я не знаю, как это сделать:
    отдельные поля структуры имеют идентификатор и в зависимости от идентификатора содержат данные, не совпадающие с данными других структур...
    а ещё есть файлы с таким же строением, но с другими структурами...
     
    то есть принцип построения файлов один и тот же. Примерно он выглядит так:
     
    //все параметры описаны так - param: offset, length, type of data
    //заголовок файла:  
    парам1...
    ...
    парам4 - кол-во разделов
    //конец заголовка файла
     
    //начало описания списка указателей разделов
    парам1 = тип (от которого и зависит разный набор данных)
    парам2 = кол-во подсекций
    парам3 = офсет от начала файла
    парам4 = длина раздела
    //конец описания списка разделов
     
    //разделы:
    //могут иметь разные параметры с разными типами, зависит от парам1 (см. выше описание разделов)
    //также в свою очередь могут иметь подсекции, а те - свои подсекции
     
    ну то есть нету никакой унификации...
     
    Добавлено:

    Цитата:
    достаточно один раз выставить размер буфера по максимуму

    а если надо выполнять приведение типов? Скажем, сначала прочитали тип WORD, затем double, затем DWORD. При приведении данных из буфера будут учитываться только первые 2, 8, 4 байта соответственно?

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 21:25 17-08-2011 | Исправлено: DmitryKz, 21:31 17-08-2011
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz

    Цитата:
    а если надо выполнять приведение типов? Скажем, сначала прочитали тип WORD, затем double, затем DWORD. При приведении данных из буфера будут учитываться только первые 2, 8, 4 байта соответственно?

    При такой форме записи - да
    struct.Id := DWORD(&bf);
    тут указан конкретный тип, размер которого и определяет, сколько байт будет учитываться

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 21:31 17-08-2011
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    При такой форме записи - да  

    Вы не представляете, какую заботу Вы сейчас с меня сняли, спасибо
    А есть ещё другие способы приведения байтов, прочитанных из файла в буфер?
    ...
    Ещё бы разобраться со всем этим разветвлением...........

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 21:33 17-08-2011
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    в таком случае предлагаю
    bf: array of Byte;
    заменить на
    bf: array [0..1000] of Byte;
    Динамические массивы - это особые объекты в делфи, у которых есть дополнительные поля (например, хранится длина по отрицательному смещению), соответственно, накладные расходы выше.  
    Для быстродействия лучше использовать статические массивы, выделив память один раз по максимуму.
     
    Поскольку секции вложены - то процедура чтения должна быть рекурсивной, то есть читать верхний объект, а затем вызывать себя для подобъектов рекурсивно.
     
    >> все параметры описаны так - param: offset, length, type of data
    это очень напоминает TStream.ReadComponent, есть смысл посмотреть исходники этой процедуры
     
    Добавлено:

    Цитата:
    А есть ещё другие способы приведения байтов, прочитанных из файла в буфер?

    Вопрос не понял - зачем?
    в делфи 2 способа приведения, для последовательности  байтов подходит этот

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 21:45 17-08-2011
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
    Спасибо за помощь.

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 21:56 17-08-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    Для всех типов секций в файле у вас должны быть свои типы рекордов в коде:
    Подробнее...

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 22:13 17-08-2011
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Секций там не один десяток, а если учесть ещё параметры в них, то это займёт время... Я оформил пока записи для интересующих меня данных.
    Если честно, я из кода не понял, что он должен делать. Похоже на работу с типизированными файлами (я, кстати, думал о том, типизирован ли мой файл и решил, что не типизирован, хотя может потому, что испугался глубины вложенностей структур/рекордов), только непонятны вот эти операторы:
    File.Read(Sections[i], SizeOf(TSection));  
    File.Read(Image, SizeOf(TImageSection));  
    File.Read(Buf[0], Length(Buf))
    Выделенное красным, это что - поле записи (структуры)?
    Я не работал с классом File, а его метод Read видел только в примерах о типизированных файлах, но там на первом месте после скобок был хэндл файла, назначенный AssignFile. В справке я тоже не нашёл других примеров.
     
    XPerformer

    Цитата:
    в таком случае предлагаю  
    bf: array of Byte;  
    заменить на  
    bf: array [0..1000] of Byte;  

    В этом случае начинает ругаться на инвалидное приведение типов...

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 22:52 17-08-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryKz
    Код:
    File: TFileStream;
    Sections: array of TSection;
    Image: TImageSection;
    Buf: array of Byte;

    Типизированные файлы прокатывают только когда в файле все время повторяется одна и та же структура фиксированной длины. А у вас в одном файле могут быть TSection, TImageSection и т д.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 23:04 17-08-2011 | Исправлено: Frodo_Torbins, 23:07 17-08-2011
    DmitryKz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ага, теперь ясно, а то имя File озадачило первоначально...

    Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 23:09 17-08-2011
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток. Делаю экспорт в dbf при помощи TAdoCommand:
      cmd.ConnectionString := 'Provider=VFPOLEDB.msm;Data Source='+LMDBEexport.text+'\;Password="";Collating Sequence=RUSSIAN';
    Заказчику не понравилась версия dbf. Походу у него старый foxpro. Говорит нужно в формате dbs4 или 2.6.
    Сделал так:
      cmd.ConnectionString := 'Provider=VFPOLEDB.msm;Data Source='+LMDBEexport.text+'\;Password="";Extended Properties=dBase IV;Collating Sequence=RUSSIAN';
    Наши мегапрограммисты сказали, что начальные байты присланного заказчиком dbf файла и  моим должны совпадать. Совпадения нет, как переделать под dbs4 или 2.6?

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 12:55 19-08-2011
    Coltrain

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    Насколько критично делать экспорт через ADO? Если не сильно, то можно попробовать сделать экспорт при помощи компонент Halcyon. Пока жалоб не было...

    Всего записей: 160 | Зарегистр. 31-07-2002 | Отправлено: 16:45 19-08-2011
    Man_Without_Face



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Coltrain
    Halcon использовал раньше, с удовольствием от него избавился. У меня
    стоял вроде как последний, он не поддерживал поля datetime, еще я не  
    мог null значения записать. Да и работал он в десять раз медленнее.
     
    В моей программе я так понимаю нужно провайдер другой, какой то старый.

    Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 17:03 19-08-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru