📄 mainform.pas
字号:
{**********************************************************************}
{ ================== }
{ 客户端主程序 }
{ ================== }
{ 《学籍管理系统》--作者:贺广兵 }
{ }
{ 本单元是客户端应用程序的核心单元,程序的大部分功能都是由本单元 }
{ 或本单元配合 ClientDataModule 模块完成的。程序开发中的体会和心 }
{ 得 : }
{ 1。查询模块:由于 ADOExpress 的局限(BDE中无此现象),当客户端 }
{ 把查询语句传递给服务器 ADODataSet 的 COMMANDTEXT ,并执行时,如 }
{ 果,查询数据不为空,则执行正常,而若得到的记录数为 0 时,第二次 }
{ 查询时就会发生错误。这可能是由于 ADOEXPRESS 不能恰当的处理 }
{ SQlserver 传回的结果集而使执行错误。 }
{ 经解决办法如下: }
{ 程序发出查询请求时,服务端接受后,如果查询记录为空,则标记,下次 }
{ 处理查询请求时,先切断 ADOCONNECTION 与数据库的连接,然后重新连 }
{ 接,为防止用户在检索数据为空时,即关闭程序而使数据库异常,在程序 }
{ 发出关闭请求时,检查本次搜索到的数据记录数,不为空则允许关闭,否 }
{ 则向应用程序服务器发出关闭 ADOCONNECTION 请求,在其关闭后中止客 }
{ 户端程序。 }
{ 2。登陆窗口:考虑实际情况,用户第一次登陆时,口令为空,程序自动 }
{ 跳过登陆窗口。在用户设置口令后,把用户名和密码加密后写入注册表, }
{ 并保存相关信息,以决定用户下次登陆是否打开登陆窗口。 }
{ 创建原则:如用户使用自动登陆(禁用密码),则创建客户端主程序 }
{ 为主窗体。否则创建登陆窗口为主窗体,并在用户口令正确后自动隐藏。 }
{ 隐藏窗口的时机:应用程序的 OnCanResize 事件。 }
{ }
{ }
{ }
{**********************************************************************}
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ToolWin, ExtCtrls, Menus, StdCtrls, DBLookup, Buttons, ImgList,
Grids, Db,DBCtrls, DBGrids;
type
TClientMainForm = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
ControlBar1: TControlBar;
ToolBar1: TToolBar;
Panel1: TPanel;
SpeedButton1: TSpeedButton;
Label1: TLabel;
Splitter2: TSplitter;
StatusBar1: TStatusBar;
Splitter1: TSplitter;
ContainDatacrols: TPanel;
DBGrid1: TDBGrid;
Panel3: TPanel;
ContainInformation: TPanel;
Panel2: TPanel;
GroupBox1: TGroupBox;
ServerTableListBox: TListBox;
Panel4: TPanel;
Panel5: TPanel;
GroupBox2: TGroupBox;
Panel6: TPanel;
Panel7: TPanel;
mbSystem: TMemo;
SpeedButton4: TSpeedButton;
sbUpdates: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton6: TSpeedButton;
sbGetServerInformation: TSpeedButton;
sbShutdown: TSpeedButton;
sbGetupServer: TSpeedButton;
ToolButton1: TToolButton;
sbSave: TSpeedButton;
SpeedButton11: TSpeedButton;
ToolButton2: TToolButton;
UseManager: TSpeedButton;
sbHelpAndTegetherHintShow: TSpeedButton;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
N18: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
N23: TMenuItem;
edtInput: TEdit;
ComboBox1: TComboBox;
N7: TMenuItem;
N24: TMenuItem;
SaveDlgSaveRecord: TSaveDialog;
spFirst: TSpeedButton;
spPrior: TSpeedButton;
spNext: TSpeedButton;
spNP: TSpeedButton;
N26: TMenuItem;
N27: TMenuItem;
SpeedButton5: TSpeedButton;
Timer1: TTimer;
N15: TMenuItem;
PopupMenu1: TPopupMenu;
N14: TMenuItem;
N25: TMenuItem;
N28: TMenuItem;
N29: TMenuItem;
N30: TMenuItem;
N31: TMenuItem;
N32: TMenuItem;
N33: TMenuItem;
N34: TMenuItem;
N35: TMenuItem;
N36: TMenuItem;
N37: TMenuItem;
N38: TMenuItem;
N39: TMenuItem;
N40: TMenuItem;
N41: TMenuItem;
N42: TMenuItem;
N43: TMenuItem;
N44: TMenuItem;
procedure sbUpdatesClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure sbShutdownClick(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
procedure sbSaveClick(Sender: TObject);
procedure sbGetServerInformationClick(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton6Click(Sender: TObject);
procedure SpeedButton13Click(Sender: TObject);
procedure sbHelpAndTegetherHintShowMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
procedure SpeedButton1Click(Sender: TObject);
procedure spFirstClick(Sender: TObject);
procedure spPriorClick(Sender: TObject);
procedure spNextClick(Sender: TObject);
procedure spNPClick(Sender: TObject);
procedure UseManagerClick(Sender: TObject);
procedure SpeedButton11Click(Sender: TObject);
procedure ServerTableListBoxDblClick(Sender: TObject);
procedure ServerTableListBoxMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
procedure mbSystemMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure N13Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N26Click(Sender: TObject);
procedure N23Click(Sender: TObject);
procedure edtInputEnter(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N15Click(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
procedure edtInputKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ComboBox1Click(Sender: TObject);
procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure GetupServer; //定义常用的调用方法
procedure Updates;
procedure ShutdownLation;
procedure GetServerTime;
procedure NewRecord;
procedure DeleteRecord;
procedure ShowInformationInStatusBar(Information:String);
procedure HideInformationInStatusBar;
procedure GetAllTables;
procedure GetAllFields;
procedure GetHostName;
function MakeSearchStr:String; //定义常用函数
function GetTableForQuery:String;
function GetFieldForQuery:String;
var
ClientMainForm: TClientMainForm;
ServerLinked:Boolean=False; //全局变量,注意保护**************
TrueEOF:Boolean=False;
VOwnerData:String; //全局变量,小心访问***************
implementation
uses
SchoolManager_TLB,DataMoudle, fmDesignUnit, HinForm, PasswordUnit,
DataBringUnit, UseIniFile,{ QReportPrint,} fmAout, MultiThreadPrintUnit,
MidasMake, fmLoginUnit, SinglePrintUnit;
const //信息常量
BusyMessage=' 正在登陆....';
CompleteMessage='==>>已成功的连接上服务器!';
NoGetupMessage='==>>尚未连接服务器!';
ChangeGrid=#13#10;
PacketSize=10;
{$R *.DFM}
procedure CreateUseMethod;
//var
// UseMethod:TMethodUnit;
begin
//UseMethod.Create;
end;
procedure TClientMainForm.sbUpdatesClick(Sender: TObject);
begin //更新数据
//CreateuseMeythod;
//UseMethod.
Updates;
end;
procedure TClientMainForm.FormDestroy(Sender: TObject);
begin
//UseMethod.Free;
end;
procedure TClientMainForm.N4Click(Sender: TObject);
begin
if (not ServerLinked) then
GetupServer;
if ServerLinked then
begin
GetHostName;
GetServerTime;
GetAllTables;
GetAllFields;
ServerTableListBox.SetFocus;
end;
end;
function MakeSearchStr:String;
begin
Result:='select * from '+GetTableForQuery+' where '
+GetFieldForQuery+'='+ClientMainForm.edtInput.Text;// 如何给字符串加上 ' 号?
end;
function GetTableForQuery:String;
begin
if ServerLinked then
with ClientMainForm do
Result:=ServerTableListBox.Items[ServerTableListBox.ItemIndex];
end;
function GetFieldForQuery:String;
//var
//icount:Integer; //DELPHI5.0的遗憾:有动态数组,但却没有动态集合
//TextInList:Boolean; //用起来真是不爽
begin
//TextInList:=True;
DataModule1.ClientDataSet1.GetFieldNames(ClientMainForm.ComboBox1.Items);
with ClientMainForm do
begin
//Result:=ComboBox1.Items[ComboBox1.ItemIndex];
if ComboBox1.Text<>'' then
Result:=ComboBox1.Text;
end;
end;
procedure Updates;
begin
if ServerLinked then
begin
try //更新数据
With DataModule1 do
begin
ClientDataSet1.ApplyUpdates(0);
MessageDlg('成功把数据更新回数据库!',mtInformation,[mbOK],0);
end;
Except on E:Exception do
begin
MessageDlg(E.Message,mtInformation,[mbOK],0);
end;
end;
end;
end;
procedure GetupServer;
begin
with DataModule1 do //登陆服务器
begin
try
with ClientMainForm do
begin
StatusBar1.Panels[0].Text:=BusyMessage;
//DCOMConnection1.Connected:=True;
SocketConnection1.Connected:=True;
//SocketConnection1.Connected:=True;
ServerLinked:=True;
MessageDlg(CompleteMessage+#13#10+'请在数据表栏里双击您要查看的表!',mtInformation,[mbOK],0);
StatusBar1.Panels[0].Text:=CompleteMessage;
end;
except on E:Exception do
with ClientMainForm do
begin
//ClientDataSet1.Active:=False;
//DCOMConnection1.Connected:=False;
SocketConnection1.Connected:=False;
ServerLinked:=False;
end;
end;
end;
end;
procedure ShutdownLation;
begin
with DataModule1 do
begin
ClientDataset1.Active:=False;
//DCOMConnection1.Connected:=False;
SocketConnection1.Connected:=False;
ServerLinked:=False;
end;
end;
procedure GetServerTime; //获得系统时间
var
SystemTime:oleVariant;
IGetSystemTime:ISchoolMTSDisp;
begin
if ServerLinked then
begin
try
with DataModule1 do
begin
IGetSystemTime:=ISchoolMTSDisp(IDisPatch(SocketConnection1.Appserver));
IGetSystemTime.GetSystemTime(SystemTime);
end;
//ClientMainForm.mbSystem.Lines.Clear;
ClientMainForm.mbSystem.Lines.Add('服务器时间:'+SystemTime);
except on E:exception do
begin
MessageDlg('请确定您是否有足够的权限'+#13#10+'及是否已成功的登陆到服务器!',
mtInformation,[mbOK],0);
end;
end;
end
else
MessageDlg(NoGetupMessage,mtInformation,[mbOK],0);
end;
procedure GetAllTables; //获得服务器数据表
var
IGetAllTables:ISchoolMTSDisp;
ClientTbList:OleVariant;
icount:Integer;
begin
ClientMainForm.ServerTableListBox.Items.Clear;
if ServerLinked then //判断连接状态
begin
IGetAllTables:=ISchoolMTSDisp
(IDispatch(DataModule1.SocketConnection1.AppServer));
IGetAllTables.GetAllTables(ClientTbList);
if (VarIsArray(ClientTbList))then
begin
for icount:=VarArrayLowBound(ClientTbList,1)
to VarArrayHighBound(ClientTbList,1) do
begin
with ClientMainForm do
begin
ServerTableListBox.Items.Add(ClientTbList[icount]);
end;
end;
end;
end;
end;
procedure GetAllFields;
begin
with ClientMainForm do
ComboBox1.Items.Clear;
if ServerLinked then
begin
with DataModule1 do
begin
ClientDataSet1.GetFieldNames(ClientMainForm.ComboBox1.Items);
end;
end;
end;
procedure GetHostName;
begin
ClientMainForm.mbSystem.Lines.Add
('主机名:'+DataModule1.SocketConnection1.Host);
end;
procedure TClientMainForm.sbShutdownClick(Sender: TObject);
begin
ShutdownLation;
StatusBar1.Panels[0].Text:=NoGetupMessage;
mbSystem.Lines.Clear;
ServerTableListBox.Items.Clear;
end;
procedure TClientMainForm.SpeedButton4Click(Sender: TObject);
begin
if ServerLinked then
with DataModule1 do
begin
ClientDataSet1.CancelUpdates;
end;
end;
//数据库操纵模块
procedure TClientMainForm.sbSaveClick(Sender: TObject);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -