?? main.pas
字號:
{*****************************************************************
*串口調試助手V1.0
*作 者:sky
*Email : mastersky@21cn.com
*QQ : 11116580
*版 本:V1.0
*編寫時間:2005/12/19
*說 明:本程序完全參照龔建偉VC版《串口調試助手V2.2》編寫而成。
僅供學習測試之用。
******************************************************************}
{==================================================================
= 串口調試助手DELPHI SPCOMM V1.1
= 作者 :謝利洪
= Email : xiliho221@163.com
= 版本 : V1.1
= 編寫時間: 2006.10.21
= 說明 :本版本由sky的1.0修改而成,本來只是用來學習SPCOMM控件的,想不到經過一
個晚上的努力,程序已經近于完善了。就將我的成果共享出來吧。由于改用
COMPORT控件為SPCOMM控件,整個代碼已經經過大規模的改動,去除了Email等
與程序應用不太相關的部分,改進了絕大部分算法,添加原未完成的功能 ,程序
依然是參照龔建偉VC版《串口調試助手V2.2》來編寫的。
===================================================================}
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls, Spin, ExtCtrls, ImgList,
Spcomm, shlobj;
type
TFrmMain = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Memo1: TMemo;
cbsendHex: TCheckBox;
cbAutoSend: TCheckBox;
Label1: TLabel;
SpinEdit1: TSpinEdit;
Label2: TLabel;
Button1: TButton;
Panel4: TPanel;
btnSend: TButton;
Button3: TButton;
Button4: TButton;
edSendFile: TEdit;
SpeedButton1: TSpeedButton;
Memo2: TMemo;
edStatus: TEdit;
edRx: TEdit;
edTx: TEdit;
Button5: TButton;
ImageList1: TImageList;
BitBtn1: TBitBtn;
GroupBox1: TGroupBox;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
btnSwitch: TButton;
Panel5: TPanel;
Button6: TButton;
cbRecHex: TCheckBox;
cbAutoClean: TCheckBox;
btnStopShow: TButton;
Button8: TButton;
Button9: TButton;
edPath: TEdit;
Timer1: TTimer;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
ComboBox4: TComboBox;
ComboBox5: TComboBox;
Comm1: TComm;
ImageOff: TImage;
ImageOn: TImage;
procedure SpeedButton1Click(Sender: TObject);
procedure btnSwitchClick(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure cbAutoSendClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure btnStopShowClick(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure btnSendClick(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure ComboBox3Change(Sender: TObject);
procedure ComboBox4Change(Sender: TObject);
procedure ComboBox5Change(Sender: TObject);
procedure ComboBox2KeyPress(Sender: TObject; var Key: Char);
procedure Memo2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
OnTop : Boolean;
FShowText:Boolean;
FRXNum:Integer;
FTXNum:Integer;
procedure ShowRX;
procedure ShowTX;
procedure ShowStatus;
procedure SendFile(const filename:string);
procedure SendString(const str:string);
procedure WMSysCommand(VAR Message: TWMSysCommand); message WM_SYSCOMMAND;
public
{ Public declarations }
end;
var
FrmMain: TFrmMain;
implementation
const
minWidth=627;
minHeight=444;
idAbout =$F200;
{$R *.dfm}
function SelectDirectory(Handle: hwnd; const Caption: string;
const Root: WideString; out Directory: string): Boolean;
var lpBI: _BrowseInfo;
Buf: array[0..MAX_PATH] of char;
ID: IShellFolder;
Eaten, Att: Cardinal;
rt: pItemIDList;
initdir: PWideChar;
begin
Result := False;
lpbi.hwndOwner := Handle;
lpbi.lpfn := nil;
lpbi.lpszTitle := PChar(Caption);
lpbi.ulFlags := BIF_RETURNONLYFSDIRS + BIF_EDITBOX;
SHGetDesktopFolder(ID);
initdir := PWChar(Root);
ID.ParseDisplayName(0, nil, InitDir, Eaten, rt, Att);
lpbi.pidlRoot := rt;
GetMem(lpbi.pszDisplayName, MAX_PATH);
try
Result := SHGetPathFromIDList(SHBrowseForFolder(lpbi), buf);
except
FreeMem(lpbi.pszDisplayName);
end;
if result then begin
Directory := buf;
if Length(Directory) <> 3 then
Directory := Directory + '\';
end;
end;
procedure EnumComPorts(Ports: TStrings);
var
KeyHandle: HKEY;
ErrCode, Index: Integer;
ValueName, Data: string;
ValueLen, DataLen, ValueType: DWORD;
TmpPorts: TStringList;
begin
ErrCode := RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
'HARDWARE\DEVICEMAP\SERIALCOMM',
0,
KEY_READ,
KeyHandle);
if ErrCode <> ERROR_SUCCESS then
Exit; // raise EComPort.Create(CError_RegError, ErrCode);
TmpPorts := TStringList.Create;
try
Index := 0;
repeat
ValueLen := 256;
DataLen := 256;
SetLength(ValueName, ValueLen);
SetLength(Data, DataLen);
ErrCode := RegEnumValue(
KeyHandle,
Index,
PChar(ValueName),
Cardinal(ValueLen),
nil,
@ValueType,
PByte(PChar(Data)),
@DataLen);
if ErrCode = ERROR_SUCCESS then
begin
SetLength(Data, DataLen);
TmpPorts.Add(Data);
Inc(Index);
end
else
if ErrCode <> ERROR_NO_MORE_ITEMS then
exit; //raise EComPort.Create(CError_RegError, ErrCode);
until (ErrCode <> ERROR_SUCCESS) ;
TmpPorts.Sort;
Ports.Assign(TmpPorts);
finally
RegCloseKey(KeyHandle);
TmpPorts.Free;
end;
end;
procedure TFrmMain.SpeedButton1Click(Sender: TObject);
var
B:TBitmap;
begin
B:=TBitmap.Create;
if not OnTop then
begin
SetWindowPos(FrmMain.handle, HWND_TOPMOST, FrmMain.Left, FrmMain.Top,
FrmMain.Width, FrmMain.Height,0);
if ImageList1.GetBitmap(1,B) then
begin
SpeedButton1.Glyph.Assign(B);
end;
end
else begin
SetWindowPos(FrmMain.handle, HWND_NOTOPMOST, FrmMain.Left, FrmMain.Top,
FrmMain.Width, FrmMain.Height,0);
if ImageList1.GetBitmap(0,B) then
begin
SpeedButton1.Glyph.Assign(B);
end;
end;
OnTop := not OnTop;
SpeedButton1.Down := false;
B.Free;
end;
procedure TFrmMain.btnSwitchClick(Sender: TObject);
var BaudRate :integer;
begin
if btnSwitch.Caption = '打開串口' then
begin
if not TryStrToInt(ComboBox2.Text,BaudRate) then
begin
Application.MessageBox('波特率設定有誤'+#13+
' 請重新輸入','警告',MB_ICONWARNING or MB_OK);
ComboBox2.SetFocus;
exit;
end;
Comm1.StartComm;
btnSwitch.Caption := '關閉串口';
ComboBox1.Enabled := false;
ComboBox2.Enabled := false;
ComboBox3.Enabled := false;
ComboBox4.Enabled := false;
ComboBox5.Enabled := false;
btnSend.Enabled := true;
ImageOff.Visible := false;
ImageOn.Visible :=true;
end
else //if Button1.Caption = '關閉串口' then
begin
Comm1.StopComm;
btnSwitch.Caption := '打開串口';
ComboBox1.Enabled := true;
ComboBox2.Enabled := true;
ComboBox3.Enabled := true;
ComboBox4.Enabled := true;
ComboBox5.Enabled := true;
btnSend.Enabled := false;
ImageOn.Visible := false;
ImageOff.Visible :=true;
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -