📄 main.pas
字号:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, Menus, ComCtrls, StdCtrls, ExtCtrls, DB, Grids, DBGrids,
ADODB, ToolWin, DBCtrls,Jpeg,Zlib,Buttons,Clipbrd, Spin, ScktComp,
Sockets, NMUDP, Gauges, CheckLst, Tabs, XPMenu;
const
CREATESUBSQL:String='CREATE TABLE %S(索引 COUNTER,学科分支名称 TEXT(50),学科分支表名 TEXT(20),备注 TEXT(50))';
//用于创建学科分支SQL语句
CREATESUBITEMSQL:String='CREATE TABLE %S(索引 COUNTER,章节名称 TEXT(50),章节表名 TEXT(20),备注 TEXT(50))';
//用于创建章节分支SQL语句
CREATESUBSECTIONSQL:String='CREATE TABLE %S(索引 COUNTER,题目 LONGBINARY,主观答案 LONGBINARY,客观答案 TEXT(50),选中标志 YESNO,备注 TEXT(50))';
//用于创建考题表的SQL语句
type
TStudentInf=record
IDD:String[16];
Name:String[20];
Num:String[20];
end; //自定义的学生信息数据类型
TNodeType=(NT_BOOT,NT_SUB,NT_SUBITEM,NT_SUBSECTION,NT_SECTIONITEM);
TSelRateItem=record
TableName:String[64];
CheckRate:Integer;
end;
TMyNode=record
NodeType:TNodeType;
FiledNameInParent:String[20];
TableName:String[64];
CheckRate:Integer;
end;
TPMyNode=^TMyNode;
TPSelRateItem=^TSelRateItem;
TPStudentInf=^TStudentInf;
TMainForm = class(TForm)
BigImageList: TImageList;
DS1: TDataSource;
SubTreeQuery: TADOQuery;
ADOCom: TADOCommand;
UseQuery: TADOQuery;
ImageList2: TImageList;
LowImageList: TImageList;
PC1: TPageControl;
TabSheet1: TTabSheet;
P1: TPanel;
SubTree: TTreeView;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
Splitter1: TSplitter;
StatusBar: TStatusBar;
Splitter2: TSplitter;
DBG1: TDBGrid;
PC3: TPageControl;
TS3: TTabSheet;
SBox1: TScrollBox;
FieldImage: TImage;
RateSheet: TTabSheet;
SelQuery: TADOQuery;
NodeTable: TADOTable;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
CheckBox5: TCheckBox;
AnswerPanel: TPanel;
AddKGButton: TSpeedButton;
TreePopMenu: TPopupMenu;
AddSubMenu: TMenuItem;
RenameSubMenu: TMenuItem;
N1: TMenuItem;
DelSubMenu: TMenuItem;
MainMenu1: TMainMenu;
S1: TMenuItem;
quit1: TMenuItem;
TS2: TTabSheet;
SBox2: TScrollBox;
AnsImage: TImage;
Splitter3: TSplitter;
RateLabel: TLabel;
RateTB: TTrackBar;
SB1: TSpeedButton;
PaperQuery: TADOQuery;
SectionPanel: TPanel;
AddButton: TSpeedButton;
DelButton: TSpeedButton;
AddZGButton: TSpeedButton;
EditButton: TSpeedButton;
QuesSock: TServerSocket;
RegStu: TNMUDP;
ImageList1: TImageList;
SelRateShow: TGauge;
About1: TMenuItem;
N2: TMenuItem;
AnsUdp: TNMUDP;
Splitter4: TSplitter;
SavePopMenu: TPopupMenu;
S2: TMenuItem;
TabSheet2: TTabSheet;
StuTable: TADOTable;
DS2: TDataSource;
DepQuery: TADOQuery;
ClassQuery: TADOQuery;
DBGrid1: TDBGrid;
TabSheet3: TTabSheet;
OkButton: TSpeedButton;
GR1: TGroupBox;
StuCountEdit: TSpinEdit;
Panel2: TPanel;
LeftTopL: TLabel;
RightBottomL: TLabel;
PB1: TProgressBar;
Splitter5: TSplitter;
Panel3: TPanel;
ClassCheckList: TCheckListBox;
DepTab: TTabSet;
AddToButton: TSpeedButton;
PageControl1: TPageControl;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
StudentList: TListBox;
ST1: TStaticText;
DelFromButton: TSpeedButton;
ClassList: TCheckListBox;
CheckQuery: TADOQuery;
GB2: TGroupBox;
NameL: TLabel;
NumL: TLabel;
DepL: TLabel;
ClassL: TLabel;
NameEdit: TEdit;
NumEdit: TEdit;
AddStuBtn: TBitBtn;
DelStuBtn: TBitBtn;
ClassEdit: TComboBox;
DepEdit: TComboBox;
FindStuBtn: TBitBtn;
FindTab: TTabSet;
FindEdit: TEdit;
Image1: TImage;
OkTimeBtn: TSpeedButton;
ST3: TStaticText;
SaveTimer: TTimer;
StaticText1: TStaticText;
SaveTimeEdit: TSpinEdit;
TimeEdit: TSpinEdit;
SpeedButton1: TSpeedButton;
RenameQuery: TADOQuery;
PageControl2: TPageControl;
TabSheet6: TTabSheet;
TabSheet7: TTabSheet;
ScoreMemo: TMemo;
StuSaysMemo: TMemo;
XPMenu1: TXPMenu;
xpcheck: TCheckBox;
procedure SubTreeChange(Sender: TObject; Node: TTreeNode);
procedure AddSubMenuClick(Sender: TObject);
procedure DelSubMenuClick(Sender: TObject);
procedure RenameSubMenuClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SubTreeDeletion(Sender: TObject; Node: TTreeNode);
procedure SubTreeClick(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure ToolButton2Click(Sender: TObject);
procedure DBG1CellClick(Column: TColumn);
procedure AddButtonClick(Sender: TObject);
procedure SBox1MouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
procedure FieldImageClick(Sender: TObject);
procedure DelButtonClick(Sender: TObject);
procedure RateTBChange(Sender: TObject);
procedure SB1Click(Sender: TObject);
procedure AddZGButtonClick(Sender: TObject);
procedure AddKGButtonClick(Sender: TObject);
procedure EditButtonClick(Sender: TObject);
procedure quit1Click(Sender: TObject);
procedure OkButtonClick(Sender: TObject);
procedure RegStuDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure QuesSockClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure About1Click(Sender: TObject);
procedure AnsUdpDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure DepTabChange(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
procedure AddToButtonClick(Sender: TObject);
procedure DelFromButtonClick(Sender: TObject);
procedure NameEditKeyPress(Sender: TObject; var Key: Char);
procedure NumEditKeyPress(Sender: TObject; var Key: Char);
procedure DepEditKeyPress(Sender: TObject; var Key: Char);
procedure ClassEditKeyPress(Sender: TObject; var Key: Char);
procedure AddStuBtnClick(Sender: TObject);
procedure DelStuBtnClick(Sender: TObject);
procedure FindTabChange(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
procedure FindStuBtnClick(Sender: TObject);
procedure OkTimeBtnClick(Sender: TObject);
procedure S2Click(Sender: TObject);
procedure SaveTimerTimer(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure xpcheckClick(Sender: TObject);
private
{ Private declarations }
Bitmap:TBitmap;
procedure CreateSub(TreeNode:TTreeNode;SubName,SubTableName,FieldNameInParent:String);
procedure CreateSubItem(TreeNode:TTreeNode;SubItemName,SubItemTableName,FieldNameInParent:String);
procedure CreateSubSection(TreeNode:TTreeNode;SubSectionName,SubSectionTableName,FieldNameInParent:String);
public
{ Public declarations }
SelRateList:TList;
SelectedOld:TTreeNode;
DeleteTableList:TStringList;
FieldStream,DecStream:TMemoryStream;
RegistedOK:array[0..63] of Char;
RegistedNO:array[0..63] of Char;
APPPATH:String;
PaperFileStream:array[1..100] of TFileStream;
SelectPaperNum:Integer;
PerStep:Integer;
function CheckStuInfo(PStuInf:TPStudentInf):Boolean;
procedure AddToClassList;
procedure DelFromClassList;
procedure InitProgressBar(TEXT:String);
procedure RefreshDepList;
procedure RefreshClassList(DepName:String);
procedure SaveScore(FromIP,ScoreStr:String);
procedure ImageSaveToBlobField(Image:TImage;BlobField:TBlobField);
procedure ImageLoadFromBlobField(Image:TImage;BlobField:TBlobField);
procedure ShowNode(TreeNode:TTreeNode);
procedure SetTreeMenu(Index:Integer);
procedure DelTreeNode(TreeNode:TTreeNode);
procedure AddTreeNode(TreeNode:TTreeNode);
procedure RenameTreeNode(TreeNode:TTreeNode);
procedure CreateSubTree;
procedure WriteBlobField(Field:TBlobField;Stream:TStream);
procedure ReadBlobField(Field:TBlobField;Stream:TStream);
procedure CompressStream(SourceStream,DeskStream:TStream);
procedure DeCompressStream(SourceStream,DeskStream:TStream);
procedure SetSectionButton(Show:Boolean);
procedure SelectATestPaper(Num:Integer);
procedure InitConnection;
end;
var
MainForm: TMainForm;
const
RegOK='Registed ok!';
RegNO='Registed no!';
REGIDD='$$ZHAOLOVEWANG$$';
implementation
uses DataForm, About;
{$R *.dfm}
procedure TMainForm.DelTreeNode(TreeNode: TTreeNode);
var
i:Integer;
FieldName:String;
begin
if MessageBox(Handle,PChar('你真的要删除'+TreeNode.Text),'警告',MB_ICONWARNING or MB_YESNO)= IDYES then
begin
DeleteTableList.Clear;
with UseQuery do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM '+TPMyNode(TreeNode.Parent.Data)^.TableName);
ExecSQL;
Open;
FieldName:=UseQuery.Fields[2].FieldName;
Close;
end;
ADOCom.CommandText:=Format('DELETE * FROM %s WHERE %S=''%S''',[TPMyNode(TreeNode.Parent.Data)^.TableName,FieldName,TPMyNode(TreeNode.Data)^.TableName]);
ADOCom.Execute;
TreeNode.Delete;
for i:=0 to DeleteTableList.Count-1 do
begin
ADOCom.CommandText:='DROP TABLE '+DeleteTableList[i];
ADOCom.Execute;
end;
SubTree.Refresh;
end;
end;
procedure TMainForm.SetTreeMenu(Index: Integer);
begin
case Index of
0:
begin
AddSubMenu.Caption:='增加学科分支(&A)';
AddSubMenu.Visible:=True;
DelSubMenu.Visible:=False;
RenameSubMenu.Visible :=False;
end;
2:
begin
AddSubMenu.Caption:='增加'+SubTree.Selected.Text+'分支(&A)';
RenameSubMenu.Caption :='为'+SubTree.Selected.Text+'重命名(&R)';
AddSubMenu.Visible:=True;
DelSubMenu.Caption:='删除本'+SubTree.Selected.Parent.Text+'分支(&D)';
DelSubMenu.Visible:=True;
RenameSubMenu.Visible :=True;
end;
4:
begin
AddSubMenu.Caption:='增加'+SubTree.Selected.Text+'章节(&A)';
RenameSubMenu.Caption :='为'+SubTree.Selected.Text+'重命名(&R)';
DelSubMenu.Caption:='删除本'+SubTree.Selected.Parent.Text+'分支(&D)';
AddSubMenu.Visible:=True;
DelSubMenu.Visible:=True;
RenameSubMenu.Visible :=True;
end;
6:
begin
AddSubMenu.Visible:=False;
RenameSubMenu.Caption :='为'+SubTree.Selected.Text+'重命名(&R)';
DelSubMenu.Caption:='删除本'+SubTree.Selected.Parent.Text+'分支(&D)';
DelSubMenu.Visible:=True;
RenameSubMenu.Visible :=True;
end;
end;
end;
procedure TMainForm.SubTreeChange(Sender: TObject; Node: TTreeNode);
begin
SetTreeMenu(Node.ImageIndex);
end;
procedure TMainForm.AddTreeNode(TreeNode: TTreeNode);
var
NodeText:String;
Node:TTreeNode;
PNode:TPMyNode;
Rco:Integer;
begin
NodeText:=Trim(InputBox('为'+TreeNode.Text+'命名','名称为:',''));
if NodeText<>'' then
begin
Node:=SubTree.Items.AddChild(TreeNode,NodeText);
Node.ImageIndex :=TreeNode.ImageIndex+2;
Node.SelectedIndex :=TreeNode.SelectedIndex +2;
GetMem(PNode,SizeOf(TMyNode));
NodeTable.Close;
NodeTable.TableName :=TPMyNode(TreeNode.Data)^.TableName;
NodeTable.Open;
NodeTable.Last;
Rco:=NodeTable.Fields[0].AsInteger+1;
case TreeNode.SelectedIndex of
1:
begin
NodeTable.Append;
NodeTable.Fields[1].AsString:=NodeText;
NodeTable.Fields[2].AsString:='sub'+IntToStr(Rco);
PNode^.NodeType:=NT_SUB;
PNode^.TableName :=NodeTable.Fields[2].AsString;
ADOCom.CommandText:=Format(CREATESUBSQL,[PNode^.TableName]);
end;
3:
begin
NodeTable.Append;
NodeTable.Fields[1].AsString:=NodeText;
NodeTable.Fields[2].AsString:=TPMyNode(TreeNode.Data)^.TableName+'sub'+IntToStr(Rco);
PNode^.NodeType:=NT_SUBITEM;
PNode^.TableName :=NodeTable.Fields[2].AsString;
ADOCom.CommandText:=Format(CREATESUBITEMSQL,[PNode^.TableName]);
end;
5:
begin
NodeTable.Append;
NodeTable.Fields[1].AsString:=NodeText;
NodeTable.Fields[2].AsString:=TPMyNode(TreeNode.Data)^.TableName+'sub'+IntToStr(Rco);
PNode^.NodeType:=NT_SUBITEM;
PNode^.TableName :=NodeTable.Fields[2].AsString;
ADOCom.CommandText:=Format(CREATESUBSECTIONSQL,[PNode^.TableName]);
end;
end;
NodeTable.Post;
ADOCom.Execute;
Node.Data:=PNode;
end;
end;
procedure TMainForm.AddSubMenuClick(Sender: TObject);
begin
AddTreeNode(SubTree.Selected);
end;
procedure TMainForm.DelSubMenuClick(Sender: TObject);
begin
DelTreeNode(SubTree.Selected);
end;
procedure TMainForm.RenameTreeNode(TreeNode: TTreeNode);
var
OldName:String;
RenameSQL:String;
begin
OldName:=TreeNode.Text;
SubTree.Selected.Text:=Trim(InputBox('为'+TreeNode.Text+'命名','名称为:',TreeNode.Text));
RenameSQL:='UPDATE '+TPMyNode(TreeNode.Parent.Data)^.TableName+' SET '+TPMyNode(TreeNode.Data)^.FiledNameInParent+
'="'+SubTree.Selected.Text+'" WHERE '+TPMyNode(TreeNode.Data)^.FiledNameInParent+'="' +OldName+'"';
with RenameQuery do
begin
Close;
SQL.Clear;
SQL.Add(RenameSQL);
ExecSQL;
end;
end;
procedure TMainForm.RenameSubMenuClick(Sender: TObject);
begin
RenameTreeNode(SubTree.Selected);
end;
procedure TMainForm.CreateSubTree;
var
Node:TTreeNode;
PNode:TPMyNode;
begin
// if SubTree.Items.GetFirstNode <>nil then SubTree.Items.GetFirstNode.Delete;
Node:=SubTree.Items.Add(nil,'学科');
Node.ImageIndex :=0;
Node.SelectedIndex:=1;
GetMem(PNode,SizeOf(TMyNode));
PNode^.NodeType:=NT_BOOT;
PNode^.TableName :='学科信息';
PNode^.CheckRate :=0;
Node.Data:=PNode;
with DMForm do
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -