百万火急,救助在Delphi中如何實現這個功能(100分)

  • 主题发起人 主题发起人 zpselect
  • 开始时间 开始时间
Z

zpselect

Unregistered / Unconfirmed
GUEST, unregistred user!
我要在DELPHI中实现如下功能,望各位高手帮助,情况很急!
1:首先我当我单击一个Button按钮进,在TFrom上动态的创建一个ComboBox控件,并显示出来!~
2:当下聚焦刚才通过动态创健的ComboBox控件时,那么执行ComboBox控件的OnEnter事件! 请问怎样才能实现?
我已经动态地实现了创建ComboBox控件的功能:
代码如下:
var C:TcomboBox
begin
C:=TcomboBox.Create(self);
C.Parent:=self;
C.Left:=10;
C.Top:=20;
C.Text:=’ComboBox1’
C.Visible:=true;
End;
这样通过上面的代码动态地创建了一个ComboBox控件,现在我要在窗体中去操作ComboBox,请问怎样写?如:当在窗体中实现ComboBox的OnEnter事件,或者更多的事件!
 
先给你的控件取个名称,然后用 Application.FindComponent()方法去找到。就可以操作他了。
写一个OnEnter的方法。然后动态创建的时候赋给他的OnEnter
 
procedure ComboboxOnEnter(Sender: TObject);
begin
showmessage('Entered.');
end;

Procedure CreateAComoboBox;
var C:TcomboBox
begin
C:=TcomboBox.Create(self);
C.Parent:=self;
C.Name := 'MyComboBox';
C.Left:=10;
C.Top:=20;
C.Text:=’ComboBox1’
C.Visible:=true;
C.OnEnter := ComboboxOnEnter;
End;
 
同意delfier的做法。
 
delfier完全正确!
 
各位同仁:我已经实现了在窗体中任意添加多个comboBox控件的功能,并且根据资料集将中的字段名称动态地将字段名称添加到comboBox之中,但是现在遇到一个很不解地问题:
我如何取新增多个comboBox的text值并赋值给变量CC,如果有多个comboBox控件那么其Text值之间用豆号隔开!
我现在将我动态添加comboBox控件的代码给各位参阅!
定义几个私有变量:
B: TComboBox;
C: TComboBox;
D: TEdit;
n: integer;
Click: Boolean;
S: string;
procedure CreateComponet;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Click := true;
CreateComponet;
if (B.Enabled) and (B.Visible) then
begin
B.Items.Text := S;
B.SetFocus;
B.ItemIndex:=0;
end;
end;

procedure TForm1.CreateComponet;
begin
B := TComboBox.Create(self);
B.Parent := self;
C := TComboBox.Create(self);
c.Parent := self;
D := TEdit.Create(self);
D.Parent := self;
if Click then
n := n + 30
else n := 30;
with B do
begin
Left := 32;
top := n;
Width := 145;
Height := 21;
ItemHeight := 13;
TabOrder := 1;
Clear;
ItemIndex := 0;
Style:=csDropDownList;
end;
with C do
begin
Left := 183;
Top := n;
Width := 89;
Height := 21;
ItemHeight := 13;
TabOrder := 2;
Clear;
Items.Add('>');
Items.Add('<');
Items.Add('=');
Items.Add('LIKE');
Items.Add('>=');
Items.Add('<=');
Items.Add('<>');
ItemIndex := 0;
Style:=csDropDownList;
end;
with D do
begin
Left := 278;
Top := n;
Width := 121;
Height := 21;
TabOrder := 3;
D.Text := '';
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
Click := false;
CreateComponet;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT TOP 1 CL_DM 材料代码,CL_ZWM 材料中文名 ,CL_DW 材料单位 FROM CL');
ADOQuery1.Open;
for i := 0 to ADOQuery1.FieldList.Count - 1 do
begin
B.Items.Add(ADOQuery1.Fields.FieldName);
end;
B.ItemIndex := 0;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
if (B.Enabled) and (B.Visible) then
begin
B.SetFocus;
S := B.Items.Text;
end;
end;
 
if assigned(B) then
S:=S+','+B.text;
if assigned(C) then
S:=S+','+C.text;
...要几个判断几个再取几个。
 
我想问一下各位高手:
我想循环窗体中所有的控件,如果发现窗体中有ComboBox控件那幺将其text值赋给变量S
请各怎幺实现?急啊,我试了好几次都没有成功!
 
var
i: Integer;
S: string;
begin
for i := 0 to ControlCount-1 do
begin
if Controls.ClassName = 'TComboBox' then
S := S + (Controls as TComboBox).Text + ';';
end;
 
各位高手,现在我遇到一个新的问题,望各位帮助,解决之后立即给分!
现在窗体中有很多两个ComboBox控件(以2个为例,实际不止),首先说明一下ComboBox的值情况:
 ComboBox1控件中显示ADOQuery控件的各字段的DispyLabel值,ComboBox2显示运算符号如:=,>,<,<>等运算符!
我现在要实现下列功能:
1:我要程序自动识别,如果是如果ComboBox1中的值等于ADOQuery的DispyLabel值时,
那么变量S=ADOQuery.DiplyLabel对应的ADOQuery1.Fieldname;
2:当循环所的ComboBox控件后,结果应是:ADOQuery1.Fieldname值+ComboBox2值!
各位我试了好久都没有成功!
 
procedure TForm1.Button3Click(Sender: TObject);
var i, j: integer;
begin
SQL := '';
for i := 0 to Form1.ComponentCount - 1 do
begin
if Components is TComboBox then
begin
for j := 0 to ADOQuery1.FieldCount - 1 do
begin
if TComboBox(Components).Text =ADOQuery1.Fields[J].DisplayLabel then
temp:= ADOQuery1.Fields[j].FieldName+' '
else temp :=TComboBox(Components).Text;
end;
sql := sql + temp;
end;

if Components is TEdit then
begin
if copy(SQL, Length(SQL) - 4, 4) = 'LIKE' then
SQL := SQL + TEdit(Components).Text + '%'
else SQL := SQL + TEdit(Components).Text;
if Copy(SQL, Length(SQL) - 3, 3) <> ' AND' then
SQL := SQL + ' AND';
end;
end;
SQL := copy(SQL, 1, Length(SQL) - 3);
showmessage(SQL);
end;
各位同仁可以在窗體中隨便搞幾個Combobox和edit控件!再把ADOQuery的各字段的DispayLabel值加到Combobox中!
 
第一:建立结构PPP,其结构包括FieldName变量,Combox控件,TStringList包含值,等等等等
第二:建立集合ControlList:TList,新增一个控件就建立一个结构(new(p)),赋值完毕后ControlList.add(p)
第三:查询时循环ControlList.count;p:=PPP(ControlList),然后对p的元素进行操作即可
 
楼上高手,可否给出原码?
 
我把我要求再描述一下:比如:现在窗体中有3组窗体,其排列方式为:
    comboboxA1 comboBoxB1 editC1
comboboxA2 comboboxB2 editC2
comboboxA3 comboboxB3 editC3
以上只列出三组,在实际操作是随意变化的,也就是控件个数不固定的!
请各位注意:
comboBoxA1,comboboxA2,comboboxA3控件主要是显示数据DisplayLabel
comboBoxB1,comboBoxB2,comboBoxB3主要是显示操作符如:<,>,<>,>=,<=,LIKE
editC1,editC2,editC3主要是条件输入处!
   这样就形式了一个SQL语句:我打个比方:comboBoxA的DisplayLabel 对应的Fieldname 为'name',comboBoxB1的操作符为:'=',editC1的text值为:'张华',
comboboxA2 的DisplayLabel 对应的Feildname为:'age',comboBoxB2,的操作符为:'='
editC2的值为:20
comboboxA3 的DisplayLabel 对应的Feildname为:'city',comboboxB的操作符为:'=',
editC3的值为:'beijing'
  那么我现在根据前所选的值得到一个SQL语句:
name:='张华'and age='20' and city='beijing'

我写了一段原码,但是不能实现上术所要得到的功能:望各位高手修改:

  procedure TForm1.Button3Click(Sender: TObject);
var i, j: integer;
begin
SQL := '';
for i := 0 to Form1.ComponentCount - 1 do
begin
if Components is TComboBox then
begin
for j := 0 to ADOQuery1.FieldCount - 1 do
begin
if TComboBox(Components).Text =ADOQuery1.Fields[J].DisplayLabel then
temp:= ADOQuery1.Fields[j].FieldName+' '
else temp :=TComboBox(Components).Text;
end;
sql := sql + temp;
end;

if Components is TEdit then
begin
if copy(SQL, Length(SQL) - 4, 4) = 'LIKE' then
SQL := SQL + TEdit(Components).Text + '%'
else SQL := SQL + TEdit(Components).Text;
if Copy(SQL, Length(SQL) - 3, 3) <> ' AND' then
SQL := SQL + ' AND';
end;
end;
SQL := copy(SQL, 1, Length(SQL) - 3);
showmessage(SQL);
end;
 
就是动态创建控件。
技术支持QQ:136293586

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure ComboBox1Enter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
C:TcomboBox ;
begin
C:=TcomboBox.Create(self);
C.Parent:=self;
C.Left:=10;
C.Top:=20;
C.Text:='ComboBox1';
C.Visible:=true;
C.OnEnter:=ComboBox1Enter;
end;

procedure TForm1.ComboBox1Enter(Sender: TObject);
begin
showmessage('bbscom ComboBox1 Enter');
end;

end.
 
你这个方法!我都试过了,达不到我想得到的功能!
功态创建控件我已经做成功!那都不难!
现在难就是如何得到一个SQL语句!
 
各位同仁:我已經實現了我要達到的功能了!
 
大哥,我也遇到了这个问题了,可以告诉我如何处理马?
zpselect
 
可以啊!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部