【问题标题】:Creating buttons using WinAPI [closed]使用 WinAPI 创建按钮 [关闭]
【发布时间】:2020-06-15 09:54:50
【问题描述】:

输出错误数据:

[dcc32 Error] Unit1.pas(45): E2003 Undeclared identifier: 'hButton'
[dcc32 Error] Unit1.pas(53): E2003 Undeclared identifier: 'id_Button'
[dcc32 Fatal Error] Project1.dpr(6): F2063 Could not compile used unit 'Unit1.pas'

请告诉我们问题出在哪里。

我的代码:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, Windows, Messages;

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

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
 const
  sClassName = 'MyWindow';
var
  hWnd: THandle;        // идентификатор окна (дескриптор)
  WndClass: TWndClass;  //структура WndClass
  Msg: TMsg;       //структура для принятия сообщений
  function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer;  stdcall; export;
{функция окна}
begin
  Result := 0;
  case uMsg of
    WM_DESTROY: //если uMsg равна WM_DESTROY(код закрытия окна), то закрываемся
      begin
        halt(0);
      end;
    WM_CREATE: begin
      // создание кнопки
      hButton := CreateWindowEx (0,
        'BUTTON', // определенный класс кнопки
        '&Нажмите здесь', // надпись на кнопке
        ws_Child or ws_Visible
          or bs_PushButton, // стили для кнопки
        10, 10, // координаты левого верхнего угла
        200, 80, // размер
        hWnd, // handle родителя
        id_Button, // идентификатор кнопки (задается программистом)
        hInstance,
        nil);
      end;
    WM_COMMAND:
      // проверяем, от какой кнопки пришло сообщение
      if LoWord (wParam) = id_Button then
        // если это событие - click
        if HiWord (wParam) = bn_Clicked then
          // код обработки нажатия кнопки
          MessageBox (hWnd, 'Вы нажали на кнопку', '', MB_OK);
  end;
  Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;

end;

end.

【问题讨论】:

  • 您忘记声明 hButton 变量。此外,您忘记定义 id_Button 常量。
  • 我根本不明白结构。为什么你的Button1Click 中有一个WindowProc 函数?
  • 您是否正在尝试构建混合 FMX + VCL 应用程序?如果是这样,您需要 FMX 部件做什么?

标签: delphi winapi


【解决方案1】:

编译器错误的直接原因是变量 hButton 和 id_button 没有在 var 部分中声明。

但是您的代码看起来很奇怪。它看起来像是一个 Windows 消息处理例程(适合低级消息处理循环的东西)奇怪地放置在现有按钮的 OnClick 的事件处理程序中。

如果您的真正目的只是创建一个新按钮,请尝试这样的事情(我为表单的 OnMouseUp 事件创建了一个事件处理程序,但您可以使用其他东西):

uses
  Vcl.StdCtrls;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Integer);
var
  B: TButton;
begin
  B := TButton.Create(Self);
  B.Left := X;
  B.Top := Y;
  B.Width := 100;
  B.Caption := 'X = ' + IntToStr(X) + ', Y = ' + IntToStr(Y);
  B.Parent := Self;
  B.OnClick := MyButtonClickHandler;
end;

procedure TForm1.MyButtonClickHandler(Sender: TObject);
begin
  ShowMessage('Привет!');
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2010-12-11
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多