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

//变量声明的位置要对,因为是全局变量 要声明在头部

参考技术A 1. 设置Edit 控件的响应OnChange,当改变时设置其Tag属性为1,没改变设置为0

2. 在button的OnClick事件里编写代码:

循环读取当前窗体中每个Edit控件的Tag属性,如果change了,就修改。
如果每个Tag都是0,那么提示‘没用做如何修改’追问

你的方法听起来,不错。但是不知道怎么设置edit的响应onchange。你的总体思路,能做成大概的实例不?这样我比较好理解,拜托了

参考技术B 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
//数据提交
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;

参考技术C 1 初始化:button.Enabled:=False;
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 子窗体传值问题子窗体调用

delphi的edit控件中实现除法功能

delphi ansichar 就是Delphi2010 他的edit编辑框文本是widechar类型也就是 1个字符占2个字节,不管是数字

delphi如何弹出一个提示窗口

delphi如何做到一个自动运行的控件,如下图定时器

delphi 如何获得一个窗体中有多少控件