⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 childwin.cpp

📁 FT245BM C++ Builder 範例程式
💻 CPP
字号:
//---------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include <stdlib.h>
#include "ChildWin.h"
//---------------------------------------------------------------------
#include "Main.h"
//---------------------------------------------------------------------
#pragma resource "*.dfm"
//---------------------------------------------------------------------
#define FT_COLOR_HI     clGreen
#define FT_COLOR_LO     clRed
//---------------------------------------------------------------------

__fastcall TMDIChild::TMDIChild(TComponent *Owner)
	: TForm(Owner)
{
    ReadTimer->Enabled = true;

    Memo1->Lines->Clear();

    CurRow = 0;
    CurCol = 0;
}
//---------------------------------------------------------------------

__fastcall TMDIChild::TMDIChild(String Name)
	: TForm(Application)
{
    Caption = Name;

    int DevNum = atoi((Name.c_str())+3);
    ftDev = &Devices[DevNum];

    CurRow = 0;
    CurCol = 0;

    Memo1->Lines->Clear();

    ReadTimer->Enabled = true;
}
//---------------------------------------------------------------------

void __fastcall TMDIChild::FormActivate(TObject *Sender)
{
    if (ftDev)
        DisplayModemStatus(&ftDev->Data);

    CurDev = ftDev;
}
//---------------------------------------------------------------------------

void __fastcall TMDIChild::FormClose(TObject *Sender, TCloseAction &Action)
{
	Action = caFree;
    FT_Close(ftDev->Handle);
    ftDev->Window = NULL;

    CurDev = NULL;
}
//---------------------------------------------------------------------

void __fastcall TMDIChild::FormShow(TObject *Sender)
{
    RtsLabel->Font->Color = ConfigForm->RtsCB->Checked ? FT_COLOR_HI : FT_COLOR_LO;
    DtrLabel->Font->Color = ConfigForm->DtrCB->Checked ? FT_COLOR_HI : FT_COLOR_LO;
}
//---------------------------------------------------------------------------

void __fastcall TMDIChild::RtsLabelClick(TObject *Sender)
{
    RtsLabel->Font->Color =
        RtsLabel->Font->Color == FT_COLOR_LO ? FT_COLOR_HI : FT_COLOR_LO;
    if (RtsLabel->Font->Color == FT_COLOR_HI)
        FT_SetRts(ftDev->Handle);
    else
        FT_ClrRts(ftDev->Handle);
}
//---------------------------------------------------------------------------

void __fastcall TMDIChild::DtrLabelClick(TObject *Sender)
{
    DtrLabel->Font->Color =
        DtrLabel->Font->Color == FT_COLOR_LO ? FT_COLOR_HI : FT_COLOR_LO;
    if (DtrLabel->Font->Color == FT_COLOR_HI)
        FT_SetDtr(ftDev->Handle);
    else
        FT_ClrDtr(ftDev->Handle);
}
//---------------------------------------------------------------------------

void __fastcall TMDIChild::RecLabelClick(TObject *Sender)
{
    if (RecLabel->Visible) {
        RecLabel->Visible = false;
        MainForm->CloseFileItemClick(Sender);
    }
}
//---------------------------------------------------------------------------

void __fastcall TMDIChild::OnKeyPress(TObject *Sender, char &Key)
{
    ULONG BytesWritten;

    FT_Write(ftDev->Handle,&Key,1,&BytesWritten);

    Key = 0;
}
//---------------------------------------------------------------------------

#if 0
void __fastcall TMDIChild::OnTimer(TObject *Sender)
{
    char Buf[256];
    DWORD Status = 0;
    DWORD BytesRead = 0;
    DWORD RxBytes = 0;
    DWORD EventDWord = 0;

    if (CurDev->RxFile) {
        if (++CurDev->RecCount == FT_REC_COUNT_MAX) {
            CurDev->RecCount = 0;
            RecLabel->Visible = RecLabel->Visible ? false : true;
        }
    }
    else {
        RecLabel->Visible = false;
    }

#if 0
    FT_GetEventStatus(CurDev->Handle,&EventDWord);

    if (EventDWord & FT_EVENT_MODEM_STATUS) {

        FT_GetModemStatus(CurDev->Handle,&Status);
	    Status &= 0x000000ff;

        if (Status & 0x00000010)
        	CurDev->Data.CtsHi = true;
        else
        	CurDev->Data.CtsHi = false;

        if (Status & 0x00000020)
        	CurDev->Data.DsrHi = true;
        else
        	CurDev->Data.DsrHi = false;

        DisplayModemStatus();

    }

    FT_GetQueueStatus(CurDev->Handle,&RxBytes);
#else
    DWORD TxBytes;

    FT_GetStatus(CurDev->Handle,&RxBytes,&TxBytes,&EventDWord);

    if (EventDWord & FT_EVENT_MODEM_STATUS) {

        FT_GetModemStatus(CurDev->Handle,&Status);

        if (Status & 0x00000010)
        	CurDev->Data.CtsHi = true;
        else
        	CurDev->Data.CtsHi = false;

        if (Status & 0x00000020)
        	CurDev->Data.DsrHi = true;
        else
        	CurDev->Data.DsrHi = false;

        CurDev->Window->DisplayModemStatus();

    }
#endif

    while (RxBytes) {
        FT_ExRead(CurDev->Handle,Buf,256,&BytesRead);
        RxBytes -= BytesRead;
        if (!CurDev->RxFile) {
            char *s = Buf;
            while (BytesRead--)
                CurDev->Window->PutChar(*s++);
        }
        else {
            fwrite(Buf,1,BytesRead,CurDev->RxFile);
        }
    }

}
#else
void __fastcall TMDIChild::OnTimer(TObject *Sender)
{
    char Buf[256];
    DWORD Status = 0;
    DWORD BytesRead = 0;
    DWORD RxBytes = 0;
    DWORD EventDWord = 0;
    BOOL gotIt = FALSE;

    TFtDevice *Dev;
    TMDIChild *W;

    for (Dev = Devices; Dev < &Devices[NUMBER_OF_DEVICES]; Dev++) {

        W = (TMDIChild *) Dev->Window;

        if (!W)
            continue;

        if (W->ReadTimer == Sender) {
            gotIt = TRUE;
            break;

       }

    }

    if (!gotIt)
        return;

    if (Dev->RxFile) {
        if (++Dev->RecCount == FT_REC_COUNT_MAX) {
            Dev->RecCount = 0;
            W->RecLabel->Visible = W->RecLabel->Visible ? false : true;
        }
    }
    else {
        W->RecLabel->Visible = false;
    }

    DWORD TxBytes;

    FT_GetStatus(Dev->Handle,&RxBytes,&TxBytes,&EventDWord);

//  if (EventDWord & FT_EVENT_MODEM_STATUS) {

        FT_GetModemStatus(Dev->Handle,&Status);

        if (Status & 0x00000010)
        	Dev->Data.CtsHi = true;
        else
       	    Dev->Data.CtsHi = false;

        if (Status & 0x00000020)
           	Dev->Data.DsrHi = true;
        else
       	    Dev->Data.DsrHi = false;

        W->DisplayModemStatus(Dev);

//  }

    if (RxBytes == 0) {
        W->Flush();
        return; //continue;
    }

    while (RxBytes > 0) {
        FT_Read(Dev->Handle,Buf,RxBytes < 256 ? RxBytes : 256,&BytesRead);
        RxBytes -= BytesRead;
        if (!Dev->RxFile) {
#if 0
            char *s = Buf;
            while (BytesRead--)
                W->PutChar(*s++);
#else
            W->PutStr(Buf,BytesRead);
            W->Flush();
#endif
        }
        else {
            fwrite(Buf,1,BytesRead,Dev->RxFile);
        }
    }

}
#endif
//---------------------------------------------------------------------------

void __fastcall TMDIChild::PutChar(char c)
{
    if (c == 13 /*|| c == 10*/)
        CurCol = NUMBER_OF_COLUMNS-1;
    else if (c < 0x20)
        return;
    else {
        char buf[2];
        buf[0] = c;
        buf[1] = 0;
        Memo1->Text = Memo1->Text + buf;
        Memo1->SelStart = CurRow*NUMBER_OF_COLUMNS + CurCol + 1;
        Memo1->SelLength = 1;
    }

    if (++CurCol == NUMBER_OF_COLUMNS) {
        ++CurRow;
        CurCol = 0;
        Memo1->Lines->Add("");
        Memo1->SelStart = CurRow*NUMBER_OF_COLUMNS + CurCol + 1;
        Memo1->SelLength = 1;
    }

}
//---------------------------------------------------------------------------

void __fastcall TMDIChild::PutStr(char *s,DWORD len)
{
    char c;

    MemoBufIndex = 0;

    while (len--) {

        c = *s++;

        if (c == 13)
            CurCol = NUMBER_OF_COLUMNS-1;
        else if (c < 0x20)
            continue;
        else {
            MemoBuf[MemoBufIndex++] = c;
        }

        if (++CurCol == NUMBER_OF_COLUMNS) {
            MemoBuf[MemoBufIndex] = 0;
            Memo1->Text = Memo1->Text + MemoBuf;
            MemoBufIndex = 0;
            ++CurRow;
            CurCol = 0;
            Memo1->Lines->Add("");
            Memo1->SelStart = CurRow*NUMBER_OF_COLUMNS + CurCol + 1;
            Memo1->SelLength = 1;
        }

    }

}
//---------------------------------------------------------------------------

void __fastcall TMDIChild::Flush(void)
{
    MemoBuf[MemoBufIndex] = 0;
    Memo1->Text = Memo1->Text + MemoBuf;
    Memo1->SelStart = CurRow*NUMBER_OF_COLUMNS + CurCol + 1;
    Memo1->SelLength = 1;
    MemoBufIndex = 0;
}
//---------------------------------------------------------------------------

void __fastcall TMDIChild::DisplayModemStatus(PVOID pDev)
{
    TFtDevice *Dev = (TFtDevice *) pDev;

    CtsLabel->Font->Color = Dev->Data.CtsHi ? FT_COLOR_HI : FT_COLOR_LO;
    DsrLabel->Font->Color = Dev->Data.DsrHi ? FT_COLOR_HI : FT_COLOR_LO;
    DcdLabel->Font->Color = Dev->Data.DcdHi ? FT_COLOR_HI : FT_COLOR_LO;
    RingLabel->Font->Color = Dev->Data.RingHi ? FT_COLOR_HI : FT_COLOR_LO;
}
//---------------------------------------------------------------------------


void __fastcall TMDIChild::Memo1DblClick(TObject *Sender)
{
    Memo1->Clear();
    CurRow = 0;
    CurCol = 0;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -