注册 登录
编程论坛 Delphi论坛

大牛帮看下这个程序 为什么没反应。

有容就大 发布于 2012-12-19 11:11, 1480 次点击
RT 我想要的效果是 通过在窗体上点击鼠标 创建焦点所在RadioButton指示的控件。
 也就是这个样子。
只有本站会员才能查看附件,请 登录

我写了个程序 打包如下 热心人帮看看。
只有本站会员才能查看附件,请 登录

顺便发下工程文件和源文件。
CRefRorm.pas
程序代码:
unit CRefForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  // Class reference type (redeclaration)
  TControlClass = class of TControl;

  TCRefForm1 = class(TForm)
    Panel1: TPanel;
    RbtnRadio: TRadioButton;
    RbtnButton: TRadioButton;
    RbtnEdit: TRadioButton;
    procedure RbtnEditClick(Sender: TObject);
    procedure RbtnButtonClick(Sender: TObject);
    procedure RbtnRadioClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
    ClassRef: TControlClass;
    Counter: Integer;
  public
    { Public declarations }
  end;

var
  CRefForm1: TCRefForm1;

implementation

{$R *.dfm}

procedure TCRefForm1.RbtnButtonClick(Sender: TObject);
begin
  ClassRef := TButton;
end;

procedure TCRefForm1.RbtnEditClick(Sender: TObject);
begin
  ClassRef := TEdit;
end;

procedure TCRefForm1.RbtnRadioClick(Sender: TObject);
begin
  ClassRef := TRadioButton;
end;

procedure TCRefForm1.FormCreate(Sender: TObject);
begin
  ClassRef := TRadioButton;
end;

procedure TCRefForm1.FormMouseDown(
  Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  NewCtrl: TControl;
  CtrlName: string;
begin
  // Create the Control
  NewCtrl := ClassRef.Create(Self);
  // hide it temporarily, to avoid flickering
  NewCtrl.Visible := False;
  // set parent and position
  NewCtrl.Parent := Self;
  NewCtrl.Left := X;
  NewCtrl.Top := Y;
  // compute the unique name (and caption)
  Inc(Counter);
  CtrlName := ClassRef.ClassName + IntToStr(Counter);
  Delete (CtrlName, 1, 1);
  NewCtrl.Name := CtrlName;
  NewCtrl.Visible := True;
end;

end.
ClassReference.bdsproj
程序代码:
program ClassReference;

uses
  Forms,
  CRefForm in 'CRefForm.pas' {CRefForm1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TCRefForm1, CRefForm1);
  Application.Run;
end.


检查了多次 那里有问题 为什么我点击鼠标没反应?

只有本站会员才能查看附件,请 登录

百分求解。。。
23 回复
#2
信箱有效2012-12-19 11:13
pascal呀 以前学过 早忘了 切点分
#3
有容就大2012-12-19 11:18
回复 2楼 信箱有效
信箱大帅哥 帮看下啊
搞这么久WIN32编程 这个对于你没什么难度啦
可是我刚搞 师傅叫我自学 他急着赶项目不好打扰他啊
再说这个东西我检查多次应该没写错代码啊 奇怪的东东。。。
#4
wp2319572012-12-19 11:20
只有本站会员才能查看附件,请 登录


貌似没啥问题啊
#5
wp2319572012-12-19 11:21
程序代码:
procedure TCRefForm1.FormMouseDown(
  Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  NewCtrl: TControl;
  CtrlName: string;
begin
  //showmessage('ok');   //你加一句这个试试  如果能获得控制权  再注释或删除之
  // Create the Control
  NewCtrl := ClassRef.Create(Self);
  // hide it temporarily, to avoid flickering
  NewCtrl.Visible := False;
  // set parent and position
  NewCtrl.Parent := Self;
  NewCtrl.Left := X;
  NewCtrl.Top := Y;
  // compute the unique name (and caption)
  Inc(Counter);
  CtrlName := ClassRef.ClassName + IntToStr(Counter);
  Delete (CtrlName, 1, 1);
  NewCtrl.Name := CtrlName;
  NewCtrl.Visible := True;
end;
#6
有容就大2012-12-19 11:30
回复 5楼 wp231957
谢谢W版帮忙
我加了 不过运行后没反应 没有OK的消息框出来。。
我想了下 有几个问题想弄明白。
在我制作这个东西时有的步骤可能有问题:
我是先添加Tpanel控件的 但是当时不知道这个东西有什么用
在后面添加TRadioButton控件时 就没放到它上面 后来才移动到它上面的 这样会有问题么?

还有就是那个FormCreate()函数 我是自己写的 也就是说没有在Form窗体上双击 这样是不是会让自己写的函数无效?


[ 本帖最后由 有容就大 于 2012-12-19 11:31 编辑 ]
#7
有容就大2012-12-19 11:36
再补充下 我那个FormMouseDown()函数也是自己写的 没有在窗体的event里双击选择OnMouseDown来进行自动编码
是不是就是这个问题?
为什么DELPHI大部分东西都能自动生成 和以前的大不同啊
#8
wp2319572012-12-19 11:45
那2006和7还不一样

我一个字都没动你的代码 啊  
#9
有容就大2012-12-19 11:48
以下是引用wp231957在2012-12-19 11:45:55的发言:

那2006和7还不一样

我一个字都没动你的代码 啊  
我想应该是先点击一个控件的EVENT事件自动生成函数 然后再添加代码才行
我这个BDS2006有900多M 不知道怎么传啊。。。
#10
wp2319572012-12-19 12:05
有容对c++里的类 是不是熟悉啊

delphi把面向对象发挥的非常出色

所以最好事件函数别自己写
#11
wp2319572012-12-19 12:21
我用家里的d7 又测试了一下

貌似就是没有双击event的原因,你也不用重写代码

就在那个event里重新双击一下  凡是应该双击的 你都双击一下
#12
有容就大2012-12-19 12:22
回复 10楼 wp231957
呵呵 去试验了下 果然 自己写的事件函数是无效的 即使和IDE自动生成的函数一模一样。
这个就神奇了 为什么呢?
#13
有容就大2012-12-19 12:24
以下是引用wp231957在2012-12-19 12:21:15的发言:

我用家里的d7 又测试了一下

貌似就是没有双击event的原因,你也不用重写代码

就在那个event里重新双击一下  凡是应该双击的 你都双击一下
呵呵 好的 看来用DELPHI程序员的代码负担要轻松许多啊。
#14
有容就大2012-12-19 12:26
呵呵 双击后运行出来预期的结果了 速度结贴了 给你个大头吧 2 / 8开。
#15
wp2319572012-12-19 12:26
以下是引用有容就大在2012-12-19 12:22:58的发言:

呵呵 去试验了下 果然 自己写的事件函数是无效的 即使和IDE自动生成的函数一模一样。
这个就神奇了 为什么呢?
你还没回复我10楼呢

双击貌似在类声明里直接生成
type
  // Class reference type (redeclaration)
  TControlClass = class of TControl;

  TCRefForm1 = class(TForm)
    Panel1: TPanel;
    RbtnRadio: TRadioButton;
    RbtnButton: TRadioButton;
    RbtnEdit: TRadioButton;
    procedure RbtnEditClick(Sender: TObject);
    procedure RbtnButtonClick(Sender: TObject);
    procedure RbtnRadioClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
    ClassRef: TControlClass;
    Counter: Integer;
  public
    { Public declarations }
  end;
然后再添加实现代码
貌似粉色部分都不能自己写
#16
有容就大2012-12-19 12:28
回复 15楼 wp231957
我开始就是没双击 直接写的粉色代码 然后又在后面添加它们的实现代码的 呵呵
。。。
#17
wp2319572012-12-19 12:29
以下是引用有容就大在2012-12-19 12:24:20的发言:

呵呵 好的 看来用DELPHI程序员的代码负担要轻松许多啊。
虽然我对底层不熟悉
但是 delphi 对底层 还是不如c的  要是应用层 数据库啥的  真没的说
#18
wp2319572012-12-19 12:32
以下是引用有容就大在2012-12-19 12:28:24的发言:

我开始就是没双击 直接写的粉色代码 然后又在后面添加它们的实现代码的 呵呵
。。。
但是工程里面的event一栏 是空的
只有本站会员才能查看附件,请 登录
#19
有容就大2012-12-19 12:36
以下是引用wp231957在2012-12-19 12:32:46的发言:

但是工程里面的event一栏 是空的
这下明白究竟了 谢谢W版如此热心哈 呵呵 奉茶
#20
wp2319572012-12-19 12:39
小声告诉你一句  

我懂得和你懂得(delphi方面)没差多少

d7 我也好久没用了
#21
有容就大2012-12-19 12:41
以下是引用wp231957在2012-12-19 12:39:31的发言:

小声告诉你一句  

我懂得和你懂得(delphi方面)没差多少

d7 我也好久没用了
呵呵 用过的东西回忆起来很快啊
你帮了我不小的忙呢。
#22
xqyz88882012-12-20 09:13
知其然还有知其所以然,双击事件时,实际上就创建了函数的关联,这个可以从dfm文件中看到类似 onclick=XXXX的样子,函数关联并不是名字决定的。
#23
qunxingw2013-03-02 16:14
学习
1