http://www.cnblogs.com/del/archive/2010/01/19/1651483.html 感触比较深,因为我经常使用TClipboard 却从来没有注意过这个问题,要反省。
看了文章中的例子,在我的项目也试了一下,成功,呵呵。可惜的是我觉得灵活性比较差,也许是我水平比较差,所以现在说出来,大家探讨一下
文章中的例子:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
function Form2: TForm2;
implementation
{$R *.dfm}
var
FForm: TForm2;
function Form2: TForm2;
begin
if FForm = nil then
FForm := TForm2.Create(Application);
Result := FForm;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
end.
这样,我们就可以在别的单元直接使用Form2.ShowModal或者是Form2.Show等属性,但是我们要对于想要控制的窗体呢?比如说,在窗体是有3个Btn,我想根据特定的条件来设置Btn
的Enabled属性?那么也就是说,我们必须要Show或者ShowModal里面写这个控制代码。我常用的方法和万一老师说这个方法的比较。如下:
2
3 var
4
5 Form2:TForm2;
6
7 I:Integer;
8
9 begin
10
11 I:=0;
12
13 Form2:=TForm2.Create(Self);
14
15 if I=0 then //通过 I 来进行控制
16
17 begin
18
19 Form2.BitBtn1.Enabled:=False;
20
21 end
22
23 else
24
25 begin
26
27 Form2.BitBtn1.Enabled:=False;
28
29 end;
30
31 Form2.ShowModal;
32
33 Form2.Free;
34
35 end;
36
37
38
39 procedure TForm1.BitBtnClick(Sender:TObject);
40
41 var
42
43 I:Integer;
44
45 begin
46
47 I:=0;
48
49 if I=0 then //通过 I 来进行控制
50
51 begin
52
53 Form2.BitBtn1.Enabled:=False; //但是这里就会有错误了,我想你已经看出来了,因为我们的窗体还没有创建
54
55 end
56
57 else
58
59 begin
60
61 Form2.BitBtn1.Enabled:=False;
62
63 end;
64
65 Form2.ShowModal;// 万一老师的方法,窗体是在Form2这个函数中创建的
66
67 end;
68
69
通过比较之后,我个人觉得,如果要对新窗体的一些属性和控件进行控件,万一老师的方法就缺少了一些灵活性(当然我想万一老师写的这个文章不是要告诉我们用这个方法去创建窗体),我们虽然可以在新窗体的Show事件中解决一些问题,但是可能会把Show事件写的很复杂。或者利用全局变量在function中进行判断(个人觉得和Show事件中写代码本质都一样)。我还想到一个方法,就是定义多个function。来对应每一个需要如下:
function From22:TForm2;
var
Form:TForm2;
function Form21:TForm2;
begin
if Form=nil then
begin
Form:=TForm2.Create(Application);
Form.BitBtn1.Enabled:=True;
end;
Result:=Form;
end;
function Form22:TForm2;
begin
if Form=nil then
begin
Form:=TForm2.Create(Application);
Form.BitBtn2.Enabled:=True;
end;
Result:=Form;
end;
Other Unit;
procedure TForm1.BitBtnClick(Sender TObject);
var
I:Integer;
begin
I:=0;
if I=0 then
begin
Form21.ShowModal;
end
else
begin
Form22.ShowModal;
end;
end;
第一次写技术文章,看起来有点糙,呵呵,希望大家多多指正。(希望万一老师能够进来点评一下)