Delphi. filewrite, ошибка - E2036 Требуется переменная - PullRequest
0 голосов
/ 09 февраля 2020

Я не использовал filewrite много времени.

Я сделал эту процедуру и получил следующую ошибку: E2036 Требуется переменная (для переменной flen в filewrite).

procedure TForm1.WriteFN(const PIN: integer);
var
  lFile: integer;
  flen : integer;
begin
  flen := 2;
  lFile := FileOpen('/sys/pins', fmOpenWrite);
  try
    if filewrite(lFile, PChar(IntToStr(PIN)), flen) = -1 then
      raise Exception.CreateFmt('Cannot export PIN%d', [PIN]);
  finally
    fileclose(lFile);
  end;
end;

Как решить эту проблему?

Delphi Rio, Win10.

1 Ответ

2 голосов
/ 10 февраля 2020

Второй параметр FileWrite() является нетипизированным const. Все, что вы передаете ему, передается по ссылке, и поэтому вы должны дать ему реальную переменную для ссылки. В этом случае вы можете просто разыменовать указатель PChar, который позволит параметру ссылаться на 1-й Char во временном String, который вы создаете, например:

FileWrite(lFile, PChar(IntToStr(PIN))^, flen)

Примечание, однако, FileWrite() работает с необработанными байтами, а не со строковыми символами. Вы говорите FileWrite() записать ровно 2 байта, что может работать или не работать должным образом, в зависимости от того, какую версию Delphi вы используете и какое значение содержит PIN.

Попробуйте вместо этого :

procedure TForm1.WriteFN(const PIN: integer);
var
  lFile: integer;
  flen : integer;
  s: AnsiString;
begin
  s := AnsiString(IntToStr(PIN));
  flen := Length(s);
  lFile := FileOpen('/sys/pins', fmOpenWrite);
  if lFile = -1 then
    raise Exception.CreateFmt('Cannot create file to export PIN%d', [PIN]);
  try
    if FileWrite(lFile, PAnsiChar(s)^, flen) = -1 then
      raise Exception.CreateFmt('Cannot write to file to export PIN%d', [PIN]);
  finally
    FileClose(lFile);
  end;
end;

Если вы используете современную версию Delphi, рассмотрите возможность использования TFile.WriteAllText() вместо:

uses
  ..., System.IOUtils;

procedure TForm1.WriteFN(const PIN: integer);
begin
  try
    TFile.WriteAllText('/sys/pins', IntToStr(PIN));
  except
    Exception.RaiseOuterException(
      Exception.CreateFmt('Cannot export PIN%d', [PIN])
    );
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...