Преобразуйте целые числа в строки для создания выходных имен файлов во время выполнения

Используйте Unassigned

procedure  TForm1.FldOnValidate(AField : TField);
begin
    if Sender.OldValue <> Unassigned then
      if Sender.NewValue <= Sender.OldValue then
        raise Exception.Create('The new value is not bigger than the previous one');
end;

Но правильное место - OnChange событие

procedure TForm1.ClientDataSet1ValChange(Sender: TField);

begin
    if Sender.OldValue <> Unassigned then
      if Sender.NewValue <= Sender.OldValue then
        raise Exception.Create('The new value is not bigger than the previous one');
end;
44
задан Alasdair 29 September 2017 в 14:39
поделиться

3 ответа

вы можете писать в модуль, но вы также можете писать в строку

program foo
    character(len=1024) :: filename

    write (filename, "(A5,I2)") "hello", 10

    print *, trim(filename)
end program

Обратите внимание (это второй трюк, о котором я говорил), что вы также можете построить строку формата программно .

program foo

    character(len=1024) :: filename
    character(len=1024) :: format_string
    integer :: i

    do i=1, 10
        if (i < 10) then
            format_string = "(A5,I1)"
        else
            format_string = "(A5,I2)"
        endif

        write (filename,format_string) "hello", i
        print *, trim(filename)
    enddo

end program
48
ответ дан 26 November 2019 в 22:06
поделиться

Я уже пробовал @Alejandro и @ user2361779, но это дает мне неудовлетворенный результат, такой как file 1.txt или file1 .txt вместо file1.txt. Однако я нахожу лучшее решение:

...
integer :: i
character(len=5) :: char_i     ! use your maximum expected len
character(len=32) :: filename

write(char_i, '(I5)') i        ! convert integer to char
write(filename, '("path/to/file/", A, ".dat")') trim(adjustl(char_i))
...

Объяснение:

например. set i = 10 и write(char_i, '(I5)') i

char_i                gives  "   10" ! this is original value of char_i

adjustl(char_i)       gives  "10   " ! adjust char_i to the left

trim(adjustl(char_i)) gives  "10"    ! adjust char_i to the left then remove blank space on the right

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

0
ответ дан fronthem 26 November 2019 в 22:06
поделиться

Чтобы преобразовать целое число в строку:

integer :: i    
character* :: s    
if (i.LE.9) then
     s=char(48+i)    
else if (i.GE.10) then
     s=char(48+(i/10))// char(48-10*(i/10)+i)    
endif
-1
ответ дан francescalus 26 November 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: