Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.23;
Скачать: CL | DM;

Вниз

Не могу создать тип file of TMyType   Найти похожие ветки 

 
ZioN ©   (2004-01-11 14:19) [0]

Уважаемые мастера!
Возникла проблема. Plese, помогите решить.
У меня в модуле определ такой тип:

unit UMyType;

interface
uses
Classes;

type
TZad = record
usl:TStringList;
ans: string;
resh:TStringList;
pod: array[1..3] of string;
resheno:boolean;
end;

type
TMyType = record
Theory:TStringList;
zad:array[1..20] of TZad;
examlpes:array[1..5] of TZad;
end;

implementation
end.

В другом (или в этом - не имеет знчения) модуле определен еще один тип:

unit UMy;

interface
uses
UMyType;

type
TMainType = file of TMyType; // !
implementation
end
.

Не компилирует второй модуль, пишет ошибку:
[Error] Project1.dpr(9): Type "TMyType" needs finalization - not allowed in file type

Что это означает, и как исправить?
Заранее спасибо.


 
alex_*** ©   (2004-01-11 14:37) [1]

To declare a file type, use the syntax

type fileTypeName = file of type

where fileTypeName is any valid identifier and type is a fixed-size type.

!!!FIXED SIZE TYPE (TStringList)

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


 
Piter ©   (2004-01-11 14:44) [2]

Читаем HELP:

file cannot contain dynamic arrays, long strings, classes, objects, pointers, variants, other files, or structured types that contain any of these

Правильно, сам подумай - у тебя TMyType содержит объект (точнее, ссылку на него) Theory:TStringList. И как прикажешь компилятору сохранять объект? Методы как сохранять? Код их в ассемблере что ли писать? :)

Так что нельзя сохранять объекты. Да это и глупо, подумай о логике приложения


 
olookin ©   (2004-01-11 16:43) [3]

пиши в нетипизированный файл...

var f: file

f.blockwrite(zad[0].resheno,Sizeof(boolean));


 
Miwa ©   (2004-01-11 18:06) [4]

Повторюсь за мастерами.
Как уже заметили, у тебя проблемы с сохранением stringlist, но и не только его. Есть еще string с неопределенной длиной строки. Компилятору надо знать размер твоего TZad на стадии компиляции, а лист или стринг - это динамические структуры. Подумай, не лучше ли будет сохранять все это дело в базе данных а если нет - тогда задай конкретные величины полей, например:

type
str = string[64];
TZad = record
usl:array [1..3] of str;
ans:str;
resh:array [1..3] of str;
pod:array[1..3] of str;
resheno:boolean;
end;

Правда, в этом случае придется писать много лишней информации, но если нельзя уже на этапе проэктирования сказать, какие у тебя данные и сколько их, то чтобы не писать лишнее в файл - тогда только РБД.



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

Текущий архив: 2004.01.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
14-72888
Teren
2004-01-02 01:46
2004.01.23
Почему возникает ошибка?


3-72654
Evgeny78
2003-12-26 10:38
2004.01.23
Тип поля Memo


14-72870
EvgeniusII
2003-12-30 18:20
2004.01.23
Можно ли на Delphi


1-72722
незнайка_
2004-01-11 23:30
2004.01.23
строки подстроки


3-72660
Artemkin
2003-12-25 16:15
2004.01.23
IB Expert