2017-01-19 1 views
-3

я должен написать файл с именем файла, содержащего текущую дату .. все работает, кроме даты, это дает исключение класса «запуска ошибки (3)»Lazarus/паскаль файла записи с текущей датой

(importo.text является текст TEdit .. но я предполагаю, что это не имеет значения)

uses 
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; 

... 

var 
    contributo:real; 
    f:textfile; 
... 
    datee: string; 

... 

contributo:= (StrToInt(importo.text)/ 100)*4; 

    datee:= DateToStr(Date); 

    assignfile(f,'fattura minimi n.'+n.text+' '+datee+'.txt'); 
    rewrite(f); 

    writeln(f,'Giovanna Migliore'); 
    ... 

    closefile(f); 
+4

Сделайте некоторые отладки. Каково значение строки, которую вы используете в качестве имени файла. –

+0

RTE 3 путь не найден. Обратные косые черты в n.text или datee? Как предлагает Дэвид, проверьте правильность имени файла. –

ответ

6

DateToStr() возвращает дату, отформатированную в соответствии с региональными настройками. В вашем случае это почти наверняка возвращает символ разделителя папки/пути (/ или \), который вызывает проблему (путь не найден).

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

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

var 
    y, m, d: Word; 

.. 

    DecodeDate(Date, y, m, d); 
    dateStr := Format('%4d-%2d-%2d', [y, m, d]); 

    // e.g. dateStr value for 31st Dec 2016 would be: '2016-12-31' 

Вы могли бы тогда включить значения компонента даты в ваше имя файла либо путем конкатенации по мере необходимости, либо непосредственно в заявлении о едином формате:

filename := Format('fattura minimi n.%s %4d-%2d-%2d.txt [n.text, y, m, d]); 
assignfile(f, filename); 
+1

Этот вопрос и ответ оставляют меня удрученным об этом сайте. Я думаю, мы все это видели так много раз и сразу же узнали о проблеме. Кроме айзера. То, что действительно нужно искателю, - это отладка навыков. Задавая здесь вопросы, которые задавали так много раз, является плохой заменой для обучения отладке. Как мы можем научить этих людей ловить рыбу? –

+2

Вы можете использовать 'FormatDateTime()' вместо использования 'DecodeDate()' и 'Format()' отдельно: 'dateStr: = FormatDateTime ('yyyy" - "mm" - "dd', Date);' и даже что-то например: 'filename: = FormatDateTime ('" fattura minimi n.' + n.text + '"yyyy" - "mm" - "dd" .txt "', Date);' –

+2

@David - вы не можете научить * кого угодно * * ничего, если они не хотят учиться, и вы тратите свое время на то, чтобы тратить время. Обратите внимание, что этот ответ не просто дает решение проблемы. Это объясняет, почему существует проблема и аргументы в пользу решения. Сайт ** Q + A ** посвящен предоставлению полезных * ответов *, которые помогают людям учиться, а не отправлять людям упаковку только потому, что они еще не обладают навыками, которыми наслаждаются остальные из нас. Помочь кому-то научиться ловить рыбу, не нужно включать в то же время отказ от помощи в их голодном голоде. – Deltics

Смежные вопросы