Delphi调用onkeypress

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi调用onkeypress相关的知识,希望对你有一定的参考价值。

我想在一个窗体弹出后点击按钮后引发一个回车事件,
Edit1.OnKeyPress(sender,Key);
后面的参数是什麽啊?
[Error] Testhand.pas(173): Types of actual and formal var parameters must be identical
后面的错误是我参数设置sender设为窗体,或是Edit1本身,key为#13都报错
请大侠们指点指点

参考技术A sender就是edit本身,所以你写edit1就可以了
第二个key 要传地址,所以不能用常量#13,你定义一个char类型c:=#13.
然后txt1KeyPress(txt1,c);保你管用本回答被提问者采纳
参考技术B edit1的OnKeyPress事件:
procedure TLoginForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if (key = #13) then //在Edit1输入完后敲入回车键,SpeedButton1执行单击操作
SpeedButton1Click(Sender) ;
end;
参考技术C 调用错误,应该调用事件
比如,Edit1的OnKeyPress事件
TForm1.Edit1KeyPress(Sender,Key)
参考技术D procedure TForm1.Button1Click(Sender: TObject);
var Key: Char;
begin
Key := #97;
Edit1.OnKeyPress(Sender, Key);
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
ShowMessage(Key)
end;

有没有办法在一秒钟后调用 onkeypress 事件,这样它就不会多次触发一个方法?

【中文标题】有没有办法在一秒钟后调用 onkeypress 事件,这样它就不会多次触发一个方法?【英文标题】:Is there a way to call the onkeypress event after a second so that it wouldn't fire a method a bunch of times? 【发布时间】:2021-07-29 13:42:45 【问题描述】:

我正在编写一个程序,该程序调用一个使用文本框在表格上显示数据的方法。问题是它每次调用程序超过 10 次。有没有办法避免这种情况?

这是文本框:

<input #input matInput placeholder="Search data" (keyup)="onKeypressEvent($event)">

这是我调用的方法:

  onKeypressEvent(event: any)
    fromEvent(this.input.nativeElement,'keyup')
        .pipe(
            debounceTime(150),
            distinctUntilChanged(),
            tap(() => 
                this.paginator.pageIndex = 0;
                this.loadData();
            )
        )
        .subscribe();
  

【问题讨论】:

【参考方案1】:

发生这种情况是因为每次按键都会创建一个新链,因此debounceTime() 没有什么可以去抖动。而是制作一个主题并按下按键。然后在构造函数或 onInit() 中只订阅一个:

keyPress$ = new Subject();

...

keyPress$.pipe(
  debounceTime(150),
  distinctUntilChanged(),
  tap(() => 
    this.paginator.pageIndex = 0;
    this.loadData();
  ),
).subscribe();

...

onKeypressEvent(event: any) 
  this.keyPress$.next(event);
);

【讨论】:

您可以将tap 代码移动到subscribe 方法。结果相同,但我猜更容易阅读 @martin 数据加载速度变慢是有原因的还是因为去抖动时间? @kajl16 这就是debounceTime 所做的。也许看看auditTimesampleTimethrottleTime【参考方案2】:

根据您现有的代码,您似乎正在使用@viewChild()

这是简单而有效的解决方案。这样可以避免使用额外的Subject

ngAfterViewInit() 
    fromEvent(this.input.nativeElement, "keyup")
      .pipe(debounceTime(1000)) // Update the debouceTime as per your wish
      .subscribe((val: KeyboardEvent) => 
        console.log(this.input.nativeElement.value);
      );
  

别忘了在onDestroy退订。

【讨论】:

以上是关于Delphi调用onkeypress的主要内容,如果未能解决你的问题,请参考以下文章

delphi调用VC写的Dll报错

delphi 怎么调用百度地图API,如下

delphi如何调用DLL

C#调用delphi记录结构体问题

delphi 调用 EXE 并在Panle中运行

delphi xe 移动开发 调用截屏