delphi,N个edit控件,1个button控件,做修改操作的时候,无论在哪个edit中输入,单击button都成功修改并
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi,N个edit控件,1个button控件,做修改操作的时候,无论在哪个edit中输入,单击button都成功修改并相关的知识,希望对你有一定的参考价值。
提示成功,如果全部不填,单击button时 提示‘没用做如何修改’,这个判断语句怎么写?(修改的数据会插入数据库)
unit Unit1;interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
procedure myEditChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
Private declarations
public
Public declarations
end;
var
Form1: TForm1;
edtvaluelist: tstringlist;
implementation
$R *.dfm
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
flag: boolean; //声明一个标记用来记录是否有edit修改过
remsg: string; //记录修改过的edit名字,用于测试,实际过程中可不用
begin
flag := false;
for i:= 0 to self.ComponentCount - 1 do
begin
if self.Components[i] is TEdit then //如果还有其他的edit控件,就把这几个需要做修改的edit名字改成同一个开头(例如myedt1、myedt2.....myedtN),并在此处根据名字来判断 if pos('myedt', self.Components[i].Name) > 0 then
begin
if (self.Components[i] as TEdit).Tag = 1 then //如果为1说明是修改过的,则执行你写入数据库的代码
begin
//...... //这里写你自己需要的处理代码
(self.Components[i] as TEdit).Tag := 0; //处理完毕后记得把tag重新标记为0
flag := true; //把是否修改的标记改为 “真”
if remsg = '' then
remsg := (self.Components[i] as TEdit).Name
else
remsg := remsg + ',' + (self.Components[i] as TEdit).Name;
end;
end;
end;
if not flag then
showmessage('没有做任何修改!')
else
showmessage(remsg + #13#10 + '修改成功!');
end;
procedure TForm1.myEditChange(Sender: TObject);
var
newstr: string;
begin
newstr := (Sender as TEdit).Text;
if edtvaluelist.Values[(Sender as TEdit).Name] <> newstr then //如果改变后的字符串和之前记录的不同
begin
(Sender as TEdit).Tag := 1; //把tag置为1
edtvaluelist.Values[(Sender as TEdit).Name] := newstr; //更新字符串列表为新值
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
edtvaluelist := tstringlist.Create; //创建一个公共字符串列表用来存储各edit当前的值格式为 'edit.name=edit.text' 方便后续调用 等号前面的为字符串的name,等号后面的为字符串的value
for i:= 0 to self.ComponentCount - 1 do
begin
if self.Components[i] is TEdit then //如果还有其他的edit控件,就把这几个需要做修改的edit名字改成同一个开头(例如myedt1、myedt2.....myedtN),并在此处根据名字来判断 if pos('myedt', self.Components[i].Name) > 0 then
begin
(self.Components[i] as TEdit).Tag := 0; //把tag的初始值置为0 用于后续提交时候的判断
edtvaluelist.Add((self.Components[i] as TEdit).Name + '=' + (self.Components[i] as TEdit).Text); //循环把符合要求的edit的值写入字符串列表用于后续onchange的比较
end;
end;
//showmessage(edtvaluelist.Text);
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
edtvaluelist.Free; //释放
end;
end.
//亲测可行,所有n个edit控件的onchange事件都选择
procedure TForm1.myEditChange(Sender: TObject);追问
逻辑好强。意思是明白了。但是这个公共字符串列表是哪个控件是tvaluestringlist吗
追答edtvaluelist: tstringlist;
这个字符串列表并非控件,而是一个tstringlist类型的变量
这个变量报错
追答var
Form1: TForm1;
edtvaluelist: tstringlist;
implementation
$R *.dfm
//变量声明的位置要对,因为是全局变量 要声明在头部
2. 在button的OnClick事件里编写代码:
循环读取当前窗体中每个Edit控件的Tag属性,如果change了,就修改。
如果每个Tag都是0,那么提示‘没用做如何修改’追问
你的方法听起来,不错。但是不知道怎么设置edit的响应onchange。你的总体思路,能做成大概的实例不?这样我比较好理解,拜托了
参考技术B varEdt:array of TEDIT;
i,sum:integer;
begin
setlength(edt,,N);
for i:=0 to N-1 do
begin
Edt[i]:=TEdit.Create(self);
if Edit[i].text <>'' then
//数据提交
else
begin
sum:=sum+1;
continue;
end;
end
if Sum=N then showmessage('没做任何修改!');
end;
布吉岛对不对,笨办法!追问
数据提交的时候,提交的每个edit赋的值都不一样,你这个好像不行吧?
追答edit[i].text就是变量
追问我知道啊,赋值语句是这样fieldbyname('字段1').asstring:=edit[i].text但是字段不一样啊,难道要这fieldbyname('字段1').asstring:=edit[i].text;
fieldbyname('字段1').asstring:=edit[i].text;
。。。
var
Edt:array of TEDIT;
i,sum:integer;
begin
setlength(edt,,N);
for i:=0 to N-1 do
begin
Edt[i]:=TEdit.Create(self);
if Edit[i].text '' then break
else
begin
showmessage('没做任何修改!');
exit;
end;
if adoquery.active=false then adoquery.active:=true;
with adoquery do
begin
close;
open;
insert;
fieldbyname('字段').asstring:=edit[0].text;
fieldbyname('字段1').asstring:=edit[1].text;
fieldbyname('字段2').asstring:=edit[i].text;
end;
showmessage('插入成功!')
这样呢?你每个edit对应的字段不一样就只能这样赋值了。
end;
2 N个edit的OnChange事件关联到同一个事件。
3 该事件下:button.Enabled:=True; 参考技术D 用一个全局变量做标识,把所有edit的OnChange事件指向一个,然后再判断追问
本人菜鸟,能给个大概的模型不,因为你的意思我能理解,但就是苦于不会写。麻烦了
初学Delphi与sql server的存储过程
照旧,先上delphi的界面控件布局:
1个adoconnection、1个adoquery、1个DataSource、1个button、1个dbgrideh(随意)
前期准备:1、设置adoconnection的connectionstring,为了方便:Provider=SQLOLEDB.1;Password=数据库登录密码;Persist Security Info=True;User ID=数据库登录名;Data Source=数据库服务器地址,设置LoginPrompt设置为False
2、adoquery的connection指向adoconnection
3、DataSource的dataset指向adoquery
开始:
1、打开sql server 2008,选择数据库-右键新建查询:
--新建存储过程
1 create proc SelectAddr
2 as 3 begin 4 select * from MTable 5 end
--修改存储过程
1 alter proc SelectAddr
--增加一个入参 2 @addr varchar(50) 3 as 4 begin 5 select * from MTable t where t.Addr = @addr 6 end
点击执行,就可以才数据库-可编程性-存储过程下看到新建的SelectAddr这个存储过程了
2、在Delphi设计好的界面双击Button按钮
1 procedure TForm4.Button1Click(Sender: TObject); 2 var 3 sSqlText:string; 4 begin 5 sSqlText := Format(\'exec SelectAddr %s\',[\'3606163310030817\']); 6 ADOQuery1.SQL.Clear; 7 ADOQuery1.SQL.Add(sSqlText); 8 ADOQuery1.Open; 9 end;
编译,结果如下图,查询出Addr的一条记录:
以上是关于delphi,N个edit控件,1个button控件,做修改操作的时候,无论在哪个edit中输入,单击button都成功修改并的主要内容,如果未能解决你的问题,请参考以下文章
delphi ansichar 就是Delphi2010 他的edit编辑框文本是widechar类型也就是 1个字符占2个字节,不管是数字