📄 umain.pas
字号:
//Token a word and delete it form a string
function TokenStr(var lns: string): string;
var
i: Integer;
begin
Result := '';
if lns = '' then
Exit;
i := 1;
while
((lns[i] = ' ') or
(lns[i] = ',') or
(lns[i] = '{') or
(lns[i] = '}') or
(lns[i] = '='))
and (i < Length(lns))
do
i := i + 1;
while
(lns[i] <> ' ') and
(lns[i] <> ',') and
(lns[i] <> '=') and
(lns[i] <> '{') and
(lns[i] <> '}') and
(i <= Length(lns))
do
begin
Result := Result + lns[i];
i := i + 1;
end;
Delete(lns, 1, i - 1);
end;
//User define functions end.
//System event
procedure TfrmMain.FormResize(Sender: TObject);
begin
pgctMain.Left := -1;
pgctMain.Top := -5;
pgctMain.Width := pnlMain.Width + 3;
pgctMain.Height := pnlMain.Height + 5;
stat.Panels[0].Width := ClientWidth - 1 - 2 - 110 - 1;
pbMain.Left := 1 + stat.Panels[0].Width + 2;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
var
sr: TSearchRec;
s: string;
i: Integer;
mi: TMenuItem;
K: Word;
begin
Randomize;
pnlMain.Align := alClient;
HWD := Handle;
//embed Gauge to StatusBar
pbMain.Parent := stat;
pbMain.Top := 3;
pbMain.Width := 100;
pbMain.Height := stat.Height - 4;
//initialization
mmoLog.Clear;
mmoHex.Clear;
//mmoBin.Align := alClient;
pbMain.Progress := 0;
pbMain.ShowText := True;
btnDownload.Enabled := False;
mnDownLoad.Enabled := False;
TS := Now;
//Search language file
i := 1;
if FindFirst(ExtractFilePath(Application.ExeName) + '*.lng', faArchive, sr) = 0 then
begin
s := ChangeFileExt(ExtractFileName(sr.Name), '');
if pmLang.Items.Find(s) = nil then
begin
mi := TMenuItem.Create(Self);
mi.Caption := s;
mi.RadioItem := True;
mi.GroupIndex := 1;
mi.AutoHotkeys := maManual;
mi.AutoLineReduction := maManual;
mi.Tag := 2003;
mi.OnClick := pmLangEnglishClick;
pmLang.Items.Add(mi);
mi := TMenuItem.Create(Self);
mi.Caption := s;
mi.RadioItem := True;
mi.GroupIndex := 1;
mi.AutoHotkeys := maManual;
mi.AutoLineReduction := maManual;
mi.Tag := 2003;
mi.OnClick := pmLangEnglishClick;
mnLanguage.Add(mi);
end;
while FindNext(sr) = 0 do
begin
s := ChangeFileExt(ExtractFileName(sr.Name), '');
if pmLang.Items.Find(s) = nil then
begin
mi := TMenuItem.Create(Self);
mi.Caption := s;
mi.RadioItem := True;
mi.GroupIndex := 1;
mi.AutoHotkeys := maManual;
mi.AutoLineReduction := maManual;
mi.Tag := 2003 + i;
mi.OnClick := pmLangEnglishClick;
pmLang.Items.Add(mi);
mi := TMenuItem.Create(Self);
mi.Caption := s;
mi.RadioItem := True;
mi.GroupIndex := 1;
mi.AutoHotkeys := maManual;
mi.AutoLineReduction := maManual;
mi.Tag := 2003 + i;
i := i + 1;
mi.OnClick := pmLangEnglishClick;
mnLanguage.Add(mi);
end;
end;
FindClose(sr);
end;
loadcfg;
//showtips
K := VK_F11;
FormKeyDown(Sender, K, [ssAlt, ssShift]);
pgctMain.ActivePageIndex := 0;
end;
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
savecfg;
end;
//Load last saved config data, or default value
procedure TfrmMain.loadcfg;
var
s: string;
i: Integer;
hf: TMenuItem;
buf: CBuf;
begin
s := ExtractFilePath(Application.ExeName) + 'avrubd.ini';
ini := TFastIniFile.Create(s);
try
try
Left := ini.ReadInteger('Last', 'Left', 100);
Top := ini.ReadInteger('Last', 'Top', 100);
Width := ini.ReadInteger('Last', 'Width', 636);
Height := ini.ReadInteger('Last', 'Height', 420);
WindowState := wsNormal;
//limit main window will not be outside desktop
if Left < 0 then
Left := 0;
if Top < 0 then
Top := 0;
if Width > Screen.Width then
Width := Screen.Width;
if Height > Screen.Height then
Height := Screen.Height;
if Left > Screen.Width then
Left := Screen.Width - Width;
if Top > Screen.Height then
Top := Screen.Height - Height;
//Comport
cfg.RTS := ini.ReadBool('ComPort', 'RTS', False);
cfg.DTR := ini.ReadBool('ComPort', 'DTR', False);
ComPort.Port := ini.ReadString('ComPort', 'Port', 'COM1');
ComPort.BaudRate := TBaudRate(ini.ReadInteger('ComPort', 'BaudRate', Ord(br19200)));
ComPort.DataBits := TDataBits(ini.ReadInteger('ComPort', 'DataBits', Ord(dbEight)));
ComPort.StopBits := TStopBits(ini.ReadInteger('ComPort', 'StopBits', Ord(sbOneStopBit)));
ComPort.Parity.Bits := TParityBits(ini.ReadInteger('ComPort', 'Parity', Ord(prNone)));
ComPort.FlowControl.FlowControl := TFlowControl(ini.ReadInteger('ComPort', 'FlowControl', Ord(fcNone)));
cfg.SmartMouse := ini.ReadBool('system', 'SmartMouse', False);
tmrSmartMouse.Enabled := cfg.SmartMouse;
cfg.Beep := ini.ReadBool('system', 'Beep', True);
cfg.keyMode := ini.ReadInteger('AVR', 'KEYMODE', 1);
cfg.keyASC := ini.ReadString('AVR', 'KEYASC', 'd');
cfg.keyHEX := FormatHexStr(ini.ReadString('AVR', 'KEYHEX', '64'), buf);
cfg.Protocol := ini.ReadInteger('system', 'Protocol', 0);
cfg.SendTime := ini.ReadInteger('system', 'SendTime', 200);
cfg.BootCnt := ini.ReadInteger('system', 'BootCount', 10);
cfg.SendRST := ini.ReadBool('AVR', 'SendRST', False);
cfg.AutoSize := ini.ReadBool('AVR', 'AutoSize', True);
cfg.CmdRST := ini.ReadString('AVR', 'CmdRST', '7E');
cfg.FrameLen := ((ini.ReadInteger('system', 'Length', 128)) div 16) * 16;
cfg.FlashSize := ini.ReadInteger('AVR', 'FlashSize', 2);
cfg.fillunused := ini.ReadBool('AVR', 'Fill', True);
cfg.filldata := FormatHexStr(ini.ReadString('AVR', 'filldata', 'FF CF'), buf);
cfg.run := DecryptInt(ini.ReadString('last', 'run', '0000000000000000')) + 1;
ini.WriteString('last', 'run', EncryptInt(cfg.run));
StaSum.sum := DecryptInt(ini.ReadString('last', 'sum', '0000000000000000'));
StaSum.fail := DecryptInt(ini.ReadString('last', 'fail', '0000000000000000'));
StaToday.sum := 0;
StaToday.fail := 0;
for i := 1 to ini.ReadInteger('History', 'Count', 0) do
begin
s := ini.ReadString('History', 'File' + IntToStr(i - 1), '');
if s <> '' then
begin
if FileExists(s) then
begin
hf := TMenuItem.Create(Self);
hf.OnClick := HisFileClick;
hf.Caption := s;
hf.RadioItem := True;
s := ExtractFileExt(s);
if CompareText(s, '.hex') = 0 then
hf.ImageIndex := 14
else
if CompareText(s, '.aub') = 0 then
hf.ImageIndex := 9
else
hf.ImageIndex := 15;
pmHisFile.Items.Add(hf);
end;
end;
if i >= MaxHisFileCount then
Break;
end;
for i := 1 to ini.ReadInteger('ImportHistory', 'Count', 0) do
begin
s := ini.ReadString('ImportHistory', 'File' + IntToStr(i - 1), '');
if s <> '' then
begin
hf := TMenuItem.Create(Self);
hf.OnClick := ImportHisClick;
hf.Caption := s;
hf.RadioItem := True;
pmImportHis.Items.Add(hf);
end;
end;
if cfg.run = 1 then
begin
//Get default codepage
if (GetSystemMetrics(SM_DBCSENABLED) > 0) and (IsValidCodePage(936)) then
cfg.Language := 'Chinese'
else
cfg.Language := 'English';
end
else
cfg.Language := ini.ReadString('Last', 'language', 'English');
if cfg.Language = 'Chinese' then
begin
cfg.FontName := ini.ReadString('Last', 'FontName', '宋体');
cfg.FontSize := ini.ReadInteger('Last', 'FontSize', 9);
end
else
begin
cfg.FontName := ini.ReadString('Last', 'FontName', 'MS Sans Serif');
cfg.FontSize := ini.ReadInteger('Last', 'FontSize', 8);
end;
//limit font size
if cfg.FontSize < 8 then
cfg.FontSize := 8;
if cfg.FontSize > 24 then
cfg.FontSize := 24;
//Set main window's Font
Font.Name := cfg.FontName;
Font.Size := cfg.FontSize;
mmoHex.Font := Font;
mmoLog.Font := Font;
mmoVer.Font := Font;
except
end;
finally
ini.Free;
end;
end;
//save current config data
procedure TfrmMain.savecfg;
var
s: string;
i: Integer;
begin
s := ExtractFilePath(Application.ExeName) + 'avrubd.ini';
ini := TFastIniFile.Create(s);
try
try
ini.WriteInteger('Last', 'Left', Left);
ini.WriteInteger('Last', 'Top', Top);
ini.WriteInteger('Last', 'Width', Width);
ini.WriteInteger('Last', 'Height', Height);
ini.WriteBool('ComPort', 'RTS', cfg.RTS);
ini.WriteBool('ComPort', 'DTR', cfg.DTR);
ini.WriteString('ComPort', 'Port', ComPort.Port);
ini.WriteInteger('ComPort', 'BaudRate', Ord(ComPort.BaudRate));
ini.WriteInteger('ComPort', 'DataBits', Ord(ComPort.DataBits));
ini.WriteInteger('ComPort', 'StopBits', Ord(ComPort.StopBits));
ini.WriteInteger('ComPort', 'Parity', Ord(ComPort.Parity.Bits));
ini.WriteInteger('ComPort', 'FlowControl', Ord(ComPort.FlowControl.FlowControl));
ini.WriteBool('system', 'SmartMouse', cfg.SmartMouse);
ini.WriteBool('system', 'Beep', cfg.Beep);
ini.WriteInteger('AVR', 'KEYMODE', cfg.keyMode);
ini.WriteString('AVR', 'KEYASC', cfg.keyASC);
ini.WriteString('AVR', 'KEYHEX', cfg.keyHEX);
ini.WriteInteger('system', 'Protocol', cfg.Protocol);
ini.WriteInteger('system', 'SendTime', cfg.SendTime);
ini.WriteInteger('system', 'BootCount', cfg.BootCnt);
ini.WriteBool('AVR', 'SendRST', cfg.SendRST);
ini.WriteBool('AVR', 'AutoSize', cfg.AutoSize);
ini.WriteString('AVR', 'CmdRST', cfg.CmdRST);
ini.WriteInteger('system', 'Length', cfg.FrameLen);
ini.WriteInteger('AVR', 'FlashSize', cfg.FlashSize);
ini.WriteBool('AVR', 'Fill', cfg.fillunused);
ini.WriteString('AVR', 'filldata', cfg.filldata);
ini.WriteString('last', 'sum', EncryptInt(StaSum.sum));
ini.WriteString('last', 'fail', EncryptInt(StaSum.fail));
ini.EraseSection('History');
ini.WriteInteger('History', 'Count', pmHisFile.Items.Count);
for i := 0 to pmHisFile.Items.Count - 1 do
ini.WriteString('History', 'File' + IntToStr(i), pmHisFile.Items[i].Caption);
ini.EraseSection('ImportHistory');
ini.WriteInteger('ImportHistory', 'Count', pmImportHis.Items.Count);
for i := 0 to pmImportHis.Items.Count - 1 do
ini.WriteString('ImportHistory', 'File' + IntToStr(i), pmImportHis.Items[i].Caption);
ini.WriteString('Last', 'language', cfg.Language);
ini.WriteString('Last', 'FontName', cfg.FontName);
ini.WriteInteger('Last', 'FontSize', cfg.FontSize);
except
end;
finally
ini.Free;
end;
end;
//Load target file(HEX/BIN)
procedure TfrmMain.btnLoadClick(Sender: TObject);
begin
//avoid reiteration event
if Idle then
begin
Idle := False;
try
dlgOpen.Title := mnLoad.Caption + ' ';
if dlgOpen.Execute then
begin
OpenFile(dlgOpen.FileName);
end;
finally
HWD := frmMain.Handle;
Idle := True;
end;
end;
end;
procedure TfrmMain.dlgOpenShow(Sender: TObject);
begin
HWD := FindWindow(nil, PChar(dlgOpen.Title));
clrSmart;
end;
//load history file
procedure TfrmMain.btnLoadHisClick(Sender: TObject);
begin
//avoid reiteration event
if Idle then
begin
Idle := False;
try
GetCursorPos(mp);
pmHisFile.Popup(mp.X, mp.Y);
finally
Idle := True;
end;
end;
end;
//save buffer to file
procedure TfrmMain.btnSaveClick(Sender: TObject);
var
i: Integer;
aub: TFastIniFile;
s: string;
begin
//avoid reiteration event
if Idle then
begin
Idle := False;
try
dlgSave.Title := mnSave.Caption + ' ';
if dlgSave.Execute then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -