如何改变动态产生的窗体中的某控件的属性值

时间:2021-11-23 18:30:17
如何改变动态产生的窗体中的某控件的属性值?应该用什么方法去做??句柄,例如:动态产生多个B窗体,我想要把其中一个B窗体的DATASET值改变,不知如何解决.

24 个解决方案

#1


引用B窗体后,就可以直接修改.

#2


也就是说,我动态产生多个同一个类的窗体,我只想其中一个窗体的DATASET的值改变

#3


uses
  TypInfo;

var
  PropInfo: PPropInfo;  // 要使用 TypInfo 单元
begin
  for k := 0 to Self.ControlCount-1 do 
  begin
     propInfo := GetPropInfo(Self.Controls[k], 'Width');
     if propInfo <> nil then  // 存在属性
       self.Controls[k].Width := 200;//改变属性
  end;
end;

#4


如何知道判断是那一个实例窗体

#5


procedure Tform1.CreateForm2(QuerySum:TQuery);
form2:Tform2;
begin
  form2:=Tform2.Create(Application);
  form2.DataSource1.DataSet:=QuerySum;
  ...
end;

#6


引用 3 楼 bdmh 的回复:
uses 
  TypInfo; 

var 
  PropInfo: PPropInfo;  // 要使用 TypInfo 单元 
begin 
  for k := 0 to Self.ControlCount-1 do 
  begin 
    propInfo := GetPropInfo(Self.Controls[k], 'Width'); 
    if propInfo <> nil then  // 存在属性 
      self.Controls[k].Width := 200;//改变属性 
  end; 
end; 


不明白

#7


3楼的方法可以。

#8


引用 5 楼 rouqing 的回复:
procedure Tform1.CreateForm2(QuerySum:TQuery); 
form2:Tform2; 
begin 
  form2:=Tform2.Create(Application); 
  form2.DataSource1.DataSet:=QuerySum; 
  ... 
end;



这个是在创建的时候使用,创建后,我在程序中如何再进行DataSet值的修改

#9


將DataSet傳入你生成实例窗体

#10


引用 9 楼 bigfoot001 的回复:
將DataSet傳入你生成实例窗体


不明白,能否详细说明?

#11


简单明了点,用句柄吧,向某个句柄的B窗体发消息,B窗体中写消息接收函数,接收到后改变dataset

#12


引用 11 楼 bdmh 的回复:
简单明了点,用句柄吧,向某个句柄的B窗体发消息,B窗体中写消息接收函数,接收到后改变dataset


嘻嘻,对句柄不熟悉。应该看什么资料,或者,能否给个例子,这问题,搞了半年多了。

#13


每创建一个窗体,窗体本身都会有一个Handle属性,你把创建的所有窗体的Handle属性记录下来,然后
SendMessage(Handle,你得消息,0,0);

B窗体上写消息的接收函数,当收到"你得消息"后,改变dataset

#14


引用 13 楼 bdmh 的回复:
每创建一个窗体,窗体本身都会有一个Handle属性,你把创建的所有窗体的Handle属性记录下来,然后 
SendMessage(Handle,你得消息,0,0); 

B窗体上写消息的接收函数,当收到"你得消息"后,改变dataset



SendMessage(Handle,你得消息,0,0); 
这句,我应该如何写??


例如:将'Doc00000015'这个数值传到其中一个动态产生的窗体中的DATASET.FieldByName('doccode').value
在发送窗体如何编写?
在接收窗体如何编写?

#15


就算是动态产生的窗口,也有name属性吧,引用name属性不就行了。

#16


n个B窗体和1个B窗体也没差别啊,都是同一个类的实例,该怎么改就怎么改呗

#17


引用 15 楼 tuao2 的回复:
就算是动态产生的窗口,也有name属性吧,引用name属性不就行了。


如何引用?

#18


引用 15 楼 tuao2 的回复:
就算是动态产生的窗口,也有name属性吧,引用name属性不就行了。


procedure TForm1.Button1Click(Sender: TObject);
var
  b: TButton;
begin
  b := TButton.Create(Form1);
  b.Parent := Form1;
  b.Name := 'b1';
  b.Caption := 'mybutton';
  b.Visible := True;
  b.Top := 10;
  b.Left := 10;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  (FindComponent('b1') as TButton).Caption := 'OK';
end;

#19


直接说你要做什么要好一点,看你的问题貌似你要在不同的窗体取数据库中的数据?
如果这样不是很好实现的吗?还是我理解有误?
新建一个Datamodule块,放上操作数据库的控件,在那么多的窗体中新建临时的数据集:
....
cds := TClientDataSet.Create(nil);
try
  With DataModule1.BDEClientDataSet1 do
  begin
    Active := False;
    CommandText := String(SqlString);   //SQLString---sql语句查询
    Active := True;
    cds.Data := Data;
    Active := False;
  end;
....
Finally
  cds.Free;
end;
。。。。
如果要修改或插入数据,就定义一个TQuery对象:var qry: TQuery;
...
qry := TQuery.Create(nil);
try
  qry.DataBase := DataModule1.BDEClientDataSet1.DatabaseName;
  qry.Close;
  qry.SQL.Clear;
  qry.SQL.Add(sqlstr);//sqlstr为SQL语句
  qry.ExecSQL;
finally
  qry.Free;
end;
...

#20



就算是动态产生的窗口,也有name属性吧,引用name属性不就行了。


procedure TForm1.Button1Click(Sender: TObject);
var
b: TButton;
begin
b := TButton.Create(Form1);
b.Parent := Form1;
b.Name := 'b1';
b.Caption := 'mybutton';
b.Visible := True;
b.Top := 10;
b.Left := 10;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
(FindComponent('b1') as TBu…

这样也是可以的 ,只是操作起来不是很方便

#21


关注这个问题

#22


更改属性并不难,可是你要找的这个窗体,总要有点依据吧?窗体标题名称?还是实例名?不然用啥方法也是白扯啊

#23


简单说,一个类产生了多个实例,就是如何找到这一个类的其中的一个实例

#24


引用 22 楼 Stiven_PFan 的回复:
更改属性并不难,可是你要找的这个窗体,总要有点依据吧?窗体标题名称?还是实例名?不然用啥方法也是白扯啊


用句柄吧,发消息给你要找的窗体,接收到消息后,返回给你一个信息,告诉你要找的是哪个类

#1


引用B窗体后,就可以直接修改.

#2


也就是说,我动态产生多个同一个类的窗体,我只想其中一个窗体的DATASET的值改变

#3


uses
  TypInfo;

var
  PropInfo: PPropInfo;  // 要使用 TypInfo 单元
begin
  for k := 0 to Self.ControlCount-1 do 
  begin
     propInfo := GetPropInfo(Self.Controls[k], 'Width');
     if propInfo <> nil then  // 存在属性
       self.Controls[k].Width := 200;//改变属性
  end;
end;

#4


如何知道判断是那一个实例窗体

#5


procedure Tform1.CreateForm2(QuerySum:TQuery);
form2:Tform2;
begin
  form2:=Tform2.Create(Application);
  form2.DataSource1.DataSet:=QuerySum;
  ...
end;

#6


引用 3 楼 bdmh 的回复:
uses 
  TypInfo; 

var 
  PropInfo: PPropInfo;  // 要使用 TypInfo 单元 
begin 
  for k := 0 to Self.ControlCount-1 do 
  begin 
    propInfo := GetPropInfo(Self.Controls[k], 'Width'); 
    if propInfo <> nil then  // 存在属性 
      self.Controls[k].Width := 200;//改变属性 
  end; 
end; 


不明白

#7


3楼的方法可以。

#8


引用 5 楼 rouqing 的回复:
procedure Tform1.CreateForm2(QuerySum:TQuery); 
form2:Tform2; 
begin 
  form2:=Tform2.Create(Application); 
  form2.DataSource1.DataSet:=QuerySum; 
  ... 
end;



这个是在创建的时候使用,创建后,我在程序中如何再进行DataSet值的修改

#9


將DataSet傳入你生成实例窗体

#10


引用 9 楼 bigfoot001 的回复:
將DataSet傳入你生成实例窗体


不明白,能否详细说明?

#11


简单明了点,用句柄吧,向某个句柄的B窗体发消息,B窗体中写消息接收函数,接收到后改变dataset

#12


引用 11 楼 bdmh 的回复:
简单明了点,用句柄吧,向某个句柄的B窗体发消息,B窗体中写消息接收函数,接收到后改变dataset


嘻嘻,对句柄不熟悉。应该看什么资料,或者,能否给个例子,这问题,搞了半年多了。

#13


每创建一个窗体,窗体本身都会有一个Handle属性,你把创建的所有窗体的Handle属性记录下来,然后
SendMessage(Handle,你得消息,0,0);

B窗体上写消息的接收函数,当收到"你得消息"后,改变dataset

#14


引用 13 楼 bdmh 的回复:
每创建一个窗体,窗体本身都会有一个Handle属性,你把创建的所有窗体的Handle属性记录下来,然后 
SendMessage(Handle,你得消息,0,0); 

B窗体上写消息的接收函数,当收到"你得消息"后,改变dataset



SendMessage(Handle,你得消息,0,0); 
这句,我应该如何写??


例如:将'Doc00000015'这个数值传到其中一个动态产生的窗体中的DATASET.FieldByName('doccode').value
在发送窗体如何编写?
在接收窗体如何编写?

#15


就算是动态产生的窗口,也有name属性吧,引用name属性不就行了。

#16


n个B窗体和1个B窗体也没差别啊,都是同一个类的实例,该怎么改就怎么改呗

#17


引用 15 楼 tuao2 的回复:
就算是动态产生的窗口,也有name属性吧,引用name属性不就行了。


如何引用?

#18


引用 15 楼 tuao2 的回复:
就算是动态产生的窗口,也有name属性吧,引用name属性不就行了。


procedure TForm1.Button1Click(Sender: TObject);
var
  b: TButton;
begin
  b := TButton.Create(Form1);
  b.Parent := Form1;
  b.Name := 'b1';
  b.Caption := 'mybutton';
  b.Visible := True;
  b.Top := 10;
  b.Left := 10;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  (FindComponent('b1') as TButton).Caption := 'OK';
end;

#19


直接说你要做什么要好一点,看你的问题貌似你要在不同的窗体取数据库中的数据?
如果这样不是很好实现的吗?还是我理解有误?
新建一个Datamodule块,放上操作数据库的控件,在那么多的窗体中新建临时的数据集:
....
cds := TClientDataSet.Create(nil);
try
  With DataModule1.BDEClientDataSet1 do
  begin
    Active := False;
    CommandText := String(SqlString);   //SQLString---sql语句查询
    Active := True;
    cds.Data := Data;
    Active := False;
  end;
....
Finally
  cds.Free;
end;
。。。。
如果要修改或插入数据,就定义一个TQuery对象:var qry: TQuery;
...
qry := TQuery.Create(nil);
try
  qry.DataBase := DataModule1.BDEClientDataSet1.DatabaseName;
  qry.Close;
  qry.SQL.Clear;
  qry.SQL.Add(sqlstr);//sqlstr为SQL语句
  qry.ExecSQL;
finally
  qry.Free;
end;
...

#20



就算是动态产生的窗口,也有name属性吧,引用name属性不就行了。


procedure TForm1.Button1Click(Sender: TObject);
var
b: TButton;
begin
b := TButton.Create(Form1);
b.Parent := Form1;
b.Name := 'b1';
b.Caption := 'mybutton';
b.Visible := True;
b.Top := 10;
b.Left := 10;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
(FindComponent('b1') as TBu…

这样也是可以的 ,只是操作起来不是很方便

#21


关注这个问题

#22


更改属性并不难,可是你要找的这个窗体,总要有点依据吧?窗体标题名称?还是实例名?不然用啥方法也是白扯啊

#23


简单说,一个类产生了多个实例,就是如何找到这一个类的其中的一个实例

#24


引用 22 楼 Stiven_PFan 的回复:
更改属性并不难,可是你要找的这个窗体,总要有点依据吧?窗体标题名称?还是实例名?不然用啥方法也是白扯啊


用句柄吧,发消息给你要找的窗体,接收到消息后,返回给你一个信息,告诉你要找的是哪个类