?? importfrm.pas
字號:
{
=====================================================================
* 軟件名稱:PC與數控機床通信程序
* 單元名稱:從數控機床接收數據
* 單元作者:彭為 (pwzyp@fjsm.net)
* 備 注:用到了線程進行發送
* 開發平臺:PWin2000 SERVER + Delphi 7.0
* 兼容測試:PWin9X/2000/XP + Delphi 6/7
* 采用控件:Raize 3.12 ,SPCOMM
* 修改記錄:V1.0 by pengwei
=====================================================================
}
unit ImportFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, RzTabs, RzButton, StdCtrls, RzLabel, RzBorder,
Grids, ValEdit, RzPrgres, ScktComp, SPComm, DB, ADODB;
type
TImport = class(TForm)
Panel1: TPanel;
pgcMain: TRzPageControl;
TabSheet1: TRzTabSheet;
TabSheet2: TRzTabSheet;
Image1: TImage;
Panel2: TPanel;
btnFinish: TRzBitBtn;
btnNext: TRzBitBtn;
btnPrior: TRzBitBtn;
RzLabel1: TRzLabel;
RzLabel2: TRzLabel;
RzLabel3: TRzLabel;
Image2: TImage;
RzBorder1: TRzBorder;
RzLabel4: TRzLabel;
RzLabel5: TRzLabel;
RzLabel6: TRzLabel;
RzLabel8: TRzLabel;
TabSheet3: TRzTabSheet;
Image4: TImage;
RzLabel12: TRzLabel;
RzBorder3: TRzBorder;
RzLabel13: TRzLabel;
RzLabel14: TRzLabel;
RzLabel7: TRzLabel;
edtUser: TEdit;
edtMemo: TEdit;
cboChannel: TComboBox;
cboComm: TComboBox;
LblCommErr: TRzLabel;
Lbl1: TRzLabel;
Lbl2: TRzLabel;
Lbl3: TRzLabel;
Lbl4: TRzLabel;
LblErr: TRzLabel;
Lbl5: TRzLabel;
RzBorder2: TRzBorder;
Comm1: TComm;
Query: TADOQuery;
procedure FormCreate(Sender: TObject);
procedure btnNextClick(Sender: TObject);
procedure btnPriorClick(Sender: TObject);
procedure btnFinishClick(Sender: TObject);
procedure Comm1ReceiveError(Sender: TObject; EventMask: Cardinal);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure FormShow(Sender: TObject);
private
bStart: Boolean;
TickCount: Longword;
sMemo, sUser, sFileName: string;
Channel: Integer;
iRecvLength: Integer;
RecvText: string;
procedure SaveRecvText;
{ Private declarations }
public
procedure showForm;
{ Public declarations }
end;
var
Import: TImport;
implementation
uses Include, Mainfrm, ConfigFrm;
{$R *.dfm}
procedure TImport.FormCreate(Sender: TObject);
begin
Caption := sImportCaption;
end;
procedure TImport.btnNextClick(Sender: TObject);
var
sTemp: string;
BeginChar: Byte;
BeginChannel: array[1..2] of Byte;
begin
case pgcmain.activepageindex of
0:
begin
cboChannel.Clear;
cboChannel.Items := Config.ChannelList;
cboChannel.ItemIndex := 0;
cboComm.ItemIndex := cboComm.Items.IndexOf(Config.CommName);
edtUser.Clear;
edtMemo.Clear;
LblCommErr.Visible := False;
end;
1:
begin
sUser := edtUser.Text;
sMemo := edtMemo.Text;
Channel := cboChannel.ItemIndex + 1;
Config.CommName := cboComm.Text;
Comm1.CommName := cboComm.Text;
Comm1.StopComm;
try
Comm1.StartComm;
except
LblCommErr.Visible := True;
Exit;
end;
BeginChar := 01;
sTemp := Format('%.2d', [channel]);
BeginChannel[1] := Ord(sTemp[1]);
BeginChannel[2] := Ord(sTemp[2]);
// ShowMessage(Format('%x %x %x', [beginchar[1], beginchar[2],
// beginchar[3]]));
Sleep(100);
Comm1.WriteCommData(@BeginChar, 1);
Sleep(100);
Comm1.WriteCommData(@BeginChannel, 2);
bStart := False;
Lbl1.Font.Style := [fsBold];
Lbl2.Font.Style := [fsBold];
Lbl3.Font.Style := [];
Lbl4.Font.Style := [];
Lbl5.Visible := False;
LblErr.Visible := False;
end;
else
;
end;
pgcMain.ActivePageIndex := pgcMain.ActivePageIndex + 1;
btnPrior.Enabled := True;
if pgcMain.ActivePageIndex = pgcMain.PageCount - 1 then
btnNext.Enabled := False;
end;
procedure TImport.btnPriorClick(Sender: TObject);
begin
pgcMain.ActivePageIndex := pgcMain.ActivePageIndex - 1;
btnNext.Enabled := True;
if pgcMain.ActivePageIndex = 0 then
btnPrior.Enabled := False;
end;
procedure TImport.showForm;
begin
if Import = nil then
Import := TImport.Create(self);
Import.ShowModal;
end;
procedure TImport.btnFinishClick(Sender: TObject);
begin
if bStart then
begin
if Length(RecvText) <> 0 then
begin
if MessageBox(Self.Handle, PChar(sBreak), PChar(sTitleAsk), MB_yesno +
MB_ICONQUESTION) = idno then
Exit;
SaveRecvText;
end;
//中斷發送數據線程
end;
Comm1.StopComm;
Close;
end;
procedure TImport.Comm1ReceiveError(Sender: TObject; EventMask: Cardinal);
begin
LblErr.Caption := '串口接收數據出現錯誤';
LblErr.Visible := True;
end;
procedure TImport.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
ReceivedBuf: array of Byte;
stemp: string;
BeginChar: array[1..2] of Byte;
SendChar: Byte;
i: Integer;
begin
SetLength(ReceivedBuf, BufferLength);
try
Move(Buffer^, pChar(@ReceivedBuf[0])^, BufferLength);
except
ShowMsg(sErrReceive1);
exit;
end;
if not bStart then
begin //尚未開始,檢測床號
stemp := Format('%.2d', [Channel]);
BeginChar[1] := Ord(sTemp[1]);
BeginChar[2] := Ord(sTemp[2]);
if ((ReceivedBuf[0] = BeginChar[1]) and (ReceivedBuf[1] = BeginChar[2])) then
begin //床號正確//開始發送03,并發數據 置start為True
SendChar := 03;
Comm1.StopComm;
Comm1.StartComm;
Sleep(100);
Comm1.WriteCommData(@SendChar, 1);
bstart := True;
//準備收數據
Lbl3.Font.Style := [fsBold];
RecvText := '';
iRecvLength := 0;
Lbl5.Visible := True;
Lbl5.Caption := '接收到' + intTostr(iRecvLength) + '字節';
end
else
begin //床號不正確,顯示錯誤并返回
LblErr.Caption := '設備號選擇出錯!';
LblErr.Visible := True;
end;
end
else //正在正在接收,檢測是否是07H(錯誤)
//設置停止標志終止線程的發送
for i := 0 to BufferLength - 1 do
begin
if ReceivedBuf[i] = $07 then
begin
bStart := false;
//存儲入文件
SaveRecvText;
LblErr.Caption := '數控機床設備返回錯誤信息,終止發送!';
LblErr.Visible := True;
Exit;
end
else if ReceivedBuf[i] = $17 then //完成了
begin
bStart := False;
//存儲入文件
SaveRecvText;
Lbl4.Font.Style := [fsbold];
Lbl5.Caption := '接收到' + intTostr(iRecvLength) + '字節' + ' 花費時間:'
+
IntToStr(GetTickCount - TickCount) + '毫秒';
btnFinish.Caption := '完成';
Exit;
end
else //否則是正常的數據
begin
//存儲入RecvText
RecvText := RecvText + Chr(ReceivedBuf[i]);
Inc(iRecvLength);
Lbl5.Caption := '接收到' + intTostr(iRecvLength) + '字節';
end;
end;
end;
procedure TImport.SaveRecvText;
var
BookMarker: Pointer;
sList: TStrings;
begin
try
sList := TStringList.Create;
try
sList.Add(RecvText);
sList.SaveToFile(sFilename);
with Query do
begin
Close;
SQL.Clear;
SQL.Add('Insert into Data(Author,Filename,Timestr,Filesize,channel,smemo)values('''
+ sUser + ''',''' + sFileName + ''',''' + DateTimeTostr(now) +
''','''
+ IntToStr(Trunc(iRecvLength / 1024) + 1) + 'KB'',' + IntToStr(Channel)
+
',''' +
sMemo +
''')');
ExecSQL;
Close;
end;
with Main do
begin
BookMarker := Table.GetBookmark;
Table.Close;
Table.Open;
Table.GotoBookmark(bookmarker);
end;
finally
sList.Free;
end;
except
ShowMsg('存儲文件出現錯誤!');
Exit;
end;
;
end;
procedure TImport.FormShow(Sender: TObject);
begin
pgcMain.ActivePageIndex := 0;
pgcMain.ActivePageIndex := 0;
btnPrior.Enabled := False;
btnNext.Enabled := True;
btnFinish.Caption := '取消';
bstart := False;
RecvText := '';
sFileName := Main.getNewfilename;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -