//显示当前系列的编码排列 procedure ShowSeriesCode(TempQry: TADOQuery; CodeField: string; CodePanel: TPanel); var SeriesStr, TempStr, HintStr: string; i, TempTag: integer; begin { 以逗号分隔各个编码位 } SeriesStr := trim(TempQry.fieldbyname(CodeField).asstring); NowLeft := 0; TempTag:=0; //先释放对像 for i := high(SeriesCode) downto low(SeriesCode) do begin SeriesCode[i].free; SeriesCode[i] := nil; end; //分析编码 //最后一位不是逗号则加一个 if copy(SeriesStr, length(SeriesStr), 1) <> ',' then SeriesStr := SeriesStr + ','; //得到编码个数 CodeNumber := GetAppearTimes(',', SeriesStr); //根据每位上的值不同动态生成控件数组 setlength(SeriesCode, CodeNumber); for i := 0 to CodeNumber - 1 do begin TempStr := GetSubstr(SeriesStr, ',', i + 1); //如果是*或字符,则生成edit if (TempStr = '*') or ((TempStr <> '*') and (TempStr <> '-')) then begin SeriesCode[i] := TEdit.Create(nil); SeriesCode[i].Visible := false; SeriesCode[i].Parent := CodePanel; SeriesCode[i].Name := 'CODE' + inttostr(i); SeriesCode[i].Height := HEIGHTPUB; SeriesCode[i].top := TOPPUB; if i = 0 then SeriesCode[i].Width := LENCODEPRE else SeriesCode[i].Width := LENCODE; SeriesCode[i].Left := NowLeft; NowLeft := NowLeft + SeriesCode[i].Width + LENDIV; if TempStr = '*' then begin (SeriesCode[i] as TEdit).Text := ''; TempTag:=TempTag+1; (SeriesCode[i] as TEdit).tag := TempTag; //todo:编译不通过 <<------------------ //(SeriesCode[i] as TEdit).OnClick:=CodeEditClick; end else (SeriesCode[i] as TEdit).Text := TempStr; //如果有提示信息 if (pos('(', TempStr) > 0) and (pos(')', TempStr) > 0) and (pos(')', TempStr) > pos('(', TempStr)) then begin HintStr := copy(TempStr, pos('(', TempStr) + 1, pos(')', TempStr) - pos('(', TempStr) - 1); (SeriesCode[i] as TEdit).Text := copy(TempStr, 1, pos('(', TempStr) - 1); end; SeriesCode[i].Visible := true; end; //如果是-号,则生成label if (TempStr = '-') then begin SeriesCode[i] := TLabel.Create(nil); SeriesCode[i].Visible := false; SeriesCode[i].Parent := CodePanel; SeriesCode[i].Name := 'CODE' + inttostr(i); SeriesCode[i].Height := HEIGHTPUB; SeriesCode[i].top := TOPPUB; SeriesCode[i].Width := LENDIV; SeriesCode[i].Left := NowLeft; NowLeft := NowLeft + SeriesCode[i].Width + LENDIV; (SeriesCode[i] as TLabel).caption := CHRDIV; SeriesCode[i].Visible := true; end; end; if NowLeft > CodePanel.Parent.Width then CodePanel.Width := NowLeft else CodePanel.Width := CodePanel.Parent.Width; end;//编码的单击事件,得到当前编码的可选项 procedure CodeEditClick(Sender: TObject); begin showmessage('a'); end;此代码在公共单元,被主窗体调用,但有问题。
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } public procedure ButtonOnClick(Sender : TObject); { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ButtonOnClick(Sender: TObject); begin case TButton(Sender).Tag of 0 : begin ShowMessage('Button0.Clicked'); end; 1 : begin ShowMessage('Button1.Clicked'); end; end; end;procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin for i := 0 to 1 do with TButton.Create(self) do begin OnClick := ButtonOnClick; Tag := i; Parent := Self; Top := (i+1)*100; Left := 50; Caption := format('Button%d',[i]); end; end;end.
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } public procedure ButtonOnClick(Sender : TObject); { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}// 如果FormCreate是这样. procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin for i := 0 to 1 do begin with TButton.Create(self) do begin OnClick := ButtonOnClick; Tag := i; Parent := Self; Top := (i+1)*100; Left := 50; Caption := format('Button%d',[i]); end; with TEdit.Create(self) do begin tag:=i; Parent:=self; top:=(i+1)*100; left:=80; end; end; end; procedure TForm1.ButtonOnClick(Sender: TObject); begin case TButton(Sender).Tag of 0 : begin { 这里该如何给TEdit赋值? 假设按下第一个button就给第一个EDIT赋值,按第二个BUTTON就能第二个赋值... } end; 1 : begin ShowMessage('Button1.Clicked'); end; end; end; end.
procedure ShowSeriesCode(TempQry: TADOQuery; CodeField: string; CodePanel: TPanel);
var
SeriesStr, TempStr, HintStr: string;
i, TempTag: integer;
begin
{
以逗号分隔各个编码位
}
SeriesStr := trim(TempQry.fieldbyname(CodeField).asstring);
NowLeft := 0;
TempTag:=0;
//先释放对像
for i := high(SeriesCode) downto low(SeriesCode) do
begin
SeriesCode[i].free;
SeriesCode[i] := nil;
end;
//分析编码
//最后一位不是逗号则加一个
if copy(SeriesStr, length(SeriesStr), 1) <> ',' then
SeriesStr := SeriesStr + ',';
//得到编码个数
CodeNumber := GetAppearTimes(',', SeriesStr);
//根据每位上的值不同动态生成控件数组
setlength(SeriesCode, CodeNumber);
for i := 0 to CodeNumber - 1 do
begin
TempStr := GetSubstr(SeriesStr, ',', i + 1);
//如果是*或字符,则生成edit
if (TempStr = '*') or ((TempStr <> '*') and (TempStr <> '-')) then
begin
SeriesCode[i] := TEdit.Create(nil);
SeriesCode[i].Visible := false;
SeriesCode[i].Parent := CodePanel;
SeriesCode[i].Name := 'CODE' + inttostr(i);
SeriesCode[i].Height := HEIGHTPUB;
SeriesCode[i].top := TOPPUB;
if i = 0 then
SeriesCode[i].Width := LENCODEPRE
else
SeriesCode[i].Width := LENCODE; SeriesCode[i].Left := NowLeft;
NowLeft := NowLeft + SeriesCode[i].Width + LENDIV; if TempStr = '*' then
begin
(SeriesCode[i] as TEdit).Text := '';
TempTag:=TempTag+1;
(SeriesCode[i] as TEdit).tag := TempTag;
//todo:编译不通过 <<------------------
//(SeriesCode[i] as TEdit).OnClick:=CodeEditClick;
end
else
(SeriesCode[i] as TEdit).Text := TempStr; //如果有提示信息
if (pos('(', TempStr) > 0) and (pos(')', TempStr) > 0) and (pos(')', TempStr) > pos('(', TempStr)) then
begin
HintStr := copy(TempStr,
pos('(', TempStr) + 1,
pos(')', TempStr) - pos('(', TempStr) - 1);
(SeriesCode[i] as TEdit).Text := copy(TempStr, 1, pos('(', TempStr) - 1);
end; SeriesCode[i].Visible := true; end;
//如果是-号,则生成label
if (TempStr = '-') then
begin
SeriesCode[i] := TLabel.Create(nil);
SeriesCode[i].Visible := false;
SeriesCode[i].Parent := CodePanel;
SeriesCode[i].Name := 'CODE' + inttostr(i);
SeriesCode[i].Height := HEIGHTPUB;
SeriesCode[i].top := TOPPUB;
SeriesCode[i].Width := LENDIV; SeriesCode[i].Left := NowLeft;
NowLeft := NowLeft + SeriesCode[i].Width + LENDIV; (SeriesCode[i] as TLabel).caption := CHRDIV; SeriesCode[i].Visible := true; end;
end; if NowLeft > CodePanel.Parent.Width then
CodePanel.Width := NowLeft
else
CodePanel.Width := CodePanel.Parent.Width;
end;//编码的单击事件,得到当前编码的可选项
procedure CodeEditClick(Sender: TObject);
begin
showmessage('a');
end;此代码在公共单元,被主窗体调用,但有问题。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure ButtonOnClick(Sender : TObject);
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ButtonOnClick(Sender: TObject);
begin
case TButton(Sender).Tag of
0 : begin
ShowMessage('Button0.Clicked');
end;
1 : begin
ShowMessage('Button1.Clicked');
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
for i := 0 to 1 do
with TButton.Create(self) do
begin
OnClick := ButtonOnClick;
Tag := i;
Parent := Self;
Top := (i+1)*100;
Left := 50;
Caption := format('Button%d',[i]);
end;
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure ButtonOnClick(Sender : TObject);
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}// 如果FormCreate是这样.
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
for i := 0 to 1 do
begin
with TButton.Create(self) do
begin
OnClick := ButtonOnClick;
Tag := i;
Parent := Self;
Top := (i+1)*100;
Left := 50;
Caption := format('Button%d',[i]);
end;
with TEdit.Create(self) do
begin
tag:=i;
Parent:=self;
top:=(i+1)*100;
left:=80;
end;
end;
end;
procedure TForm1.ButtonOnClick(Sender: TObject);
begin
case TButton(Sender).Tag of
0 : begin
{ 这里该如何给TEdit赋值? 假设按下第一个button就给第一个EDIT赋值,按第二个BUTTON就能第二个赋值... }
end;
1 : begin
ShowMessage('Button1.Clicked');
end;
end;
end;
end.