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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? exportfrm.pas

?? 《51單片機C語言應用程序設計實例精講》書后光盤代碼
?? 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 ExportFrm; //本單元用來發送數據

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); //用戶改變“設備”的事件
    procedure FormDestroy(Sender: TObject); //銷毀對象時執行
    procedure Comm1ReceiveError(Sender: TObject; EventMask: Cardinal); //SPCOMM接收數據錯誤事件
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word); //SPCOMM接收數據事件(很關鍵)
    procedure FormShow(Sender: TObject);
  private
    Fid: Integer; //局部變量存放ID
    Channel: Integer; //
    SendText: Tstrings; //發送的內容(數據機床命令,存在TSTRINGS對象中)
    { Private declarations }
  public
    bStart: Boolean; //是否已開始發送標志(用于線程與主界面同步)
    TickCount: Longword; //機床號
    procedure showForm(const id: integer);
    constructor Create(const id: Integer); reintroduce; overload;
    { Public declarations }
  end;
  //發送數據的線程,系統啟動發送后,其它的回復等由該線程進行

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

var
  ExportData: TExportData;
  SendThread: TSendThread;

implementation

uses Include, Mainfrm, ConfigFrm;

{$R *.dfm}

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

end;

procedure TExportData.btnNextClick(Sender: TObject);
var
  FileName, sTemp: string;
  BeginChar: Byte; //初始標志位
  BeginChannel: array[1..2] of Byte; //2位字節數組
begin
  case pgcmain.activepageindex of
    0: //如果是第一頁
      begin
        //初始化第二頁的控件
        //清空機床的列表框
        cboChannel.Clear;
        cboChannel.Items := Config.ChannelList;
        //從數據庫中查詢出要發送的文件的內容
        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);
            //如果內容是空的
            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
        //初始化發送前的準備工作
        Config.CommName := cboComm.Text; //串口
        Channel := cboChannel.ItemIndex + 1; //機床號

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

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

        //開始發送正式的數據標志置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;
  //轉下一頁
  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
  //轉前一頁
  pgcMain.ActivePageIndex := pgcMain.ActivePageIndex - 1;
  btnNext.Enabled := True;
  if pgcMain.ActivePageIndex = 0 then
    btnPrior.Enabled := False;
end;

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

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

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

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

procedure TExportData.Comm1ReceiveError(Sender: TObject;
  EventMask: Cardinal);
begin
  LblErr.Caption := '串口接收數據出現錯誤';
  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 //尚未開始,根據協議,接收到的應該就是具體的機床號與前面的機床號相同
    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 //床號正確//開始回發床號,并發數據 置start為True
      //根據協議,02H為發送數據的功能
      SendChar := 02;
      Comm1.WriteCommData(@SendChar, 1);
      bstart := True;
      //發數據
      Lbl3.Font.Style := [fsBold];
      pgb1.Percent := 0;
      //啟動數據發送線程
      SendThread := TSendThread.Create(SendText.Text);
    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;
        SendThread.Terminate;

        LblErr.Caption := '數控機床設備返回錯誤信息,終止發送!';
        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
  //線程的構造線程
  FSendText := Copy(SendText, 1, Length(SendText) - 2);
  inherited Create(False);
end;

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

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

  //開始發送之前記載發送的總長度
  Len := Length(FSendtext);
  //當前位置是第一個字符
  Pos := 1;
  //當發送數據未完而且主窗口的bstart為True則發送(如果主界面要取消,只要置bstart為false即可)
  while (Pos <= Len) and ExportData.bstart do
  begin
    //檢查是否發送該字節
    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);
      //發送
      ExportData.Comm1.WriteCommData(@CurrChar, 1);
    end;
    //當前位置增量
    Inc(Pos);
    //線程調用函數輸出進度信息
    Synchronize(Percent);
  end;
  //如果發送完了
  if Pos = Len + 1 then
  begin
    CurrChar := Chr($17);
    Sleep(100);
    //輸出結束標志17H,參看通訊協議
    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.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人高清免费在线播放| 黑人精品欧美一区二区蜜桃| 日韩美女视频在线| 欧美伊人精品成人久久综合97| 国产精品99久久久久久久vr| 天天影视网天天综合色在线播放 | 国产亚洲福利社区一区| 欧美一区二区三区免费大片| 欧美曰成人黄网| 91成人免费在线视频| 色呦呦国产精品| 91在线视频免费91| 91蝌蚪porny成人天涯| av在线不卡观看免费观看| 国产大陆a不卡| 成人做爰69片免费看网站| av中文字幕在线不卡| 一本一道久久a久久精品| 色婷婷激情综合| 欧美日韩精品一区二区三区蜜桃 | 国产精品久久久久久久久久免费看 | 奇米在线7777在线精品| 免费观看成人av| 青青草视频一区| 国产精品一区在线| av高清久久久| 欧美精品国产精品| 337p粉嫩大胆噜噜噜噜噜91av| 欧美精品一区二区三区蜜桃 | 麻豆国产欧美日韩综合精品二区| 美女高潮久久久| 成人一区二区三区视频| 日本精品一区二区三区高清| 欧美精品在线视频| 久久久综合激的五月天| 国产精品久久久久永久免费观看| 一区二区三区丝袜| 久久国产精品72免费观看| 成人一道本在线| 欧美日韩国产一二三| 精品国产制服丝袜高跟| 国产精品盗摄一区二区三区| 一区二区三区四区在线| 日本亚洲视频在线| 色综合久久综合网欧美综合网| 在线不卡中文字幕| 国产精品成人在线观看| 免费精品99久久国产综合精品| 国产成人精品aa毛片| 欧美日韩免费高清一区色橹橹| 久久综合九色综合欧美就去吻| 国产精品护士白丝一区av| 日韩**一区毛片| 99免费精品在线| 久久久久久久一区| 青椒成人免费视频| 欧美日韩中文国产| 国产精品另类一区| 精品亚洲成av人在线观看| 欧美一a一片一级一片| 国产香蕉久久精品综合网| 天天综合日日夜夜精品| 91女人视频在线观看| 久久精品日产第一区二区三区高清版| 亚洲日本一区二区| 成人黄色软件下载| 久久青草欧美一区二区三区| 男男视频亚洲欧美| 欧美色精品在线视频| 国产精品对白交换视频| 高清不卡在线观看av| 日韩精品一区二区三区在线播放 | 亚洲已满18点击进入久久| 成人h动漫精品一区二| 久久综合久久综合九色| 日韩和的一区二区| 欧美高清视频在线高清观看mv色露露十八| 国产精品乱人伦一区二区| 国产精品一区2区| 久久久久久亚洲综合影院红桃 | 欧美日韩国产精选| 亚洲国产成人精品视频| 色综合久久综合| 亚洲欧美视频一区| av爱爱亚洲一区| 国产精品伦一区二区三级视频| 国产suv精品一区二区883| 国产亚洲精品bt天堂精选| 不卡一区在线观看| 国产亚洲成aⅴ人片在线观看| 韩国在线一区二区| 久久九九国产精品| 懂色av中文一区二区三区| 久久精品人人做人人爽人人| 国产精品77777| 中文字幕在线一区免费| 99免费精品视频| 亚洲国产精品嫩草影院| 8x8x8国产精品| 麻豆国产精品视频| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品亚洲一区二区三区妖精 | 久久久激情视频| 成人h动漫精品| 亚洲v中文字幕| 日韩一卡二卡三卡国产欧美| 久久激情五月婷婷| 欧美国产精品一区| 在线精品观看国产| 美国毛片一区二区| 国产精品传媒入口麻豆| 在线看日本不卡| 久久狠狠亚洲综合| 亚洲日本va午夜在线影院| 欧美日韩一级片在线观看| 热久久免费视频| 国产精品家庭影院| 777欧美精品| av在线播放一区二区三区| 亚洲国产综合人成综合网站| 日韩欧美在线网站| 91碰在线视频| 久草在线在线精品观看| 亚洲色图在线看| 日韩三级av在线播放| 色先锋aa成人| 国产麻豆午夜三级精品| 亚洲曰韩产成在线| 中文在线免费一区三区高中清不卡| 色综合天天天天做夜夜夜夜做| 秋霞影院一区二区| 亚洲综合久久久久| 国产精品视频看| 精品国产在天天线2019| 欧美日韩国产在线播放网站| 国产大陆精品国产| 久久精品国产一区二区三 | 99精品在线观看视频| 久久99精品一区二区三区| 亚洲视频一区二区在线| 久久天堂av综合合色蜜桃网| 欧洲激情一区二区| 99视频精品全部免费在线| 久久精品久久久精品美女| 一区二区三区成人| 国产精品嫩草99a| 精品国产乱码久久久久久闺蜜 | 久久免费国产精品| 欧美一区二区三区在线观看| 色香色香欲天天天影视综合网| 国产成人av电影在线播放| 久久精品国产色蜜蜜麻豆| 午夜电影网亚洲视频| 亚洲尤物视频在线| 亚洲欧美另类小说| 国产精品盗摄一区二区三区| 国产婷婷一区二区| 久久影视一区二区| 久久这里只有精品首页| 久久免费的精品国产v∧| 欧美大片一区二区| 日韩欧美电影一区| 日韩欧美国产三级电影视频| 91精品免费在线| 欧美一级理论片| 日韩精品一区二区三区在线| 日韩免费电影一区| 日韩欧美久久久| 久久久久久电影| 国产日本欧洲亚洲| 国产精品高潮呻吟久久| 亚洲欧洲日韩在线| 亚洲精品免费电影| 亚洲成精国产精品女| 偷拍亚洲欧洲综合| 蜜桃精品视频在线观看| 国产自产2019最新不卡| 风间由美一区二区av101| 国产成人免费在线观看| proumb性欧美在线观看| 一本大道久久a久久综合| 欧美性色综合网| 欧美一卡在线观看| 久久精品亚洲一区二区三区浴池| 国产亚洲婷婷免费| 亚洲蜜桃精久久久久久久| 午夜欧美大尺度福利影院在线看| 日韩av电影免费观看高清完整版在线观看| 男人操女人的视频在线观看欧美| 美女脱光内衣内裤视频久久网站| 激情久久久久久久久久久久久久久久| 国内精品伊人久久久久av影院 | 国产一区999| 91在线免费看| 51精品秘密在线观看| 国产亚洲欧美日韩在线一区| 自拍偷拍国产精品| 久久精品国内一区二区三区| 成人丝袜视频网| 91精品一区二区三区久久久久久|