我的代码不是放在窗体单元,而是公共单元中,没有窗体的,是不是这样的话就不好指定单击事件呀!谢谢。

解决方案 »

  1.   

    //显示当前系列的编码排列
    procedure ShowSeriesCode(TempQry: TADOQuery; CodeField: string; CodePanel: TPanel);
    var
      SeriesStr, TempStr, HintStr: string;
      i, TempTag: integer;
    begin
      {
      以逗号分隔各个编码位
      }
      SeriesStr := trim(TempQry.fieldbyname(CodeField).asstring);
      NowLeft := 0;
      TempTag:=0;
      //先释放对像
      for i := high(SeriesCode) downto low(SeriesCode) do
      begin
        SeriesCode[i].free;
        SeriesCode[i] := nil;
      end;
      //分析编码
      //最后一位不是逗号则加一个
      if copy(SeriesStr, length(SeriesStr), 1) <> ',' then
        SeriesStr := SeriesStr + ',';
      //得到编码个数
      CodeNumber := GetAppearTimes(',', SeriesStr);
      //根据每位上的值不同动态生成控件数组
      setlength(SeriesCode, CodeNumber);
      for i := 0 to CodeNumber - 1 do
      begin
        TempStr := GetSubstr(SeriesStr, ',', i + 1);
        //如果是*或字符,则生成edit
        if (TempStr = '*') or ((TempStr <> '*') and (TempStr <> '-')) then
        begin
          SeriesCode[i] := TEdit.Create(nil);
          SeriesCode[i].Visible := false;
          SeriesCode[i].Parent := CodePanel;
          SeriesCode[i].Name := 'CODE' + inttostr(i);
          SeriesCode[i].Height := HEIGHTPUB;
          SeriesCode[i].top := TOPPUB;
          if i = 0 then
            SeriesCode[i].Width := LENCODEPRE
          else
            SeriesCode[i].Width := LENCODE;      SeriesCode[i].Left := NowLeft;
          NowLeft := NowLeft + SeriesCode[i].Width + LENDIV;      if TempStr = '*' then
          begin
            (SeriesCode[i] as TEdit).Text := '';
            TempTag:=TempTag+1;
            (SeriesCode[i] as TEdit).tag := TempTag;
            //todo:编译不通过                                    <<------------------
            //(SeriesCode[i] as TEdit).OnClick:=CodeEditClick;
          end
          else
            (SeriesCode[i] as TEdit).Text := TempStr;      //如果有提示信息
          if (pos('(', TempStr) > 0) and (pos(')', TempStr) > 0) and (pos(')', TempStr) > pos('(', TempStr)) then
          begin
            HintStr := copy(TempStr,
              pos('(', TempStr) + 1,
              pos(')', TempStr) - pos('(', TempStr) - 1);
            (SeriesCode[i] as TEdit).Text := copy(TempStr, 1, pos('(', TempStr) - 1);
          end;      SeriesCode[i].Visible := true;    end;
        //如果是-号,则生成label
        if (TempStr = '-') then
        begin
          SeriesCode[i] := TLabel.Create(nil);
          SeriesCode[i].Visible := false;
          SeriesCode[i].Parent := CodePanel;
          SeriesCode[i].Name := 'CODE' + inttostr(i);
          SeriesCode[i].Height := HEIGHTPUB;
          SeriesCode[i].top := TOPPUB;
          SeriesCode[i].Width := LENDIV;      SeriesCode[i].Left := NowLeft;
          NowLeft := NowLeft + SeriesCode[i].Width + LENDIV;      (SeriesCode[i] as TLabel).caption := CHRDIV;      SeriesCode[i].Visible := true;    end;
      end;  if NowLeft > CodePanel.Parent.Width then
        CodePanel.Width := NowLeft
      else
        CodePanel.Width := CodePanel.Parent.Width;
    end;//编码的单击事件,得到当前编码的可选项
    procedure CodeEditClick(Sender: TObject);
    begin
      showmessage('a');
    end;此代码在公共单元,被主窗体调用,但有问题。
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        procedure ButtonOnClick(Sender : TObject);
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ButtonOnClick(Sender: TObject);
    begin
      case  TButton(Sender).Tag of
          0 : begin
                ShowMessage('Button0.Clicked');
              end;
          1 : begin
                ShowMessage('Button1.Clicked');
              end;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      i : integer;
    begin
      for i := 0 to 1 do
      with TButton.Create(self) do
      begin
        OnClick := ButtonOnClick;
        Tag := i;
        Parent := Self;
        Top := (i+1)*100;
        Left := 50;
        Caption := format('Button%d',[i]);
      end;
    end;end.
      

  3.   

    谢谢楼上,我把公共单击代码移到主窗体单元就可以,但放在pub.pas中就不行,为什么呀?要不然,代码和界面又混一块儿了。
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        procedure ButtonOnClick(Sender : TObject);
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}// 如果FormCreate是这样.
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i : integer;
    begin
      for i := 0 to 1 do
      begin
        with TButton.Create(self) do
        begin
          OnClick := ButtonOnClick;
          Tag := i;
          Parent := Self;
          Top := (i+1)*100;
          Left := 50;
          Caption := format('Button%d',[i]);
        end;
        with TEdit.Create(self) do
        begin
          tag:=i;
          Parent:=self;
          top:=(i+1)*100;
          left:=80;
        end;
      end;
    end;
    procedure TForm1.ButtonOnClick(Sender: TObject);
    begin
      case  TButton(Sender).Tag of
          0 : begin
    { 这里该如何给TEdit赋值? 假设按下第一个button就给第一个EDIT赋值,按第二个BUTTON就能第二个赋值... }
              end;
          1 : begin
                ShowMessage('Button1.Clicked');
              end;
      end;
    end;
    end.
      

  5.   

    楼上的,你的问题可以这样解决,我是用控件数组实现你这种要求的,先创建button和edit的动态数组,然后在生成控件时为数组赋值,然后取相应的索引值就可以很方便的引用对象了。