form之间传递参数问题,50分送上,应该不难解决的!(50分)

  • 主题发起人 主题发起人 pizixiao
  • 开始时间 开始时间
P

pizixiao

Unregistered / Unconfirmed
GUEST, unregistred user!
第一个form是用户登陆form,用户登陆成功后,将用户的信息作为全局参数在其它若干个form中使用,因为用户名不同,其所操作的功能也不一样,所以在其它若干个form中都需要判断当前是什么类型的用户,程序是这样的:
TformUserlogin = class(TForm)
public
{ Public declarations }
intYhlx:integer;//用户类型作为全局变量
strDwmc:string;//单位名称也是用户信息,用户不同,单位名称也不同,需要传递的参数
end;
procedure TformUserlogin.btnOkClick(Sender: TObject);
var
strUsername,strPassword,strServername,strSql:string;
begin
strUsername:=trim(teUsername.Text);
strPassword:=trim(tePassword.Text);
strServername:=trim(cbServername.Text); //获取参数
with queryLogin do//ADOQuery
begin
close;
ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID'
+'=sa;Password=sa;Initial Catalog=scxxgl;Data Source='''+strServername+'''';
strSql:='select yhm,mm,[red]yhlx,dwmc [/red]from Tyhgl where yhm='''+strUsername+''' and mm=''' +strPassword+'''';
sql.Clear;
sql.Add(strSql);
open;
if (FieldByName('yhlx').AsString='') then begin
Application.MessageBox('用户不存在或输入有误,请重新输入!','用户登录',0);
exit;
end
else begin//用户登陆成功!
strDwmc:=trim(fieldbyname('dwmc').AsString);
intYhlx:=fieldbyname('yhlx').AsInteger;
case intYhlx of
1:
begin
with formScxxglxt do
begin
//miUserlogin.Enabled:=true;
miUsermodify.Enabled:=true;//用户修改
//miQuit.Enabled:=true;
miProduce.Enabled:=true;//生产数据
miLowtemp.Enabled:=true;//低温情况
miUserrepair.Enabled:=true;//用户报修
miUserpour.Enabled:=true;//用户投诉
miDatamanage.Enabled:=true;//生产数据管理
end;
end;
end;
end;
end;
close;
end;
//这是菜单form,这里面是动态创建form,用到传过来的用户信息。
TformScxxglxt = class(TForm)
procedure miProdcollectClick(Sender: TObject);
end;
uses unitUserlogin,unitProdcollect1;
procedure TformScxxglxt.miProdcollectClick(Sender: TObject);
var
yhlx:integer;
dwmc:string;
begin
showmessage(formUserlogin.strDwmc);//这里出错,显示的是空,不是传递过来的值
showmessage(inttostr(formUserlogin.intyhlx));//这个正确,但是当以同样的用户名重复登陆后,值就变了,比如说由1变成了0
yhlx:=formUserlogin.intYhlx;
dwmc:=formUserlogin.strDwmc;//值为空
case yhlx of
1:
begin
Application.CreateForm(TformProdcollect,formProdcollect);
formProdcollect.ShowModal;
formProdcollect.Free;
end;
6:
begin
Application.CreateForm(TformProdcollect1,formProdcollect1);
formProdcollect.ShowModal;
formProdcollect.Free;
end;
end;
end;

TformProdcollect = class(TForm)
procedure FormCreate(Sender: TObject);
end;
uses unitUserlogin;
procedure TformProdcollect.FormCreate(Sender: TObject);
var
dwmc,strSql:string;
begin
showmessage(inttostr(formUserlogin.intyhlx));//值为0,当重复登陆后,反而不执行这条语句了。
dwmc:=formUserlogin.strDwmc;//值为空
with DM.adoQuery do
begin
close;
sql.Clear;
strSql:='select typevalue from Tdropdown where typename='''+dwmc
+''' and typeheat=1';
sql.Add(strSql);
open;
//提取出该分公司所有的燃油锅炉房名称
cbGlfmc.Properties.Items.Clear;
while not eof do
begin
cbGlfmc.Properties.Items.Add(trim(trim(fieldbyname('typename').AsString)));
next;
end;
cbGlfmc.ItemIndex:=0;
end;
end;
这是什么原因呢?还有,为了让用户的信息在很多个form中使用,用户重复登陆后,用户的信息保持正确,最好用什么方法呢?
 
咋没有人回答呢?
 
你最好有个UPublic的Unit,把这个值做为全局变量就绝对没问题了。
 
UPublic的Unit,你是说再新建一个unit吗?UPublic如何说呢?能说的详细点吗?请教
 
大家一定要踊跃发言呀,拜托了!
 
就是新建一个Unit,在这里定义全局变量,其他Unit中Uses这个Unit就行了,至于命名你自己选,给你个例子:
unit untInfo;

interface

uses Windows, classes, Sysutils;

type

TSysInfo = record
ServerName: string;
IfIC: Boolean;
ICPort: integer;
ProdComputer: string;
end;


var
SysInfo: TSysInfo;

implementation


end.

************************
unit untMain;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
CoolTrayIcon, Menus, OnlyOpenOnce, jpeg, ExtCtrls, fcLabel, Printers;

type
TfrmMain = class(TForm)
PopupMenu1: TPopupMenu;
D1: TMenuItem;
H1: TMenuItem;
N1: TMenuItem;
E1: TMenuItem;
CoolTrayIcon1: TCoolTrayIcon;
Timer1: TTimer;
fcLabel1: TfcLabel;
procedure E1Click(Sender: TObject);
procedure H1Click(Sender: TObject);
procedure D1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
CurDishID: Integer;
PrinterLst: TStringList;
procedure GetData;
public
{ Public declarations }
end;

var
frmMain: TfrmMain;

implementation

uses untDM, untInfo;

{$R *.DFM}

procedure TfrmMain.E1Click(Sender: TObject);
begin
close;
end;

procedure TfrmMain.H1Click(Sender: TObject);
begin
Hide;
end;

procedure TfrmMain.D1Click(Sender: TObject);
begin
Show;
end;

procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
try
GetData;
except
timer1.Enabled := False;
Application.MessageBox('本机与服务器联接出现异常,请重新起动电脑.','异常提示',0);
Application.Terminate;
end;
end;

procedure TfrmMain.GetData;
function GetPrinterIndex(PrinterName: string):integer;
var
i: integer;
begin
Result := -1;
for i:=0 to PrinterLst.Count-1 do
begin
if Pos(PrinterName,PrinterLst.Strings)>0 then
begin
Result := i;
break;
end;
end;
end;

procedure PrintDish(LineSpace: integer;PrinterName,RoomName,DishID,DishName,
DishCount,SumMoney,SendDish,OrderEmpName,PresentEmpName,OrderTime: string);
var
y: integer;
begin
with Printer do
begin
PrinterIndex := GetPrinterIndex(Printername);
BeginDoc;
Canvas.Font.Name := '黑体';
canvas.Font.Size := 12;
canvas.TextOut(150,0,'出品小单');
y := 0;
inc(y,LineSpace+10);
canvas.TextOut(0,y,'房台:' + RoomName);
Canvas.TextOut(250,y,'流水号:' + DishID);
inc(y,LineSpace);
Canvas.TextOut(0,y,DishName);
Canvas.TextOut(250,y,DishCount);
inc(y,LineSpace);
Canvas.TextOut(250,y,'小计:' + SumMoney);
if SendDish<>'' then //附送
begin
inc(y,LineSpace+5);
Canvas.TextOut(0,y,'附送:' + SendDish);
end;

inc(y,LineSpace+10);
Canvas.TextOut(0,y,'=================================');
Canvas.Font.Size := 10;
inc(y,LineSpace);
Canvas.TextOut(0,y,'点菜:' + OrderEmpName);
if PresentEmpName<>'' then
begin
inc(y,LineSpace);
Canvas.TextOut(0,y,'赠送: ' + PresentEmpName);
end;

inc(y,LineSpace);
Canvas.TextOut(0,y,'落单:' + OrderTime);
Canvas.TextOut(180,y,'出品:' + FormatDateTime('yy.mm.dd hh:nn',Now));
inc(y,LineSpace);
Canvas.TextOut(0,y,'接单人签名: ');
EndDoc;
end;
end;
var
LineSpace: integer;
PrinterName,RoomName,DishID,DishName: string;
DishCount,SumMoney,SendDish,OrderEmpName,PresentEmpName,OrderTime: string;
begin
timer1.Enabled := False;
LineSpace := fcLabel1.Tag;
with DM.cdsD_GetUnProd do
begin
close;
FetchParams;
Params[0].AsString := SysInfo.ProdComputer;
Params[1].AsInteger := CurDishID;
open;
while not eof do
begin
PrinterName := FieldByName('ProdComputer').AsString;
CurDishID := FieldByName('DishId').AsInteger;
DishID := FieldByName('DishId').AsString;

RoomName := FieldByName('RoomName').AsString;
DishName := FieldByName('DishName').AsString;
DishCount := FieldByName('DishCount').AsString + ' '
+ FieldByName('DishUnit').AsString;
SumMoney := FieldByName('SmallSum').AsString;
OrderEmpName := FieldByName('OrderEmpName').AsString;
if OrderEmpName = '' then OrderEmpName := '自动落单';
PresentEmpName := FieldByName('PresentEmpName').AsString;
OrderTime := FormatDateTime('hh:nn',FieldByName('ThisTime').AsDateTime);
if FieldByName('SendCount').AsInteger >0 then
SendDish := FieldByName('SendCount').AsString + ' ' +
FieldByName('SendDishUnit').AsString + ' ' +
FieldByName('SendDishName').AsString;
if DM.SocketConnection1.AppServer.D_SaveSendDish(StrToInt(DishID),2,'')=1 then
PrintDish(LineSpace,PrinterName,RoomName,DishID,DishName,
DishCount,SumMoney,SendDish,OrderEmpName,PresentEmpName,OrderTime);
Next;
end;
close;
end;
timer1.Enabled := True;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
CurDishID := 0;
PrinterLst := TStringList.Create;
PrinterLst.Assign(Printer.Printers);
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Application.MessageBox('退出本系统后将不能出品!','提示信息',MB_OKCANCEL)<>ID_OK then
Abort;
PrinterLst.Free;
end;

procedure TfrmMain.FormShow(Sender: TObject);
begin
Timer1.Enabled := True;
end;

end.
 
intYhlx:integer;//用户类型作为全局变量
strDwmc:string;//单位名称也是用户信息,用户不同,单位名称也不同,需要传递的参数

两个变量不要放在Public段,放在
var
formUserlogin:TformUserlogin;
下面
调用时用UnitName.intYhlx和UnitName.strDwmc访问。
 
新建个Unit,把他命名为UPulic,
unit UPublic;

interface

var
intYhlx:integer;//用户类型作为全局变量
strDwmc:string;//单位名称也是用户信息,用户不同,单位名称也不同,需要传递的参数

//这里还可以写一些全局函数,提高程序效率,可读性。标准写法。


implementation

end.
 
strDwmc:=trim(fieldbyname('dwmc').AsString);
intYhlx:=fieldbyname('yhlx').AsInteger;
这两句完成后变量的值是正确的吗?
 
strDwmc:=trim(fieldbyname('dwmc').AsString);
intYhlx:=fieldbyname('yhlx').AsInteger;
这两句完成后变量的值:正确,我试过了。

to zhangshunzhong
两个变量不要放在Public段,放在
var
formUserlogin:TformUserlogin;
下面
调用时用UnitName.intYhlx和UnitName.strDwmc访问。
那样别的unit中根本就看不到这两个变量,不型的,我试了,你试试看!
 
我试的可以啊
在别的unit中的implementation下加入Uses:
implementation
uses unit1;
 
to wtopia
var
intYhlx:integer;
strDwmc:string;
implementation
uses unitUserlogin;
end.
定义完这些之后,怎么先把前面几个参数弄到这里来呢?
用:
intYhlx:=formUserlogin.intyhlx;
strDwmc:=formUserlogin.strDwmc;
吗?
 
应该可以的,或者你不要关闭登录窗体,hide掉就行了
 
就两个变量,没必要专门搞个Unit去管理:

登录窗体中
var
formUserlogin:TformUserlogin;
strDwmc:string;
intYhlx:integer;

在别的窗体中
implementation
uses UnitUserlogin

就可以访问了,pizixiao,你的问题很容易解决的,不要把它越搞越复杂,如果这样访问不到,一般是你的UnitUserlogin.intYhlx语句之前有错。
 
对。
只要对 intYhlx和 strDwmc付值就行了,它都不会变的。
 
to wtopia
在那里赋值呢?直接赋值恐怕不行吧,需要建个函数或过程吧,那函数或过程在别的form中应用的时候可就麻烦了,写段代码看看,拜托了!
 
to zhangshunzhong
谢谢了,很简单一个问题,我搞得有点复杂了。
还想再多问一句,为什么放在public下面不行呢?而放在var下面就可以?为什么呢?说说看!
 
Public段是属于TformUserlogin类的,当对象formUserlogin被释放时,自然对象里的所有东东一起没了(动态的消失,静态内容即你在设计阶段设置的值当然还在),而放在var下面是存放在数据单元Unit中,不会随窗体释放而消失,Form不过是Unit中创建的一个对象
 
To: pizixiao
你只要在任何窗体中Use UPublic,你就可以在该窗体中给intYhlx和 strDwmc付值。
unit Unit1;

interface

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

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

var
Form1: TForm1;

implementation

uses UPublic;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
intYhlx := 5555;
strDwmc:='abcde';
showmessage(inttostr(intYhlx)+strDwmc);
end;

end.

 
to zhangshunzhong
解释的很专业,非常感谢!你的分马上就会送上,我还要等一会,看看wtopia
的回答,我想看看他的答案!
 
后退
顶部