Как исправить конфликт имен и границ? - PullRequest
2 голосов
/ 01 января 2012

Ошибка: типы фактических и формальных параметров var должны быть идентичны

unit unAutoKeypress;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure SimulateKeyDown(Key:byte);
begin
keybd_event(Key,0,0,0);
end;

procedure SimulateKeyUp(Key:byte);
begin
keybd_event(Key,0,KEYEVENTF_KEYUP,0);
end;

procedure doKeyPress(var KeyValue:byte);
begin
 SimulateKeyDown(KeyValue);
 SimulateKeyUp(KeyValue);
end;



procedure TForm1.Button1Click(Sender: TObject);
const test = 'merry Christmas!';
var m: byte;
begin
Memo2.SetFocus();
m:=$13;
doKeyPress(m); // THIS IS WHERE ERROR
end;

end.

всегда ошибка в функции doKeyPress (m);простой вопрос, почему?

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

Ответы [ 2 ]

7 голосов
/ 01 января 2012

TForm наследуется от TWinControl, и есть метод с именем DoKeyPress, объявленный в TWinControl, который находится в текущей области видимости компилятора внутри события ButtonClick.

5 голосов
/ 01 января 2012

Проблема в том, что doKeyPress - это метод TForm1 (унаследованный от TWinControl), и поэтому, когда вы пишете doKeyPress в методе TForm1, компилятор хочет использовать TForm1.doKeyPress вместо локальногофункция.Область действия класса ближе, чем область локальной функции.

Возможные решения включают в себя:

  • Переименование локальной функции, чтобы избежать конфликта.
  • Использование полностью определенного имени, unAutoKeypress.doKeyPress.

Первое, по моему мнению, является лучшим решением.

...