亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? exportfrm.pas

?? PC機控制系統(tǒng)程序
?? PAS
字號:
{
=====================================================================
* 軟件名稱:PC與數(shù)控機床通信程序
* 單元名稱:發(fā)送數(shù)據(jù)到數(shù)控機床
* 單元作者:彭為 (pwzyp@fjsm.net)
* 備    注:用到了線程進行發(fā)送
* 開發(fā)平臺:PWin2000 SERVER + Delphi 7.0
* 兼容測試:PWin9X/2000/XP + Delphi 6/7
* 采用控件:Raize 3.12 ,SPCOMM
* 修改記錄:V1.0  by pengwei
=====================================================================
}
unit ExportFrm; //本單元用來發(fā)送數(shù)據(jù)

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
  TExportData = 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;
    edtUser: TEdit;
    edtMemo: TEdit;
    TabSheet3: TRzTabSheet;
    Image4: TImage;
    RzLabel12: TRzLabel;
    RzBorder3: TRzBorder;
    Lbl1: TRzLabel;
    Lbl2: TRzLabel;
    Lbl3: TRzLabel;
    pgb1: TRzProgressBar;
    Lbl4: TRzLabel;
    LblErr: TRzLabel;
    Lbl5: TRzLabel;
    RzLabel7: TRzLabel;
    RzLabel8: TRzLabel;
    cboChannel: TComboBox;
    RzBorder4: TRzBorder;
    RzLabel9: TRzLabel;
    cboComm: TComboBox;
    Comm1: TComm;
    Query: TADOQuery;
    LblCommErr: TRzLabel;
    procedure FormCreate(Sender: TObject); //界面初始化代碼
    procedure btnNextClick(Sender: TObject); //“下一步”按鈕點擊事件
    procedure btnPriorClick(Sender: TObject); //“上一步”按鈕點擊事件
    procedure btnFinishClick(Sender: TObject); //“完成”按鈕點擊事件
    procedure cboChannelEnter(Sender: TObject); //用戶改變“設(shè)備”的事件
    procedure FormDestroy(Sender: TObject); //銷毀對象時執(zhí)行
    procedure Comm1ReceiveError(Sender: TObject; EventMask: Cardinal); //SPCOMM接收數(shù)據(jù)錯誤事件
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word); //SPCOMM接收數(shù)據(jù)事件(很關(guān)鍵)
    procedure FormShow(Sender: TObject);
  private
    Fid: Integer; //局部變量存放ID
    Channel: Integer; //
    SendText: Tstrings; //發(fā)送的內(nèi)容(數(shù)據(jù)機床命令,存在TSTRINGS對象中)
    { Private declarations }
  public
    bStart: Boolean; //是否已開始發(fā)送標志(用于線程與主界面同步)
    TickCount: Longword; //機床號
    procedure showForm(const id: integer);
    constructor Create(const id: Integer); reintroduce; overload;
    { Public declarations }
  end;
  //發(fā)送數(shù)據(jù)的線程,系統(tǒng)啟動發(fā)送后,其它的回復(fù)等由該線程進行

  TSendThread = class(TThread)
  private
    Pos, Len: LongWord; //當前位置,總長度
    CurrChar: Char; // 當前發(fā)送的字符
    FSendText: string; //全部長度
    procedure Ok; //發(fā)送完成后執(zhí)行的過程
    procedure Percent; //顯示百分比過程
  public
    constructor Create(SendText: string); //線程的構(gòu)造過程
    procedure Execute; override; //線程的執(zhí)行體
  end;

var
  ExportData: TExportData;
  SendThread: TSendThread;

implementation

uses Include, Mainfrm, ConfigFrm;

{$R *.dfm}

procedure TExportData.FormCreate(Sender: TObject);
begin
  Caption := sExportCaption; //sExportCaption是窗口名'發(fā)送數(shù)據(jù)至數(shù)控機床'
  SendText := TStringlist.Create; //構(gòu)造臨時變量

end;

procedure TExportData.btnNextClick(Sender: TObject);
var
  FileName, sTemp: string;
  BeginChar: Byte; //初始標志位
  BeginChannel: array[1..2] of Byte; //2位字節(jié)數(shù)組
begin
  case pgcmain.activepageindex of
    0: //如果是第一頁
      begin
        //初始化第二頁的控件
        //清空機床的列表框
        cboChannel.Clear;
        cboChannel.Items := Config.ChannelList;
        //從數(shù)據(jù)庫中查詢出要發(fā)送的文件的內(nèi)容
        with Query do
        begin
          Close;
          SQL.Clear;
          SQL.Add('Select * from Data where id=' + IntToStr(Fid));
          Open;
          FileName := FieldByName('filename').AsString;
          if FileExists(FileName) then //如果文件存在的話
          begin
            Application.ProcessMessages;
            SendText.LoadFromFile(FileName);
            //如果內(nèi)容是空的
            if Trim(SendText.Text) = '' then
            begin
              MessageBox(Self.Handle, PChar(sFileEmpty), PChar(sTitleErr), MB_OK
                +
                MB_ICONERROR);
              exit;
            end;
          end
          else
          begin //如果文件不存在
            MessageBox(Self.Handle, PChar(sNotFile), PChar(sTitleErr), MB_OK +
              MB_ICONERROR);
            exit;
          end;
          //初始化必要的信息
          edtUser.Text := FieldByName('Author').AsString;
          edtMemo.Text := FieldByName('sMemo').AsString;
          Channel := FieldByName('Channel').AsInteger;
          cboChannel.ItemIndex := Channel - 1;
          cboComm.ItemIndex := cboComm.Items.IndexOf(Config.CommName);
          Close;
        end;
        LblCommErr.Visible := False;
      end;
    1: //如果是第二頁
      begin
        //初始化發(fā)送前的準備工作
        Config.CommName := cboComm.Text; //串口
        Channel := cboChannel.ItemIndex + 1; //機床號

        //啟動SPCOMM控件COMM1
        Comm1.CommName := Config.CommName;
        //先關(guān)閉
        Comm1.StopComm;
        try
          //再打開
          Comm1.StartComm;
        except
          //捕獲異常
          LblCommErr.Visible := True;
          Exit;
        end;
        //起始字節(jié)為01,具體請參看通訊協(xié)議
        BeginChar := 01;
        //把機床號變成2位的ASCII碼
        sTemp := Format('%.2d', [channel]);
        //把它的ASCII值送到臨時數(shù)組中去
        BeginChannel[1] := Ord(sTemp[1]);
        BeginChannel[2] := Ord(sTemp[2]);

        //        ShowMessage(Format('%x %x %x', [beginchar[1], beginchar[2],beginchar[3]]));
        Sleep(100); //如果不休眠100毫秒,可能會發(fā)生錯誤,因為打開串口需要時間,以下類同
        Comm1.WriteCommData(@BeginChar, 1); //用SPCOMM往端口發(fā)送啟始位01H
        Sleep(100);
        Comm1.WriteCommData(@BeginChannel, 2); //用SPCOMM發(fā)送機床號(選床)

        //開始發(fā)送正式的數(shù)據(jù)標志置FALSE
        bStart := False;

        //界面代碼,使界面上的字變粗顯示表示當前進度
        Lbl1.Font.Style := [fsBold];
        Lbl2.Font.Style := [fsBold];
        Lbl3.Font.Style := [];
        Lbl4.Font.Style := [];
        Lbl5.Visible := False;
        LblErr.Visible := False;
        pgb1.Percent := 0;
      end;
  else
    ;
  end;
  //轉(zhuǎn)下一頁
  pgcMain.ActivePageIndex := pgcMain.ActivePageIndex + 1;
  btnPrior.Enabled := True;
  if pgcMain.ActivePageIndex = pgcMain.PageCount - 1 then
    btnNext.Enabled := False;
end;

procedure TExportData.btnPriorClick(Sender: TObject);
begin
  //轉(zhuǎn)前一頁
  pgcMain.ActivePageIndex := pgcMain.ActivePageIndex - 1;
  btnNext.Enabled := True;
  if pgcMain.ActivePageIndex = 0 then
    btnPrior.Enabled := False;
end;

procedure TExportData.showForm(const id: integer);
begin
  //顯示窗體的函數(shù)(實際調(diào)用時用本函數(shù)即可)
  if ExportData = nil then
    ExportData := TExportData.Create(id);
  ExportData.ShowModal;
end;

procedure TExportData.btnFinishClick(Sender: TObject);
begin
  //點擊了完成 或取消
  if bStart then
  begin
    // 如果正在發(fā)送,則關(guān)閉線程
    bStart := False;
    SendThread.Terminate;
    //中斷發(fā)送數(shù)據(jù)線程
  end;
  //關(guān)閉串口
  Comm1.StopComm;
  Close;
end;

procedure TExportData.cboChannelEnter(Sender: TObject);
begin
  LblCommErr.Visible := False;
end;

procedure TExportData.FormDestroy(Sender: TObject);
begin
  //釋放內(nèi)存
  SendText.Free;
end;

procedure TExportData.Comm1ReceiveError(Sender: TObject;
  EventMask: Cardinal);
begin
  LblErr.Caption := '串口接收數(shù)據(jù)出現(xiàn)錯誤';
  LblErr.Visible := True;
end;

procedure TExportData.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
    //把接收到的字符放入BUFFER
    Move(Buffer^, Pchar(@ReceivedBuf[0])^, BufferLength);
  except
    ShowMsg(sErrReceive1);
    exit;
  end;
  if not bStart then
  begin //尚未開始,根據(jù)協(xié)議,接收到的應(yīng)該就是具體的機床號與前面的機床號相同
    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 //床號正確//開始回發(fā)床號,并發(fā)數(shù)據(jù) 置start為True
      //根據(jù)協(xié)議,02H為發(fā)送數(shù)據(jù)的功能
      SendChar := 02;
      Comm1.WriteCommData(@SendChar, 1);
      bstart := True;
      //發(fā)數(shù)據(jù)
      Lbl3.Font.Style := [fsBold];
      pgb1.Percent := 0;
      //啟動數(shù)據(jù)發(fā)送線程
      SendThread := TSendThread.Create(SendText.Text);
    end
    else
    begin //床號不正確,顯示錯誤并返回
      LblErr.Caption := '設(shè)備號選擇出錯!';
      LblErr.Visible := True;
    end;
  end
  else
    //其它情況正在正在發(fā)送,檢測是否是07H(錯誤)
    //設(shè)置停止標志終止線程的發(fā)送
    for i := 0 to BufferLength - 1 do
    begin
      if ReceivedBuf[i] = $07 then
      begin
        bStart := false;
        SendThread.Terminate;

        LblErr.Caption := '數(shù)控機床設(shè)備返回錯誤信息,終止發(fā)送!';
        LblErr.Visible := True;
        Exit;
      end
      else if ReceivedBuf[i] = $17 then //完成了
      begin
        bStart := False;
        pgb1.Percent := 100;
        Lbl4.Font.Style := [fsbold];
        Lbl5.Caption := '花費時間:' + IntToStr(GetTickCount - TickCount) +
          '毫秒';
        btnFinish.Caption := '完成';
        Exit;
      end;
    end;
end;

{ TSendThread }

constructor TSendThread.Create(SendText: string);
begin
  //線程的構(gòu)造線程
  FSendText := Copy(SendText, 1, Length(SendText) - 2);
  inherited Create(False);
end;

procedure TSendThread.Execute;
var
  isSend: Boolean;
begin
  FreeOnTerminate := True; //控制線程空閑時自動中斷
  ExportData.TickCount := GetTickCount; //時間戳(用來計算發(fā)送時間)

  if not TestEOF(FSendText) then //如果沒有結(jié)束符加入結(jié)束符
    //TESTEOF的函數(shù)在INCLUDE單元中定義,請查看所有源代碼
    FSendText := FSendText + Chr(26);

  //開始發(fā)送之前記載發(fā)送的總長度
  Len := Length(FSendtext);
  //當前位置是第一個字符
  Pos := 1;
  //當發(fā)送數(shù)據(jù)未完而且主窗口的bstart為True則發(fā)送(如果主界面要取消,只要置bstart為false即可)
  while (Pos <= Len) and ExportData.bstart do
  begin
    //檢查是否發(fā)送該字節(jié)
    isSend := True;
    CurrChar := FSendText[pos];
    case CurrChar of
      'a'..'z': CurrChar := UpperCase(CurrChar)[1];
      'A'..'Z', '0'..'9', '+', '-', '/', '.', Chr(26), '%', Chr(00), Chr($0A): ;
    else
      isSend := False;
    end;

    if isSend then
    begin
      //暫停若干秒
      Sleep(Config.Delaytime);
      //發(fā)送
      ExportData.Comm1.WriteCommData(@CurrChar, 1);
    end;
    //當前位置增量
    Inc(Pos);
    //線程調(diào)用函數(shù)輸出進度信息
    Synchronize(Percent);
  end;
  //如果發(fā)送完了
  if Pos = Len + 1 then
  begin
    CurrChar := Chr($17);
    Sleep(100);
    //輸出結(jié)束標志17H,參看通訊協(xié)議
    ExportData.Comm1.WriteCommData(@CurrChar, 1);
    Synchronize(ok);
  end;
  //  Self.Terminate;
  //  PostMessage(Application.Handle, WM_QUIT, 0, 0); ;
end;

procedure TSendThread.Ok;
begin
  ExportData.pgb1.Percent := 100;
  ExportData.Lbl4.Font.Style := [fsbold];
  ExportData.Lbl5.Visible := True;
  ExportData.Lbl5.Caption := '花費時間:' + IntToStr(GetTickCount -
    ExportData.TickCount) +
    '毫秒';
  ExportData.btnFinish.Caption := '完成';
  ExportData.bstart := False;
end;

procedure TSendThread.Percent;
begin
  ExportData.pgb1.Percent := trunc((Pos / Len) * 100);
end;

procedure TExportData.FormShow(Sender: TObject);
begin
  //顯示窗體時初始化
  pgcMain.ActivePageIndex := 0;
  btnPrior.Enabled := False;
  btnNext.Enabled := True;
  btnFinish.Caption := '取消';
  Comm1.StopComm;

  SendText.Clear;
end;

constructor TExportData.Create(const id: Integer);
begin
  inherited Create(Application);
  Fid := id;
end;

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕在线播放不卡一区| 精品一区二区日韩| 福利一区二区在线观看| 精品国产凹凸成av人导航| 青青草精品视频| 日韩一区二区高清| 精品午夜久久福利影院| 2020日本不卡一区二区视频| 国产精品亚洲一区二区三区妖精 | 精品少妇一区二区三区免费观看| 日韩精品91亚洲二区在线观看| 91麻豆精品国产91久久久更新时间| 亚瑟在线精品视频| 精品少妇一区二区三区免费观看| 国产精品77777| 日韩理论电影院| 欧美日韩中文一区| 久久精品国产精品亚洲精品| 国产日韩欧美在线一区| 99vv1com这只有精品| 亚洲一级电影视频| 日韩你懂的在线播放| 国产成人精品一区二区三区四区| 亚洲欧美日本在线| 欧美一区二区免费观在线| 国产乱人伦偷精品视频不卡 | 色婷婷精品久久二区二区蜜臂av | 国产精品综合久久| 亚洲女同ⅹxx女同tv| 欧美二区三区的天堂| 国产精品一品二品| 亚洲国产另类av| www久久精品| 91传媒视频在线播放| 久久精品国产77777蜜臀| 国产精品久久影院| 欧美精品三级在线观看| 丰满白嫩尤物一区二区| 亚洲午夜av在线| 久久男人中文字幕资源站| 一本久久综合亚洲鲁鲁五月天| 日韩二区三区四区| 中文字幕日韩av资源站| 日韩免费观看2025年上映的电影| 不卡一区中文字幕| 久久国产麻豆精品| 亚洲综合丝袜美腿| 国产日韩av一区| 91精品国产黑色紧身裤美女| 成人av综合在线| 视频一区视频二区在线观看| 国产精品一区二区不卡| 一区二区三区精品视频| 日韩欧美国产综合一区| 在线观看亚洲a| 成人动漫精品一区二区| 久热成人在线视频| 亚洲国产精品久久人人爱蜜臀| 国产欧美日韩三区| 91精品国产一区二区三区| 色呦呦国产精品| 国产精品亚洲第一区在线暖暖韩国 | 极品少妇xxxx偷拍精品少妇| 亚洲一区二区美女| 亚洲女人的天堂| 国产精品麻豆视频| 久久久精品黄色| 日韩欧美自拍偷拍| 337p亚洲精品色噜噜噜| 欧美色网站导航| 在线亚洲一区二区| 99免费精品视频| 国产成人亚洲精品青草天美| 黄页网站大全一区二区| 男女视频一区二区| 日本中文字幕一区二区有限公司| 亚洲线精品一区二区三区八戒| 亚洲色图视频网| 国产精品国产成人国产三级| 中文字幕av一区二区三区| 久久精品欧美一区二区三区不卡| 欧美成人a∨高清免费观看| 欧美一区二区三区在线电影| 欧美老肥妇做.爰bbww视频| 欧美精品tushy高清| 91精品国产免费| 精品国产区一区| 久久―日本道色综合久久| 国产亚洲欧美中文| 中文子幕无线码一区tr| 国产精品激情偷乱一区二区∴| 国产精品久久精品日日| 一区二区三区四区不卡在线| 亚洲福利电影网| 美女网站在线免费欧美精品| 国产在线日韩欧美| 成人小视频在线| 色综合天天在线| 欧美日韩的一区二区| 欧美精品一级二级| 色欧美日韩亚洲| 色狠狠综合天天综合综合| 色哟哟一区二区| 欧美性猛片aaaaaaa做受| 91麻豆精品国产91久久久久| 91精品在线免费观看| 欧美精品日韩一区| 精品久久人人做人人爰| 精品少妇一区二区三区视频免付费| 日韩欧美国产一区在线观看| 欧美精品欧美精品系列| 国产欧美一区二区精品忘忧草| 国产欧美视频一区二区三区| 国产精品麻豆一区二区| 一区二区视频免费在线观看| 午夜精品一区二区三区三上悠亚| 婷婷开心激情综合| 国产麻豆精品视频| 不卡欧美aaaaa| 欧美丝袜第三区| 51精品国自产在线| 亚洲精品在线免费播放| 一区二区激情小说| 日本伊人午夜精品| 国产成人午夜99999| 色综合久久久久综合体| 91麻豆精品国产| 久久久久久久久99精品| 午夜视频一区二区| 国产又黄又大久久| 99久久夜色精品国产网站| 欧美日韩一区不卡| 久久免费看少妇高潮| 国产精品乱人伦| 久久精品噜噜噜成人av农村| 成人精品免费网站| 欧美老年两性高潮| 亚洲国产成人在线| 亚洲福利视频导航| 99精品久久免费看蜜臀剧情介绍| 欧美精品自拍偷拍| 国产精品乱码人人做人人爱| 丝瓜av网站精品一区二区 | 久久精品免费观看| 成人av网站在线观看| 欧美电影一区二区三区| 国产精品你懂的在线欣赏| 日韩在线卡一卡二| 岛国精品在线播放| 精品国产精品网麻豆系列| 亚洲综合激情小说| 东方欧美亚洲色图在线| 欧美精品tushy高清| 亚洲视频一区二区在线| 国产综合色视频| 欧美日本在线看| 亚洲欧洲精品成人久久奇米网| 男女男精品视频网| 色婷婷精品大在线视频| 亚洲天堂精品在线观看| 九九精品视频在线看| 欧美中文字幕一区| 中文字幕精品在线不卡| 精品一区二区精品| 欧美顶级少妇做爰| 五月综合激情婷婷六月色窝| 成人av高清在线| 久久久国产精华| 久久99久久精品| 欧美日韩mp4| 日本视频一区二区三区| 欧美伊人精品成人久久综合97| 亚洲欧美在线观看| 丁香婷婷综合网| 久久久久国色av免费看影院| 日欧美一区二区| 91麻豆精品国产91久久久资源速度| 亚洲一级二级三级| 在线免费观看日韩欧美| 亚洲日穴在线视频| 91丨porny丨首页| 一个色综合av| 欧美影院一区二区| 一区二区不卡在线视频 午夜欧美不卡在| 粉嫩13p一区二区三区| 欧美一区二区三区免费在线看| 蜜臀av亚洲一区中文字幕| 91麻豆精品91久久久久同性| 亚洲国产成人tv| 欧美片在线播放| 日韩av一区二区在线影视| 91精品一区二区三区久久久久久| 日韩主播视频在线| 日韩一区二区免费在线电影 | 97久久超碰国产精品| 国产亚洲一区二区三区四区| 99精品视频免费在线观看| 一区免费观看视频| 91成人免费网站| 天堂在线亚洲视频|