看看问题300 + 解决问题另外300 = 600(300分)

  • 主题发起人 Another_eYes
  • 开始时间
to energy:
你把project save一下,再load.会出非法存取错,因为好象iformdesigner只能
在componenteditor,propertyeditor中调用。
 
/// 同志们 不好意思,有一个严重的bug ,改了,(天亮了,妈的)
unit nousage;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
stdctrls,ExtCtrls,DsgnIntf;

type
TNoUsage = class(TPanel)
private
{ Private declarations }
fedit1: TEdit;
fedit2: TEdit;
fedit3: TEdit;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TNoUsage]);
end;

constructor TNoUsage.Create(AOwner: TComponent);
var
ownFormDesign:IFormDesigner;
begin
inherited Create(AOwner);
controlstyle := controlstyle - [csAcceptsControls];
if (AOwner<>nil) then // 假定Aowner是form //应该换更准确的办法。目前没问题
ownFormDesign:=IFormDesigner((AOwner as TForm).Designer);
if not (csLoading in AOwner.ComponentState) then // form 在load的时候不建立
begin
if (csDesigning in self.ComponentState)
and (ownFormDesign<>nil) then
begin
fedit1:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 5, 100, 12) as TEdit; // 没办法用self要出错的,self还没建立
fedit2:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 35, 100, 12) as TEdit;
fedit3:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 65, 100, 12) as TEdit;
end
else
begin //如果在程序中建立
fedit1 := tedit.create(self);
fedit1.left := 5;
fedit1.top := 5;
fedit2 := tedit.create(self);
fedit2.left := 5;
fedit2.top := 35;
fedit3 := tedit.create(self);
fedit3.left := 5;
fedit3.top := 65;
end;
fedit1.parent := self;
fedit2.parent := self;
fedit3.parent := self;
end;
end;

end.
 
/// 同志们 不好意思,有一个严重的bug ,改了,(天亮了,妈的)
unit nousage;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
stdctrls,ExtCtrls,DsgnIntf;

type
TNoUsage = class(TPanel)
private
{ Private declarations }
fedit1: TEdit;
fedit2: TEdit;
fedit3: TEdit;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TNoUsage]);
end;

constructor TNoUsage.Create(AOwner: TComponent);
var
ownFormDesign:IFormDesigner;
begin
inherited Create(AOwner);
controlstyle := controlstyle - [csAcceptsControls];
if (AOwner<>nil) then // 假定Aowner是form //应该换更准确的办法。目前没问题
ownFormDesign:=IFormDesigner((AOwner as TForm).Designer);
if not (csLoading in AOwner.ComponentState) then // form 在load的时候不建立
begin
if (csDesigning in self.ComponentState)
and (ownFormDesign<>nil) then
begin
fedit1:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 5, 100, 12) as TEdit; // 没办法用self要出错的,self还没建立
fedit2:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 35, 100, 12) as TEdit;
fedit3:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 65, 100, 12) as TEdit;
end
else
begin //如果在程序中建立
fedit1 := tedit.create(self);
fedit1.left := 5;
fedit1.top := 5;
fedit2 := tedit.create(self);
fedit2.left := 5;
fedit2.top := 35;
fedit3 := tedit.create(self);
fedit3.left := 5;
fedit3.top := 65;
end;
fedit1.parent := self;
fedit2.parent := self;
fedit3.parent := self;
end;
end;

end.
 
to energy:
我把你的程序稍改了一下
unit nousage;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
stdctrls,ExtCtrls,Dsgnintf;

type
TNoUsage = class(TPanel)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
fedit1: TEdit;
fedit2: TEdit;
fedit3: TEdit;
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TNoUsage]);
end;

constructor TNoUsage.Create(AOwner: TComponent);
var
ownFormDesign:IFormDesigner;
begin
inherited Create(AOwner);
controlstyle := controlstyle - [csAcceptsControls];
if (AOwner<>nil) then // 假定Aowner是form //应该换更准确的办法。目前没问题
ownFormDesign:=IFormDesigner((AOwner as TForm).Designer);
if not (csLoading in AOwner.ComponentState) then // form 在load的时候不建立
begin
if (csDesigning in self.ComponentState)
and (ownFormDesign<>nil) then
begin
fedit1:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 5, 100, 12) as TEdit; // 没办法用self要出错的,self还没建立
fedit2:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 35, 100, 12) as TEdit;
fedit3:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 65, 100, 12) as TEdit;
end
else
begin //如果在程序中建立
fedit1 := tedit.create(self);{有问题}
fedit1.left := 5;
fedit1.top := 5;
fedit2 := tedit.create(self);
fedit2.left := 5;
fedit2.top := 35;
fedit3 := tedit.create(self);
fedit3.left := 5;
fedit3.top := 65;
end;
fedit1.parent := self;
fedit2.parent := self;
fedit3.parent := self;
end;
end;

end.
//主程序
unit Unit1;

interface

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

type
TForm1 = class(TForm)
fgsdfg: TEdit;
fsgdfg: TEdit;
fghfghf: TEdit;
NoUsage1: TNoUsage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
nousage1.fedit1.text:='a';
end;

end.
//dfm
object Form1: TForm1
Left = 192
Top = 164
Width = 435
Height = 300
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object NoUsage1: TNoUsage
Left = 0
Top = 0
Width = 241
Height = 185
Caption = 'NoUsage1'
TabOrder = 0
object fgsdfg: TEdit
Left = 8
Top = 8
Width = 100
Height = 21
TabOrder = 0
Text = 'fgsdfg'
end
object fsgdfg: TEdit
Left = 8
Top = 32
Width = 100
Height = 21
TabOrder = 1
Text = 'fsgdfg'
end
object fghfghf: TEdit
Left = 8
Top = 56
Width = 100
Height = 21
TabOrder = 2
Text = 'fghfghf'
end
end
object Button1: TButton
Left = 176
Top = 224
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 1
OnClick = Button1Click
end
end
//步骤1。把nousage放到form上,把edit1,2,3,改名,save project,load and run 你会发现edit1.text没变。
//你会发现fedit1<>fgsdfg,显示在form上的edit.text没变。你实际上还是建了
6个edit,只不过没显示在dfm里,因为no name edit's parent是nousage ,not
form1.
 
// 首先大富翁真慢,回答一个问题要连2个小时,还不如用mail list

// 你说的不是主要问题。几个edit 运行后按Tab键就知道了。自己试试看。
// 变量是不会被存储的,这个道理很简单。用 property 就可以了我想a-yes
// 应该一看就明白了。

unit nousage;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
stdctrls,ExtCtrls,DsgnIntf;

type
TNoUsage = class(TPanel)
private
{ Private declarations }
fedit1: TEdit;
fedit2: TEdit;
fedit3: TEdit;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
property edit1: TEdit read fedit1 write fedit1;
property edit2: TEdit read fedit2 write fedit2;
property edit3: TEdit read fedit3 write fedit3;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TNoUsage]);
end;

constructor TNoUsage.Create(AOwner: TComponent);
var
ownFormDesign:IFormDesigner;
begin
inherited Create(AOwner); // 假定Aowner是form //应该换更准确的办法。
controlstyle := controlstyle - [csAcceptsControls];
if (AOwner<>nil) then // 假定Aowner是form //应该换更准确的办法。目前没问题
ownFormDesign:=IFormDesigner((AOwner as TForm).Designer);
if not (csLoading in AOwner.ComponentState) then // form 在load的时候不建立
begin
if (csDesigning in self.ComponentState)
and (ownFormDesign<>nil) then
begin
edit1:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 5, 100, 12) as TEdit; // 没办法用self要出错的,self还没建立
edit2:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 35, 100, 12) as TEdit;
edit3:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 65, 100, 12) as TEdit;
end
else
begin
edit1 := tedit.create(self);
edit1.left := 5;
edit1.top := 5;
edit2 := tedit.create(self);
edit2.left := 5;
edit2.top := 35;
edit3 := tedit.create(self);
edit3.left := 5;
edit3.top := 65;
end;
edit1.parent := self;
edit2.parent := self;
edit3.parent := self;
end;
end;

end.

 
// 首先大富翁真慢,回答一个问题要连2个小时,还不如用mail list

// 你说的不是主要问题。几个edit 运行后按Tab键就知道了。自己试试看。
// 变量是不会被存储的,这个道理很简单。用 property 就可以了我想a-yes
// 应该一看就明白了。

unit nousage;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
stdctrls,ExtCtrls,DsgnIntf;

type
TNoUsage = class(TPanel)
private
{ Private declarations }
fedit1: TEdit;
fedit2: TEdit;
fedit3: TEdit;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
property edit1: TEdit read fedit1 write fedit1;
property edit2: TEdit read fedit2 write fedit2;
property edit3: TEdit read fedit3 write fedit3;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TNoUsage]);
end;

constructor TNoUsage.Create(AOwner: TComponent);
var
ownFormDesign:IFormDesigner;
begin
inherited Create(AOwner); // 假定Aowner是form //应该换更准确的办法。
controlstyle := controlstyle - [csAcceptsControls];
if (AOwner<>nil) then // 假定Aowner是form //应该换更准确的办法。目前没问题
ownFormDesign:=IFormDesigner((AOwner as TForm).Designer);
if not (csLoading in AOwner.ComponentState) then // form 在load的时候不建立
begin
if (csDesigning in self.ComponentState)
and (ownFormDesign<>nil) then
begin
edit1:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 5, 100, 12) as TEdit; // 没办法用self要出错的,self还没建立
edit2:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 35, 100, 12) as TEdit;
edit3:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 65, 100, 12) as TEdit;
end
else
begin
edit1 := tedit.create(self);
edit1.left := 5;
edit1.top := 5;
edit2 := tedit.create(self);
edit2.left := 5;
edit2.top := 35;
edit3 := tedit.create(self);
edit3.left := 5;
edit3.top := 65;
end;
edit1.parent := self;
edit2.parent := self;
edit3.parent := self;
end;
end;

end.
 
// 首先大富翁真慢,回答一个问题要连2个小时,还不如用mail list

// 你说的不是主要问题。几个edit 运行后按Tab键就知道了。自己试试看。
// 变量是不会被存储的,这个道理很简单。用 property 就可以了我想a-yes
// 应该一看就明白了。

unit nousage;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
stdctrls,ExtCtrls,DsgnIntf;

type
TNoUsage = class(TPanel)
private
{ Private declarations }
fedit1: TEdit;
fedit2: TEdit;
fedit3: TEdit;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
property edit1: TEdit read fedit1 write fedit1;
property edit2: TEdit read fedit2 write fedit2;
property edit3: TEdit read fedit3 write fedit3;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TNoUsage]);
end;

constructor TNoUsage.Create(AOwner: TComponent);
var
ownFormDesign:IFormDesigner;
begin
inherited Create(AOwner); // 假定Aowner是form //应该换更准确的办法。
controlstyle := controlstyle - [csAcceptsControls];
if (AOwner<>nil) then // 假定Aowner是form //应该换更准确的办法。目前没问题
ownFormDesign:=IFormDesigner((AOwner as TForm).Designer);
if not (csLoading in AOwner.ComponentState) then // form 在load的时候不建立
begin
if (csDesigning in self.ComponentState)
and (ownFormDesign<>nil) then
begin
edit1:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 5, 100, 12) as TEdit; // 没办法用self要出错的,self还没建立
edit2:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 35, 100, 12) as TEdit;
edit3:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 65, 100, 12) as TEdit;
end
else
begin
edit1 := tedit.create(self);
edit1.left := 5;
edit1.top := 5;
edit2 := tedit.create(self);
edit2.left := 5;
edit2.top := 35;
edit3 := tedit.create(self);
edit3.left := 5;
edit3.top := 65;
end;
edit1.parent := self;
edit2.parent := self;
edit3.parent := self;
end;
end;

end.
 
天啊!原来我已经传了三次啦!!!
我建议应该给自己也发封信。!!!
 
怪不得俺们的邮箱经常被......
 
Energy你连续多久没有睡觉了?
 
没解决,用你新的代码,下面程序仍然无法修改edit1.text,不信你试一下
procedure TForm1.Button1Click(Sender: TObject);
begin
nousage1.edit1.text:='a';
end;
 
// 同志们啊,同志们,我要非常非常的赞扬HubDog的精神。
// 可敬啊,可佩,但是我很惨。
// 发觉除了published之外好象还剩一种很迂的办法了。
// 3个edit从幕后来到幕前真不是我愿意的。
// eYes啊。你如果要想隐含他们的话看来只好再做个类了,把3个edit放到类里
// 在nousege里建立一个隐含的类,再在create里赋值;
// TEditCollect = class;
// private
// fedit1: TEdit;
// fedit2: TEdit;
// fedit3: TEdit;
// published
// property edit1: TEdit read fedit1 write fedit1;
// property edit2: TEdit read fedit2 write fedit2;
// property edit3: TEdit read fedit3 write fedit3;
// end;
// 哎,我累死了饶了我吧,别在出这中让我上瘾的题了。我给您300分如何。

unit nousage;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
stdctrls,ExtCtrls,DsgnIntf;

type
TNoUsage = class(TPanel)
private
{ Private declarations }
fedit1: TEdit;
fedit2: TEdit;
fedit3: TEdit;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
property edit1: TEdit read fedit1 write fedit1;
property edit2: TEdit read fedit2 write fedit2;
property edit3: TEdit read fedit3 write fedit3;
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TNoUsage]);
end;

constructor TNoUsage.Create(AOwner: TComponent);
var
ownFormDesign:IFormDesigner;
begin
inherited Create(AOwner); // 假定Aowner是form //应该换更准确的办法。
controlstyle := controlstyle - [csAcceptsControls];
if (AOwner<>nil) then // 假定Aowner是form //应该换更准确的办法。目前没问题
ownFormDesign:=IFormDesigner((AOwner as TForm).Designer);
if not (csLoading in AOwner.ComponentState) then // form 在load的时候不建立
begin
if (csDesigning in self.ComponentState)
and (ownFormDesign<>nil) then
begin
edit1:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 5, 100, 12) as TEdit; // 没办法用self要出错的,self还没建立
edit2:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 35, 100, 12) as TEdit;
edit3:=ownFormDesign.CreateComponent(TEdit, AOwner, 5, 65, 100, 12) as TEdit;
end
else
begin
edit1 := tedit.create(self);
edit1.left := 5;
edit1.top := 5;
edit2 := tedit.create(self);
edit2.left := 5;
edit2.top := 35;
edit3 := tedit.create(self);
edit3.left := 5;
edit3.top := 65;
end;
edit1.parent := self;
edit2.parent := self;
edit3.parent := self;
end;
end;

end.
 
我非常抱歉浪费了你们很多宝贵的internet thread;
 
to energy:
sorry for wasting your valueable time,其实我很喜欢你的答案中的某些东西
所以才穷追猛打。我就不再对您的答案提新的问题了,您的眼睛一定已经是红红的
了。hehe:)
 

我也想知道。:-)
 
有意思.
 
Energy:
好样的,无论成功与否,
你提供的代码已经是我很有启发了;)
睡个好觉吧!
 
to hubdog:
load时没变,那是因为你没重写writer与reader的方法,
但具体的我可不清楚。
 
呵呵。
我想,现在虽然对,但看见3个edit能该总是不舒服。
我想确实应该重载DefineProperties才对,因为要写好多东西,想偷懒
结果不行啊!
大致意思是


procedure TNoUsage.LoadEdit1(Reader: TReader);
begin
edit1:= Reader.ReadProperty(nil);
end;

procedure TNoUsage.StoreEdit1(Writer: TWriter);
begin
Writer.WriteComponent(edit1);
end;

. // 2 ,3 和一样
.
.

procedure TNoUsage.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineProperty('Edit1', LoadEdit1, StoreEdit1, Ture);
Filer.DefineProperty('Edit2', LoadEdit2, StoreEdit2, True);
Filer.DefineProperty('Edit3', LoadEdit3, StoreEdit3, True);
end;
 
代码越写越多---只为一个小问题?
虽然我还没确定,我想这个问题也许几句代码就可解决,如一个消息。
 

Similar threads

I
回复
0
查看
672
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
577
import
I
顶部