Ошибка какая то связанная с типом.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ошибка какая то связанная с типом.

Сообщение gen » 10.08.2009 21:20:49

unit3.pas(54,26) Error: Incompatible type for arg no. 1: Got "File Of users", expected "AnsiString"
fileutil.inc(839,10) Hint: Found declaration: FileSize(const AnsiString):Int64;
unit3.pas(76) Fatal: There were 1 errors compiling module, stopping



Код: Выделить всё
procedure  AddUser;
type
users=record
nom:integer;
fio:string;
email:string;
end;
var
fuser:file of users;
work:users;
begin
assign(fuser,'user.txt');
{$i-}
reset(fuser);
{$i+}
if (ioresult<>0) then
begin
showmessage('File users.dat not found');
end
else
begin
[b]seek(fuser,filesize(fuser));[/b]// вот тут ошибка возникает

work.nom:=filepos(fuser);
work.fio:=Form3.LabeledEdit1.Text;
work.email:=Form3.LabeledEdit2.Text;

write(fuser,work);
close(fuser);
end;
end;

gen
новенький
 
Сообщения: 74
Зарегистрирован: 18.06.2009 21:04:22

Re: Ошибка какая то связанная с типом.

Сообщение eastorwest » 10.08.2009 21:51:28

Функция FileSize присутствует в двух стандартных модулях:
1) FileUtil:
function FileSize( const Filename: String):Int64;

2) System
function FileSize( var f: file):Int64;

Видимо, в модуле unit3 используются оба.
Укажите явно, какую из этих функций вы пытаетесь вызвать, т.е. замените filesize(fuser) на System.filesize(fuser)
eastorwest
новенький
 
Сообщения: 57
Зарегистрирован: 23.07.2009 20:21:46
Откуда: Н-ск

Re: Ошибка какая то связанная с типом.

Сообщение gen » 11.08.2009 13:06:48

угу. отлично. Ошибка пропала. Только почему-то возникла ещё одна проблема. Понять не могу почему так.
Вот код переделал
Код: Выделить всё
procedure  AddUser;
type
users=record
nom:integer;
fio:string;
email:string;
end;
var
fuser:file of users;
work:users;
begin
assign(fuser,'user.txt');
{$i-}
reset(fuser);
{$i+}
if (ioresult<>0) then
begin
showmessage('File users.dat not found');
end
else
begin
seek(fuser,System.filesize(fuser));

work.nom:=System.filepos(fuser);
work.fio:=Form3.LabeledEdit1.Text;
work.email:=Form3.LabeledEdit2.Text;

write(fuser,work);
close(fuser);
end;

end;     


По логике он в конец фаила должен записать новую запись,но это почему -то не происходит. Фаил типизированный,как вы поняли. Смотрел в пошаговом режиме (все ОК). Выполняется write(fuser,work); без ошибок, но запись не ведется. Почему так может возникнуть?
Для типизированного фаила reset можно использовать для записи и чтения.
gen
новенький
 
Сообщения: 74
Зарегистрирован: 18.06.2009 21:04:22

Re: Ошибка какая то связанная с типом.

Сообщение Putnick » 11.08.2009 16:22:47

Уважаемый, gen.
Проверил вашу программу — работает.
Правда, есть пара замечаний:
1. вместо assign и close лучше использовать AssignFile и CloseFile (как говорится, "во избежание");
2. заметно более важный момент (сам в своё время от него пострадал), видите ли, ObjectPascal по умолчанию под типом string подразумевает AnsiString (ну а FreePascal сейчас, видимо, WideString), т.е. при сохранении Вашей переменной будет сохранен не сам текст строки, а указатель на него. (в итоге размер записи в Вашем случае будет всегда 12 байт), чтобы этого избежать Вы должны или явно указать, что строка имеет тип ShortString, или, не менее явно:), её максимальную длину, т.е. переменная вот такого типа:
Код: Выделить всё
type
users=record
nom:integer;
fio:string[50];
email:shortstring;
end;

запишется корректно, правда, длина записи будет 312 байт.
Надеюсь, сказанное Вам помогло.

С уважением, Алексей.
Putnick
новенький
 
Сообщения: 62
Зарегистрирован: 18.03.2009 13:02:56

Re: Ошибка какая то связанная с типом.

Сообщение gen » 13.08.2009 15:26:12

Putnick писал(а):Уважаемый, gen.
Проверил вашу программу — работает.
Правда, есть пара замечаний:
1. вместо assign и close лучше использовать AssignFile и CloseFile (как говорится, "во избежание");
2. заметно более важный момент (сам в своё время от него пострадал), видите ли, ObjectPascal по умолчанию под типом string подразумевает AnsiString (ну а FreePascal сейчас, видимо, WideString), т.е. при сохранении Вашей переменной будет сохранен не сам текст строки, а указатель на него. (в итоге размер записи в Вашем случае будет всегда 12 байт), чтобы этого избежать Вы должны или явно указать, что строка имеет тип ShortString, или, не менее явно:), её максимальную длину, т.е. переменная вот такого типа:
Код: Выделить всё
type
users=record
nom:integer;
fio:string[50];
email:shortstring;
end;

запишется корректно, правда, длина записи будет 312 байт.
Надеюсь, сказанное Вам помогло.

С уважением, Алексей.


ухх. спасибо все бы так отвечали)))
gen
новенький
 
Сообщения: 74
Зарегистрирован: 18.06.2009 21:04:22


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

Рейтинг@Mail.ru