delphi 是否可以将为组件创建的变量与单击事件一起使用?

dsf9zpds  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(175)

我有56个面板,我创建了一个循环,通过它们选择一个随机面板。选择了一个随机面板后,我使用FindComponent()和随机面板的名称,并为随机面板赋值一个变量。现在我有了一个随机面板作为变量,我想做的是使用OnClick事件和变量。但是我在使用它时遇到了问题。我想在单击该面板后显示一个ShowMessage()

  1. procedure TForm1.btnStartClick(Sender: TObject);
  2. var
  3. iRandomNum, iCharRandom, iCnt: integer;
  4. cChar: char;
  5. sPanelName: string;
  6. begin
  7. Randomize;
  8. iRandomNum := Random(7 - 1 + 1) + 1;
  9. iCharRandom := Random(8 - 1 + 1) + 1;
  10. case iCharRandom of
  11. 1:
  12. cChar := 'A';
  13. 2:
  14. cChar := 'B';
  15. 3:
  16. cChar := 'C';
  17. 4:
  18. cChar := 'D';
  19. 5:
  20. cChar := 'E';
  21. 6:
  22. cChar := 'F';
  23. 7:
  24. cChar := 'G';
  25. 8:
  26. cChar := 'H';
  27. end;
  28. sPanelName := 'pnl' + cChar + IntToStr(iRandomNum);
  29. for iCnt := 1 to 56 do
  30. begin
  31. pnlCorrect := FindComponent(sPanelName) as TPanel;
  32. end;
  33. pnlCorrect.OnClick := showmessage('Correct panel');
  34. end;

我尝试只显示ShowMessage()和变量的OnClick事件,但是不起作用。我一直收到运行时错误。

编辑:

我的新代码添加在下面...

  1. procedure btnTest1Click(Sender: TObject);
  2. private
  3. procedure pnlCorrectClick(Sender: TObject);
  4. procedure pnlWrongClick(Sender: TObject);
  5. { Private declarations }
  6. public
  7. { Public declarations }
  8. end;
  9. ...
  10. procedure TForm1.btnTest1Click(Sender: TObject);
  11. var
  12. i, j: Integer;
  13. function FindPanel(iChar, iNum: Integer): TPanel;
  14. var
  15. cChar: Char;
  16. sPanelName: string;
  17. begin
  18. cChar := Char(Ord('A') + iChar);
  19. sPanelName := 'pnl' + cChar + IntToStr(iNum);
  20. Result := FindComponent(sPanelName) as TPanel;
  21. redGameTest.Lines.Add(sPanelName);
  22. end;
  23. begin
  24. // reset the OnClick events of the panels first...
  25. for i := 0 to 6 do
  26. begin
  27. for j := 1 to 8 do
  28. FindPanel(i, j).OnClick := pnlWrongClick;
  29. end;
  30. // now, pick a random panel and assign its OnClick event...
  31. FindPanel(Random(8), Random(7) + 1).OnClick := pnlCorrectClick;
  32. end;
  33. ...
  34. procedure TForm1.FormCreate(Sender: TObject);
  35. begin
  36. Randomize;
  37. end;
  38. ...
  39. procedure TForm1.pnlCorrectClick(Sender: TObject);
  40. begin
  41. ShowMessage('Correct panel');
  42. end;
  43. procedure TForm1.pnlWrongClick(Sender: TObject);
  44. begin
  45. ShowMessage('Wrong panel');
  46. end;

调试器异常通知显示:
项目PAT_P.exe引发了异常类$C0000005,并显示消息“在0x0062a218发生访问冲突:写入地址0x00000124“。

5f0d552i

5f0d552i1#

您不能像您尝试的那样,将showmessage('Correct panel');这样的表达式直接赋给OnClick事件。事件应该被赋给一个类方法。
请尝试以下内容:

  1. type
  2. TForm1 = class(TForm)
  3. published
  4. btnStart: TButton;
  5. PanelA1: TPanel;
  6. ...
  7. procedure FormCreate(Sender: TObject);
  8. procedure btnStartClick(Sender: TObject);
  9. ...
  10. private
  11. ...
  12. procedure pnlCorrectClick(Sender: TObject);
  13. procedure pnlWrongClick(Sender: TObject);
  14. ...
  15. end;
  16. ...
  17. procedure TForm1.FormCreate(Sender: TObject);
  18. begin
  19. Randomize;
  20. end;
  21. procedure TForm1.btnStartClick(Sender: TObject);
  22. var
  23. i, j: Integer;
  24. function FindPanel(iChar, iNum: Integer): TPanel;
  25. var
  26. cChar: Char;
  27. sPanelName: string;
  28. begin
  29. cChar := Char(Ord('A') + iChar);
  30. sPanelName := 'pnl' + cChar + IntToStr(iNum);
  31. Result := FindComponent(sPanelName) as TPanel;
  32. end;
  33. begin
  34. // reset the OnClick events of the panels first...
  35. for i := 0 to 7 do
  36. begin
  37. for j := 1 to 7 do
  38. FindPanel(i, j).OnClick := pnlWrongClick;
  39. end;
  40. // now, pick a random panel and assign its OnClick event...
  41. FindPanel(Random(8), Random(7) + 1).OnClick := pnlCorrectClick;
  42. end;
  43. procedure TForm1.pnlCorrectClick(Sender: TObject);
  44. begin
  45. ShowMessage('Correct panel');
  46. end;
  47. procedure TForm1.pnlWrongClick(Sender: TObject);
  48. begin
  49. ShowMessage('Wrong panel');
  50. end;

话虽如此,我还是建议将所有面板放在前面的数组中,这样在单击按钮时就不必按名称搜索任何面板了,例如:

  1. type
  2. TForm1 = class(TForm)
  3. published
  4. btnStart: TButton;
  5. PanelA1: TPanel;
  6. ...
  7. procedure FormCreate(Sender: TObject);
  8. procedure btnStartClick(Sender: TObject);
  9. ...
  10. private
  11. Panels: array[0..55] of TPanel;
  12. procedure pnlCorrectClick(Sender: TObject);
  13. procedure pnlWrongClick(Sender: TObject);
  14. ...
  15. end;
  16. ...
  17. procedure TForm1.FormCreate(Sender: TObject);
  18. var
  19. i, j, k: Integer;
  20. function FindPanel(iChar, iNum: Integer): TPanel;
  21. var
  22. cChar: Char;
  23. sPanelName: string;
  24. begin
  25. cChar := Char(Ord('A') + iChar);
  26. sPanelName := 'pnl' + cChar + IntToStr(iNum);
  27. Result := FindComponent(sPanelName) as TPanel;
  28. end;
  29. begin
  30. Randomize;
  31. k := 0;
  32. for i := 0 to 7 do
  33. begin
  34. for j := 1 to 7 do
  35. begin
  36. Panels[k] := FindPanel(i, j);
  37. Inc(k);
  38. end;
  39. end;
  40. end;
  41. procedure TForm1.btnStartClick(Sender: TObject);
  42. var
  43. i: integer;
  44. begin
  45. // reset the OnClick event of the panels first...
  46. for i := Low(Panels) to High(Panels) do
  47. Panels[i].OnClick := pnlWrongClick;
  48. // now, pick a random panel and assign its OnClick event...
  49. Panels[Random(56)].OnClick := pnlCorrectClick;
  50. end;
  51. procedure TForm1.pnlCorrectClick(Sender: TObject);
  52. begin
  53. ShowMessage('Correct panel');
  54. end;
  55. procedure TForm1.pnlWrongClick(Sender: TObject);
  56. begin
  57. ShowMessage('Wrong panel');
  58. end;
展开查看全部

相关问题