![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Вопрос такого плана - есть несколько типов в программе типа record,что то похожее на:
Type t1=record a:integer; b:boolean; end; Type t2=record c:string[10]; d:real; end; Теперь вопрос можно ли переменные таких типов записать в файл при помощи одной и той же процедуры если заранее тип не известен(просто у меня таких типов очень много и писать для каждого из них отдельную процедуру не хочется). Через тип File не получается. Или файл надо объявлять точно соответствующего типа, либо если файл не типизирован то как передать контекст переменной? var a:t2; assignfile(f, MyFileName); rewrite(f, sizeof(t2)); write(f, a); //здесь компиллятор генерит ошибку write(f, a^); //так тоже не работает Идеально было бы для меня работать через файловые потоки, там та же проблема: MyFileStream.write(a,sizeof(a)); // компиллятор такое не пропускает -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| MBo |
|
|||
|
Unregistered |
все же работает
Type t2=record c:string[10]; d:double; end; var at2:array[1..3] of t2; fs:tfilestream; i:integer; begin fs:=tfilestream.create('e:\qq.dat',fmCreate); for i:=1 to 3 do begin at2[i].c:=inttostr(random(100)); at2[i].d:=sqrt(i); fs.write(at2[i],sizeof(t2)); end; fs.free; end; |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Спасибо
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: 2 Всего: 4 |
MBo, рад приветствовать тебя здесь.
Sorry, за off. -------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
А по другому как нельзя - все равно тип заранее надо определять, чего собственно я и хочу избежать... Как-то можно узнать указатель на область памяти занимаемую записью чтобы напрямую кусок памяти сбросить в файл? -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| MBo |
|
|||
|
Unregistered |
Немного не понял.
Как бы то ни было, при указании процедуре записать запись в файл нам непременно придется сказать ее имя. Раз знаем имя, известен и тип- ведь она где-то объявлена, и SizeOf сработает. Другое дело, если имеется только безличный указатель на некую запись, но до этого лучше обычно не доводить. Можно, конечно, спроектировать иерархию записей, в которой TBaseRec=record Size:Integer; Field1:.. Field2.. end; TSomeRec=record Size:Integer; ... end; т.е. всегда есть поле размера, из которого берем количество записываемых байт, хоть так p:pointer; l:integer; где-то раньше P:=@AnyConsistentRec; ... l:=PInteger(p)^;// size у нас всегда первый write(кудато, p, l); Чувствуется аналогия со многими структурами WinAPI, в которых имеется поле cbSize. Кроме того, так и хочется сделать 'эти штуки' наследниками TPersistent, и пусть они сами все про себя знают и умеют писаться в поток. |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Спасибо.
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |