зачем читать процедуру вставки новой строки, если пользователь нажал клавишу ввода? - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь работать с процедурой «Чтение» вместо «ReadLn» в Free Pascal IDE, но когда я нажимаю клавишу ввода после ввода значения, я получаю новую строку, как «readln» делает ....

program test;
uses
  crt;
var
  AName: string[20];

function Complete_Rectangle(ALength_NewValue, ALength_Rectangle, ALength_Pref: byte): string;
const
  Stars : string = '**';
var
  Space_Str: string;
  I,
  Space_Needed : byte;
begin
  Space_Needed := ALength_Rectangle - ALength_Pref; (* Calculate Needed Space.... *)
  Space_Str  := '';

  for I:=1 to Space_Needed -(ALength_NewValue + 2) do  (* 2 represent the length of Stars Constant *)
  begin
    Space_Str := Space_Str + ' ';
  end;

  Complete_Rectangle := Space_Str + Stars;
end;

begin
  clrscr;
  writeln('**********************************************************************');
  writeln('**                                                                  **');
    write('**  [*] add your Name here: '); read(AName); writeln(Complete_Rectangle(length(AName), 70, 28));
    (* 70 represent the length of rectangle spaces and 28 represent the length of this prefix text "**  [*] add your Name here: " *)
  writeln('**                                                                  **');
  writeln('**********************************************************************');
  readkey;
end.

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

procedure Lire(AVariant: Variant);
var
  I: byte;
  AKey: Char;
  AReadStr: String;
begin
  I := 1;
  AReadStr := '';
  AKey := char('');

  repeat
    AKey := ReadKey;
    if not (AKey = #13) then
    begin
      AReadStr[I] := AKey;
      write(AKey);
      inc(I);
    end;
  Until AKey = #13;
  case varType(AVariant) of
    varString: begin AVariant := AReadStr; end;
    varInteger: begin AVariant := StrToInt(AReadStr); end;
    varByte: begin AVariant := StrToInt(AReadStr); end;
    varBoolean: begin AVariant := StrToBool(AReadStr); end;
    (* ..... and so on *)
  end;


end;

1 Ответ

1 голос
/ 22 мая 2019

Операторы Read и Readln являются общими для обоих: получение ввода с клавиатуры И чтение данных из файла .

О Readln из документов:

считывает одно или несколько значений из файла F и сохраняет результат в V1, V2 и т. д. После этого он переходит на следующую строку в файле .

О Чтение из документов:

считывает одно или несколько значений из файла F и сохраняет результат в V1,V2 и т. Д.

Таким образом, при чтении из файла readln переходит на следующую строку, а чтение - нет.Но это не ожидаемое поведение в отношении ввода с консоли.

Если вы действительно хотите расположить курсор на экране, я бы посоветовал использовать старую команду gotXY, которая также доступна в FreePascal. Ссылка на gotoXY

Например:

write('**  [*] add your Name here: '); 
read(AName); 
gotoXY(28 + length(AName)+ 1, WhereY-1); // Repositionate the cursor to the right Position.
writeln(Complete_Rectangle(length(AName), 70, 28));
...