📄 mainunit.~pas
字号:
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, xmldom, XMLIntf, msxmldom, XMLDoc, ExtCtrls,
Menus, Grids, Buttons, StrUtils, PWUnit, SetUnit;
type
TKValue = Record
value1 : array of integer;
value2 : array of integer;
value3 : array of integer;
value4 : array of integer;
value5 : array of integer;
end;
type
TKDetails = Record
TName : string;
AList : Tstrings;
Value : TKValue;
end;
type
TFrmMain = class(TForm)
DTSwitch: TDateTimePicker;
Label1: TLabel;
GroupBox1: TGroupBox;
BoxA1: TComboBox;
Label4: TLabel;
Label5: TLabel;
GroupBox2: TGroupBox;
Label2: TLabel;
Label3: TLabel;
BoxA2: TComboBox;
GroupBox3: TGroupBox;
Label6: TLabel;
Label7: TLabel;
BoxA3: TComboBox;
GroupBox4: TGroupBox;
Label8: TLabel;
Label9: TLabel;
BoxA4: TComboBox;
GroupBox5: TGroupBox;
Label10: TLabel;
Label11: TLabel;
BoxA5: TComboBox;
GroupBox6: TGroupBox;
Label12: TLabel;
Label13: TLabel;
BoxA6: TComboBox;
BtnAdd: TButton;
BtnModify: TButton;
BtnDelete: TButton;
XMLDocument1: TXMLDocument;
BtnKey: TButton;
Timer1: TTimer;
PopupMenu1: TPopupMenu;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
DateTimePicker1: TDateTimePicker;
StringGrid1: TStringGrid;
BtnOK: TButton;
BtnCancel: TButton;
NSet: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BtnKeyClick(Sender: TObject);
procedure BtnAddClick(Sender: TObject);
procedure BoxA1Click(Sender: TObject);
procedure BoxA2Click(Sender: TObject);
procedure BoxA3Click(Sender: TObject);
procedure BoxA4Click(Sender: TObject);
procedure BoxA5Click(Sender: TObject);
procedure BoxA6Click(Sender: TObject);
procedure BtnModifyClick(Sender: TObject);
procedure BtnDeleteClick(Sender: TObject);
procedure BtnCancelClick(Sender: TObject);
procedure BtnOKClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure DTSwitchClick(Sender: TObject);
procedure StringGrid1Click(Sender: TObject);
procedure NSetClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
RunMapFileName, ChartFileName ,CurWorkDir : string;
TKDB : array[0..5] of TKDetails;
AInUseList : TStrings;
DTArr : array of TDateTime;
IndexInFile : array[0..5] of array of integer; //warning!!此处index从1开始,为了与integer默认初始化值0相区分
Locked : boolean;
OperateType : integer; //0:增加;1:修改;2:删除
procedure InitDBValue();
procedure FreeDB();
procedure InitRunMapFile(); //初始化保存运行图的文件
procedure RefreshDBGrid();
function GetTIndex(TName : string) : integer; //根据发射机名,获得此发射机的索引号
procedure RefreshAInUseList();
procedure RefreshComBoxList(nowBox : integer);
function JudgeIsInUse(AName : string; Index : integer) : boolean;
// function JudgeIsInGroup(AName : string; nowBox, CompareBox : integer) : boolean;
procedure SystemLocked(IsLocked : boolean);
procedure BtnStateSwitch(OperateBtnState : boolean);
procedure RefreshChartFile(); //必须在RefreshDBGrid之后调用
function TimeDefference(t1, t2 : TDateTime) : integer; //将时间的差异换算成差的秒数, t2 > t1
function JudgeTimeIsInUse(dt : TDateTime) : boolean;
procedure ClearComBox(); //使combox中选中的值均为‘未使用’
public
{ Public declarations }
SetFileName : string;
pw : string;
SleepTimeLimit : integer;
IsPWCorrect : integer; //-1:未确定;0:错误;1:正确
function FindSInSList(s : string; sList : TStrings) : integer;
end;
var
FrmMain: TFrmMain;
Mutex: hWnd; // Mutexhandle
function CreateMutex: Boolean;
procedure DestroyMutex;
implementation
{$R *.dfm}
function CreateMutex: Boolean;
var
PrevInstHandle: THandle;
AppTitle: PChar;
begin
AppTitle := StrAlloc(100);
StrPCopy(AppTitle, Application.Title);
Result := True;
Mutex := Windows.CreateMutex(nil, False, AppTitle);
if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then begin
Result := False;
SetWindowText(Application.Handle, '');
PrevInstHandle := FindWindow(nil, AppTitle);
if PrevInstHandle <> 0 then begin
if IsIconic(PrevInstHandle) then
ShowWindow(PrevInstHandle, SW_RESTORE)
else
BringWindowToTop(PrevInstHandle);
SetForegroundWindow(PrevInstHandle);
end;
if Mutex <> 0 then
Mutex := 0;
end;
StrDispose(AppTitle);
end;
procedure DestroyMutex;
begin
if Mutex <> 0 then
CloseHandle(Mutex);
end;
procedure TFrmMain.FormCreate(Sender: TObject);
var
// tmpBuf : array[0..255] of char;
tmpList : TStrings;
begin
//取当前路径
// GetCurrentDirectory(SizeOf(tmpBuf), tmpBuf);
CurWorkDir := 'c:';
RunMapFileName := CurWorkDir + '\runmap.xml';
ChartFileName := CurWorkDir + '\Chart.csv';
SetFileName := CurWorkDir + '\Set.dat';
//初始化库
try
InitDBValue();
except
ShowMessage('初始化库失败!');
exit;
end;
tmpList := TStringList.Create;
if FileExists(SetFileName) = false then
begin
tmpList.Add('123');
tmpList.Add('60000');
tmpList.SaveToFile(SetFileName);
end else
begin
tmpList.LoadFromFile(SetFileName);
end;
SleepTimeLimit := StrToInt(tmpList.Strings[1]);
self.Timer1.Interval := SleepTimeLimit;
self.pw := tmpList.Strings[0];
tmpList.Free;
InitRunMapFile();
RefreshDBGrid();
RefreshChartFile;
AInUseList := TStringList.Create;
AInUseList.Add('未使用');
AInUseList.Add('未使用');
AInUseList.Add('未使用');
AInUseList.Add('未使用');
AInUseList.Add('未使用');
AInUseList.Add('未使用');
RefreshComBoxList(100);
self.BoxA1.ItemIndex := 0;
self.BoxA2.ItemIndex := 0;
self.BoxA3.ItemIndex := 0;
self.BoxA4.ItemIndex := 0;
self.BoxA5.ItemIndex := 0;
self.BoxA6.ItemIndex := 0;
RefreshAInUseList();
IsPWCorrect := -1;
locked := false;
end;
procedure TFrmMain.BitBtn1Click(Sender: TObject);
begin
self.StringGrid1.Cells[0,0] := 'abcd';
end;
procedure TFrmMain.FreeDB;
var
i : integer;
begin
for i := 0 to 5 do
begin
TKDB[i].AList.Free;
SetLength(TKDB[i].Value.value1, 0);
SetLength(TKDB[i].Value.value2, 0);
SetLength(TKDB[i].Value.value3, 0);
SetLength(TKDB[i].Value.value4, 0);
SetLength(TKDB[i].Value.value5, 0);
end;
end;
procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
i : integer;
begin
FreeDB();
AInUseList.Free;
for i := 0 to 5 do
begin
SetLength(IndexInFile[i], 0);
end;
SetLength(DTArr, 0);
end;
procedure TFrmMain.InitRunMapFile;
var
tmpList : TStrings;
begin
if FileExists(RunMapFileName) then
exit;
tmpList := TStringList.Create;
tmpList.Add('<RunMap>');
tmpList.Add('</RunMap>');
tmpList.SaveToFile(RunMapFileName);
tmpList.Free;
end;
procedure TFrmMain.RefreshDBGrid;
var
tmpDTArr : array of TDateTime;
tmpTNameArr : array of string;
tmpANameArr : array of string;
tmpDT : TDateTime;
AccessCount, i, j, k, n, m : integer;
RootNode, CurNode : IXMLNode;
myRect: TGridRect;
begin
//FREE 各值
for n := 0 to 5 do
begin
setlength(IndexInFile[n], 0);
end;
setlength(DTArr, 0);
for i := 0 to 6 do
begin
self.StringGrid1.Rows[i].Clear;
end;
self.StringGrid1.ColCount := 3;
self.StringGrid1.RowCount := 3;
myRect.Left := 1;
myRect.Top := 1;
myRect.Right := 1;
myRect.Bottom := 1;
self.StringGrid1.Selection := myRect;
if self.XMLDocument1.Active = true then
begin
self.XMLDocument1.Active := false;
end;
self.XMLDocument1.FileName := RunMapFileName;
try
self.XMLDocument1.Active := true;
RootNode := self.XMLDocument1.DocumentElement; //
AccessCount := RootNode.ChildNodes.Count; //
for i := 0 to Length(TKDB)-1 do
begin
self.StringGrid1.RowCount := self.StringGrid1.RowCount + 1;
self.StringGrid1.Cells[0, i+1] := TKDB[i].TName;
end;
//初始化StringGrid中第一行的数据,时间值从小到大
setlength(tmpDTArr, AccessCount);
setlength(tmpTNameArr, AccessCount);
setlength(tmpANameArr, AccessCount);
for i :=0 to AccessCount - 1 do
begin
CurNode := RootNode.ChildNodes[i];
tmpDTArr[i] := StrToDateTime(CurNode.Attributes['RunTime']);
tmpTNameArr[i] := CurNode.Attributes['TName'];
tmpANameArr[i] := CurNode.Attributes['AName'];
end;
j := 0;
m := 0;
while j<>AccessCount do
begin
tmpDT := tmpDTArr[0];
for i := 0 to AccessCount -1 do
begin
if tmpDTArr[i] < tmpDT then
begin
tmpDT := tmpDTArr[i];
end;
end;
self.StringGrid1.ColCount := self.StringGrid1.ColCount + 1;
self.DateTimePicker1.DateTime := tmpDT;
self.StringGrid1.Cells[m+1, 0] := TimeToStr(self.DateTimePicker1.Time);
setlength(DTArr, m+1);
DTArr[m] := tmpDT;
for n := 0 to 5 do
begin
setlength(IndexInFile[n], m+1);
end;
for i := 0 to AccessCount -1 do
begin
if tmpDTArr[i] = tmpDT then
begin
k := GetTIndex(tmpTNameArr[i]);
IndexInFile[k][m] := i+1;
tmpDTArr[i] := StrToDateTime('2004-1-2 12:00:00');
self.StringGrid1.Cells[m+1, k+1] := tmpANameArr[i];
j := j + 1;
end;
end;
// j := j + 1;
m := m + 1;
{ tmpDTArr[IndexInFile[j]] := StrToDateTime('2004-1-2 12:00:00');
self.DateTimePicker1.DateTime := tmpDT;
tmpStr := RootNode.ChildNodes.Get(IndexInFile[j]).Attributes['TName'];
tmpStr := RootNode.ChildNodes.Get(IndexInFile[j]).Attributes['AName'];
if (k >= 0) and (k <= 5) then
begin
self.StringGrid1.ColCount := self.StringGrid1.ColCount + 1;
self.StringGrid1.Cells[j, 0] := TimeToStr(self.DateTimePicker1.Time);
self.StringGrid1.Cells[j, k+1] := tmpStr;
end;}
end;
SetLength(tmpDTArr, 0);
SetLength(tmpTNameArr, 0);
SetLength(tmpANameArr, 0);
except
ShowMessage('刷新运行图失败!');
SetLength(tmpDTArr, 0);
SetLength(tmpTNameArr, 0);
SetLength(tmpANameArr, 0);
exit;
end;
end;
function TFrmMain.GetTIndex(TName: string): integer;
var
s : string;
begin
s := LeftStr(TName, 1);
try
result := StrToInt(s) - 1;
except
result := -1;
end;
end;
procedure TFrmMain.InitDBValue;
begin
//1#发射机
TKDB[0].TName := '1#发射机'; //发射机号
TKDB[0].AList := TStringList.Create;
TKDB[0].AList.Add('未使用'); //对应天线号
TKDB[0].AList.Add('2#天线'); //对应天线号
TKDB[0].AList.Add('4#天线');
TKDB[0].AList.Add('6#天线');
TKDB[0].AList.Add('7#天线');
TKDB[0].AList.Add('9#天线');
TKDB[0].AList.Add('11#天线');
TKDB[0].AList.Add('13#天线');
SetLength(TKDB[0].Value.value1, 8);
SetLength(TKDB[0].Value.value2, 8);
SetLength(TKDB[0].Value.value3, 8);
SetLength(TKDB[0].Value.value4, 8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -