Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];

Вниз

Что использовать вместо RECORD?   Найти похожие ветки 

 
art36 ©   (2008-03-24 18:42) [0]

Есть неудобный способ хранить записи в типизированном файле:

var
F:file of Tmytype
a: Tmytype

Но при этом ужасно неудобно удалять и записывать записи в этом файле.

Какая альтернатива есть? Чтоб все было в одном файле, и процедуры обработки чтения, удаления, записи, изменения были удобными?

Если есть ссылку в инете дайте, пожалста!


 
Reindeer Moss Eater ©   (2008-03-24 18:44) [1]

xml


 
art36 ©   (2008-03-24 18:45) [2]


> xml

Как?


 
Reindeer Moss Eater ©   (2008-03-24 18:46) [3]

Как?
Очень легко и даже приятно.


 
art36 ©   (2008-03-24 18:47) [4]


> Очень легко и даже приятно.

(( я понятия не имею как им пользоваться


 
Reindeer Moss Eater ©   (2008-03-24 18:50) [5]

ну тогда оставайся на типизированных файлах.


 
art36 ©   (2008-03-24 18:55) [6]


> ну тогда оставайся на типизированных файлах.

ну уж нет... у него избыточный код, есть что-нибудь еще?


 
Семеныч   (2008-03-24 19:10) [7]

Зависит от того, что Вы называете удобным и неудобным. Например, вместо записей можно использовать объекты, а файл читать в их список (потомок TObjectList) и писать из этого же списка. Тогда весь вопрос сводится к написанию 2-х простых методов списка - чтение и запись файла (формат файла: перваые 4 байта - количество элементов, далее сами элементы).

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


 
Reindeer Moss Eater ©   (2008-03-24 19:14) [8]

Поиск нужного объекта в таком файле будет особенно удобен.


 
Семеныч   (2008-03-24 19:18) [9]

> Reindeer Moss Eater ©   (24.03.08 19:14) [8]

На всякий случай: в файлах объекты не ищут. В файлах вообще ничего не ищут. Файлы читают и пишут, а ищут - в памяти.

И при этом без разницы, что содержит файл - объекты, записи, просто числа или что угодно еще.


 
Reindeer Moss Eater ©   (2008-03-24 19:20) [10]

да да конечно. и не ищут в файлах ничего и никогда.


 
Kolan ©   (2008-03-24 19:22) [11]

Прочитай про сериализацию, используй объекты и сериализуй их стандартными методами&#133


 
Reindeer Moss Eater ©   (2008-03-24 19:23) [12]

Будет та же хрень что и с типизированными файлами.
С точностью до миллиметра.


 
Kolan ©   (2008-03-24 19:23) [13]

Кстати, а как на счет БД?


 
Reindeer Moss Eater ©   (2008-03-24 19:26) [14]

Причем чел поимеет реальный гемор при перезаписывании экземпляра находящегося посреди файла.
Если раньше ему достаточно было переписать кусок размером SizeOf(рекорд), то с переходом на объекты, это уже не прокатит.


 
Johnmen ©   (2008-03-24 19:27) [15]

Да простой ClientDataSet.


 
Семеныч   (2008-03-24 19:27) [16]

> Reindeer Moss Eater ©   (24.03.08 19:20) [10]

Можете привести пример поиска в файле?

Если можете - приведите. А я Вам тут же докажу, что это поиск НЕ в файле, а в памяти.

Даже если весь поиск сводится к одному сравнению, то это сравнение все равно производится в памяти. А файлы только читают и пишут.


 
Reindeer Moss Eater ©   (2008-03-24 19:29) [17]

Семеныч, вы предлагаете заменить шило на мыло. Причем с гребанием новых граблей.


 
Семеныч   (2008-03-24 19:31) [18]

> Reindeer Moss Eater ©   (24.03.08 19:26) [14]

> Причем чел поимеет реальный гемор при перезаписывании экземпляра
> находящегося посреди файла. Если раньше ему достаточно было
> переписать кусок размером SizeOf(рекорд), то с переходом на объекты,
> это уже не прокатит.

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

LOL?


 
Семеныч   (2008-03-24 19:33) [19]

> Reindeer Moss Eater ©   (24.03.08 19:29) [17]

> Семеныч, вы предлагаете заменить шило на мыло. Причем с гребанием
> новых граблей.

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


 
Reindeer Moss Eater ©   (2008-03-24 20:23) [20]

Ну поехали.

запись порции данных в типизированный файл: один вызов.
запись сериализированного объекта в файл: один вызов.
чтение аналогично.

поиск записи по значению в поле (поиск объекта по значению поля/свойства):
последовательно читаем и сравниваем. снова никаких преимуществ.

позиционирование на запись с номером N:
В случае типизированного файла: да
В случае с объектами - в цикле делаем считывание N раз. Уже минус.

изменение найденного элемента:
типизированный файл:
считываем запись, меняем поля, делаем seek назад, записываем рекорд.
объекты:
снова облом. все что позади изменяемого объекта, необходимо считать и записать по новой после измененного объекта.

Итого:
Жить стало лучше?
Нет, жить стало просто веселей.


 
Reindeer Moss Eater ©   (2008-03-24 20:34) [21]

В случае же обжектлиста появится необходимость считывать весь файл целиком в память. В случае xml дело конечно обстоит примерно так же, но:

- имеем sql-подобный механизм поиска
- не имеем гемора с верисонностью структуры.
- имеем простую возможность визуализации данных в различных форматах (html,txt,rtf etc)
...  и так далее


 
Reindeer Moss Eater ©   (2008-03-24 20:42) [22]

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

А что, каждый инстанс после сериализации имеет один и тот же размер?


 
art36 ©   (2008-03-24 21:28) [23]

Да, кстати.. вся проблема, в основном, при удалении элемента из типизированного файла.. приходится писать в другой файл, а потом копировать его с заменой предыдущего... флеш накопитель не взорвется?? ))


 
Anatoly Podgoretsky ©   (2008-03-24 21:34) [24]

> art36  (24.03.2008 21:28:23)  [23]

Второй файл лишний.


 
DVM ©   (2008-03-24 21:44) [25]


> art36 ©   (24.03.08 21:28) [23]
> Да, кстати.. вся проблема, в основном, при удалении элемента
> из типизированного файла..

Можно просто помечать элемент как удаленный.


 
Семеныч   (2008-03-24 22:40) [26]

> Reindeer Moss Eater ©   (24.03.08 20:42) [22]

> А что, каждый инстанс после сериализации имеет один и тот же размер?

И до, и после - один и тот же. Размер инстанса с сериализацией вообще никак не связан. Это 4 байта плюс сумма размеров полей.

Поэтому: поехали, но несколько не так, как Вы полагаете:

> Reindeer Moss Eater ©   (24.03.08 20:23) [20]

> запись порции данных в типизированный файл: один вызов.
> запись сериализированного объекта в файл: один вызов.
> чтение аналогично.

Согласен.

> поиск записи по значению в поле (поиск объекта по значению
> поля/свойства):
> последовательно читаем и сравниваем. снова никаких преимуществ.

Согласен.

> позиционирование на запись с номером N:
> В случае типизированного файла: да
> В случае с объектами - в цикле делаем считывание N раз. Уже минус.

Если программировать "в лоб", используя "обычную" сериализацию - то да. А если объявить файл, как file of byte, то фигушки: Seek(N * InstanseSize) сразу позиционирует куда надо. И получаем то же самое, что и для рекорда.

> изменение найденного элемента:
> типизированный файл: считываем запись, меняем поля, делаем seek назад,
> записываем рекорд.
> объекты: снова облом. все что позади изменяемого объекта, необходимо
> считать и записать по новой после измененного объекта.

Не-а, снова фигушки. Считываем найденный (по предыдущей схеме) объект, делаем seek назад, записываем объект (InstanceSize). Все то же самое, что и с рекордом (если, конечно, не программировать "в лоб").

> Итого:
> Жить стало лучше?
> Нет, жить стало просто веселей.

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


 
art36 ©   (2008-03-24 22:43) [27]

Нужно заюзать! Благодарю за активность!


 
Reindeer Moss Eater ©   (2008-03-24 22:45) [28]

Не-а, снова фигушки. Считываем найденный (по предыдущей схеме) объект, делаем seek назад, записываем объект (InstanceSize). Все то же самое, что и с рекордом (если, конечно, не программировать "в лоб").

чот я не понял.
был экземпляр объекта с полем-строкой длиной 100 символов.
считали его из файла, заменили значение в поле на строку длиной 200 символов.

и после сериализации экземпляр занимает ровно столько же места на устройстве хранения?


 
Reindeer Moss Eater ©   (2008-03-24 22:56) [29]

Нужно заюзать! Благодарю за активность!

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

...и так всю жизнь.


 
Семеныч   (2008-03-25 00:44) [30]

> Reindeer Moss Eater ©   (24.03.08 22:45) [28]

> чот я не понял.
Угу.

> был экземпляр объекта с полем-строкой длиной 100 символов.
ОК, был.

> считали его из файла, заменили значение в поле на строку длиной 200
> символов.
Это невозможно по определению. См. [18]. Все то же самое, что и с рекордами - там могут быть только ShortString. Иначе типизированный файл не катит.

> и после сериализации экземпляр занимает ровно столько же места на
> устройстве хранения?
Угу, ровно столько же. И в памяти, и на устройстве хранения.


 
art36 ©   (2008-03-25 00:50) [31]


> Reindeer Moss Eater ©  [29]
>
> осваивай xml. в жизни пригодится.
> а то будешь для каждой задачи изобретать свой велосипед на базе обджектлиста...


Да, конечно)


 
Семеныч   (2008-03-25 00:52) [32]

> art36 ©   (24.03.08 22:43) [27]

Если скорость неважна, то xml для этой задачи неплох. Правда, я не уверен, что xml позволит сделать изменение записи в файле или удаление записи из него более удобными, чем это было с Record - но тут, повторюсь, все зависит от того, что Вы понимаете под словом "удобно".

А если скорость важна, то однозначно нужно использовать прямую запись участка памяти и чтение в него же. С xml будет намного медленнее.


 
Германн ©   (2008-03-25 00:55) [33]


> art36 ©   (25.03.08 00:50) [31]
>
>

Кстати. А вот интересно было бы привести пример записи типа Tmytype. И конкретные примеры "неудобств" работы с типизированными файлами file of Tmytype. А то может холивар раздутый в сей ветке вообще бессмысленный?


 
Семеныч   (2008-03-25 00:57) [34]

> Reindeer Moss Eater ©   (24.03.08 22:56) [29]

Освоить xml, конечно, неплохо, но запись участка памяти в файл и обратное чтение я бы не стал называть изобретением велосипеда. Нормальное использование известного метода, никаких изобретений.


 
Семеныч   (2008-03-25 01:01) [35]

> Германн ©   (25.03.08 00:55) [33]

> А то может холивар раздутый в сей ветке вообще бессмысленный?

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

По крайней мере, в моем понимании этого слова. А что под ним понимает автор - это ему самому и решать.


 
Германн ©   (2008-03-25 01:21) [36]


> Семеныч   (25.03.08 01:01) [35]

В моём понимании типизированного файла вообще не нужно ничего дополнительно писАть. Эта штука так давно нормально работает, что и не нужно ничего менять. Но вот "рекорд" в типизированном файле - это несколько иное. (После ТП и Д1).  И вот тут желательны разъяснения автора. Он ведь хочет оптимизации. Но "абсолютной" оптимизации не было, нет и не будет.


 
Ega23 ©   (2008-03-25 06:46) [37]


> Reindeer Moss Eater ©   (24.03.08 22:56) [29]
>
> Нужно заюзать! Благодарю за активность!
>
> осваивай xml. в жизни пригодится.
> а то будешь для каждой задачи изобретать свой велосипед
> на базе обжектлиста, для каждого велосипеда придумывать
> свой насос, а для каждого насоса свой воздух.
>
> ...и так всю жизнь.


Про велосипед и воздух - поржал, спасибо.
Про xml: хоть и не имею ничего против, тем-не-менее каким образом xml решает задачу удаления нода из середины файла без открытия файла целиком?  :)


 
Reindeer Moss Eater ©   (2008-03-25 08:44) [38]

Свободная беспроблемная версионность формата. Вот что даст xml по сравнению с сериализцией объектов и типизированными файлами.
+ остальные преимущества описанные выше.


 
Reindeer Moss Eater ©   (2008-03-25 08:52) [39]

тем-не-менее каким образом xml решает задачу удаления нода из середины файла без открытия файла целиком?  :)

не решает. я говорил.
только весь фукнкционал уже реализован добрым дядей в виде savetofile.
примерно то же самое имеем при обжектлисте, но там поиск никакой, а в xml нам дан xpath. если же рекорды просто заменять сериализованными объектами, то вообще приплыли. перезапись нужно изобретать самому (это про воздух).

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

имеем:

если это xml, все будет гладко. файл считается и при необходимости отредактируется без потери атрибутов, появившихся в версии 2.

а что будет в аналогичной ситуации с типизированными файлами или сериализованными объектами нетрудно представмить.


 
Reindeer Moss Eater ©   (2008-03-25 08:55) [40]

Это невозможно по определению. См. [18]. Все то же самое, что и с рекордами - там могут быть только ShortString. Иначе типизированный файл не катит.

А! Понял. то есть все строковый поля в типе будут короткими строками.

Итого:
что мы дополнительно получили от переписывния кода? :
-ничего, кроме возможности не делать Dispose.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.044 c
2-1206621875
БарЛог
2008-03-27 15:44
2008.04.20
Сохранение части скриншота


2-1206773311
nw
2008-03-29 09:48
2008.04.20
Можно установить и использовать компонент без *.dcu ?


15-1204281078
Правильный_Вася
2008-02-29 13:31
2008.04.20
не могу запустить TurboDelphi


2-1206124619
Res
2008-03-21 21:36
2008.04.20
smtp


15-1204604949
Slider007
2008-03-04 07:29
2008.04.20
С днем рождения ! 4 марта 2008 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский