你的问题实际上就是动态生成控件及控件单击事件的赋值问题,这貌似没什么难的吧?给你一段示例代码参考一下:...uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;type TfrmTest = class(TForm) ... private procedure eCodeChange(Sender: TObject); // Edit 的 OnChange 事件定义 function InputBox(LabelCaption: string; Flag: Integer): string; public { Public declarations } end;var frmTest: TfrmTest; eCode: TEdit;implementation {$R *.dfm}procedure TfrmTest.eCodeChange(Sender: TObject);begin if Trim(eCode.Text) <> '' then mmoName.Text := Trim(eCode.Text) else mmoName.Clear;end;function TfrmTest.InputBox;var Form: TForm; btnOK: TButton;begin Form := TForm.Create(frmTest); with Form do begin Canvas.Font := Font; BorderStyle := bsDialog; FormStyle := fsStayOnTop; with Font do begin Height := -14; Name := '宋体'; Size := 9; Pitch := fpDefault; Style := []; end; ClientWidth := 180; Position := poDesktopCenter; Caption := '请选择'; eCode := TEdit.Create(Form); with eCode do begin Parent := Form; Left := 8; Top := 8; Width := 60; OnChange := eCodeChange; // OnChange 事件赋值 end; btnOK := TButton.Create(Form); with btnOK do begin Parent := Form; Caption := '确定(&O)'; Default := True; ModalResult := mrOk; ...; // 指定按钮的 Left, Top等信息 Form.ClientHeight := Top + Height + 7; end; // 相关控件的释放 FreeAndNil(...); Free; // 窗体释放 end;end;end.你要解决的问题还有:1、根据从数据库表里读取菜品名称的记录数(比如1000条)循环生成按钮并赋Caption为单价,其实最重要的是生成它们的Name,建议你就用btn1、btn2...的方式(后面的数字就是循环变量);2、在循环中控制按钮的位置(主要是Left、Top属性);3、按钮OnClick事件的赋值,这个你要设计一下,弄不好要写N多代码就不好了,给你个思路:如果单价没有小数,就把单价赋给按钮的Tag属性,那么在单击事件中就可以根据Tag进行处理,这样就实现了N多按钮的单击事件可以赋给一个过程,大大简化了代码工作量。其它的你自己想想吧,祝你好运。