Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с принтером и печатью, Создание своего класса 
V
    Опции темы
SenkraD
Дата 3.2.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



Помогите!
Дали мне класс принтера, но он для матричников и печати на рулоне. А надо дописать, чтобы он
поддерживал графпечать (лазерные, струйники).
Да и вообще сказали, что сам класс тоже бы переписать не помешало ибо его кривовато написали.
Вот так.
P.S.Может этот вопрос покажется глупым, то так напишите
А вот этот кривой класс
//----Код--
Код

#include "Printer.h"
#include<stdio.h>
#include <io.h>
#include <fcntl.h>

CPrinter::CPrinter()
{
    pParamList = new Queue;
}

CPrinter::~CPrinter()
{
        Queue* ptTestArray=pParamList;
        Queue* ptOldArray=pParamList;
    if(ptTestArray->NextComponent!=NULL)
    {
        ptTestArray=ptTestArray->NextComponent;
        while(ptTestArray!=NULL)
        {
            ptOldArray=ptTestArray;
            if(ptTestArray->Buf!=NULL) delete(ParamVar*)ptTestArray->Buf;
            ptTestArray=ptTestArray->NextComponent;
            delete ptOldArray;
        }
    }
    if(pParamList->Buf!=NULL) delete (ParamVar*)pParamList->Buf;
    delete pParamList;
}

int CPrinter::GetPrintData(char* FileName,PRINTERDATA &TerminalPrintData, char *OutData)
{
    unsigned int File;
    char strLine[255];
    OutData[0]=0;
    pPrinterData=&TerminalPrintData;
    File=open(FileName,O_BINARY|O_RDONLY);
    if(File!=-1)
    {
        int Point=0;
        memset(strLine, 0, sizeof(strLine));
        while(read(File,&strLine[Point++],1)!=0)
        {
            if((strLine[Point-1]==0x0D)||(strLine[Point-1]==0x0A))
            {
                strLine[Point-1]=0;
                TranslateLine(strLine,OutData);
                Point=0;
            }
        }
        int TmpLen=strlen(OutData);
        OutData[TmpLen++]='\n'; //0x0c;
        OutData[TmpLen]=0x0;
        close(File);
        return 0;
    }
    return -1;
}

int CPrinter::TranslateLine(char *strLine, char *OutData)
{
    int NumberFild=0;
    short maxlen = 255;
    char strWorld[255];


    if(!SeparateWorld(NumberFild,strLine,strWorld,maxlen))
    {
        if(!strcmp(strWorld,"var"))
        {
            ParamVar Var;
            if(SeparateWorld(1,strLine,strWorld,maxlen)) return 1;
            if(strWorld[0]!='@') return 1;
            strWorld[16]=0;
            strcpy(Var.VarName,strWorld);

            if(SeparateWorld(2,strLine,strWorld,maxlen)) return 1;
            strWorld[50]=0;
            strcpy(Var.VarId,strWorld);

            if(SeparateWorld(3,strLine,strWorld,maxlen)) return 1;
            strWorld[16]=0;
            strcpy(Var.VarType,strWorld);

            if(SeparateWorld(4,strLine,strWorld,maxlen)) return 1;
            strWorld[16]=0;
            Var.VarLen=atoi(strWorld);

            if(SeparateWorld(5,strLine,strWorld,maxlen)) return 0;
            strWorld[16]=0;
            strcpy(Var.VarPlaceType,strWorld);

            if(SeparateWorld(6,strLine,strWorld,maxlen)) return 0;
            //strWorld[16]=0;
            strcpy(Var.VarMetodVisualisation,strWorld);
            AddParamVar(Var);
            return 0;
        }
        else
        {
            char PrintData[255];
            memset(PrintData, 0, sizeof(PrintData));
            if(!strcmp(strWorld,"print"))
            {
                if(SeparateLine(strLine,PrintData)) return 1;
                char LoadData[255];
                LoadPrintData(PrintData,LoadData);
                strcpy(&OutData[strlen(OutData)],PrintData);
                return 0;
            }
            else
            {
                return 0;
            }

        }
    }
    return 1;
}

int CPrinter::SeparateWorld(int NumberField, char *strLine, char *strWorld, short maxlen)
{
        memset(strWorld, 0, maxlen+1);
    int Point=0;
    int PointWorld=0;
    int Number=0;
    while(strLine[Point]!=0 && Point<=maxlen)
    {
        while((strLine[Point]==' ')||(strLine[Point]==',')) Point++;
        while((strLine[Point]!=' ')&&(strLine[Point]!=0)&&(strLine[Point]!=',')) 
        {
            if(Number==NumberField)
            {
                strWorld[PointWorld++]=strLine[Point];
            }
                Point++;
        }
        strWorld[PointWorld]=0;
        if(Number==NumberField) return 0;
        if(strLine[Point]==0) return 1;
        Number++;
    }
    return 1;
}

int CPrinter::LoadPrintData(char *PrintData, char *OutData)
{
    int Point=0;
    int CursorPoint=0;
    CPrinter::ParamVar Var;
    strcpy(OutData,PrintData);
    for(;;)    {
        while((PrintData[Point]!='@')&&(PrintData[Point]!=0)) Point++;
        if (PrintData[Point]==0)
        {
//            PrintData[Point++]=0x0D;
            PrintData[Point++]=0x0A;
            PrintData[Point]=0;
            return 0;
        }
        int Place = Point;
        char TmpBuf[255];
        int TmpNumber=0;
        TmpBuf[TmpNumber++]=PrintData[Point++];
        while((PrintData[Point]>=0x30)&&(PrintData[Point]<=0x39))
        {
            TmpBuf[TmpNumber++]=PrintData[Point++];
        }
        TmpBuf[TmpNumber]=0;
        if(GetParamVar(TmpBuf,Var)) return 1;
        char strOut[16];
        GetPrintParam(Var,strOut);
        if(Var.VarType[0] =='C')
        {
            int Len=strlen(strOut);
            int LenOll=strlen(PrintData);
            strcpy(TmpBuf,&PrintData[Point]);
            strcpy(&PrintData[Place+Len],TmpBuf);
            PrintData[LenOll]=0;
        }
        int NewPoint=0;
        CursorPoint=Point+strlen(strOut);
        while(strOut[NewPoint]!=0) PrintData[Place++]=strOut[NewPoint++];
    }

}

int CPrinter::AddParamVar(CPrinter::ParamVar &Var)
{
    Queue*   pQueue=new Queue;
    ParamVar* pParamVar=new ParamVar;
    *pParamVar=Var;
    pQueue->Buf=pParamVar;
        pQueue->NextComponent=pParamList->NextComponent;
        pParamList->NextComponent=pQueue;
    return 0;
}

int CPrinter::GetParamVar(char *TmpBuf, CPrinter::ParamVar& Var)
{
    Queue* ptTestArray=pParamList;
    ParamVar* ptAddress;
    while(ptTestArray->NextComponent!=NULL)
    {
        ptTestArray=ptTestArray->NextComponent;
        ptAddress=(ParamVar*)ptTestArray->Buf;
        if(strcmp(ptAddress->VarName,TmpBuf)==0)
        {
            Var=*ptAddress;
            return 0;
        }
    }
    return 1;
}

int CPrinter::GetPrintParam(CPrinter::ParamVar& Var, char* strOut)
{
    char TmpBuf[128];
    memset(TmpBuf, 0, sizeof(TmpBuf));
    for(;;) {
         if (!stricmp(Var.VarId, "Number"))
            strcpy(TmpBuf, pPrinterData->Number);
        else
        if (!stricmp(Var.VarId, "RRN"))
            strcpy(TmpBuf, pPrinterData->RRN);
        else
        if (!stricmp(Var.VarId, "PAN"))
            strcpy(TmpBuf, pPrinterData->PAN);
        else
          if (!stricmp(Var.VarId, "EXP"))
            strcpy(TmpBuf, pPrinterData->EXP);
        else
          if (!stricmp(Var.VarId, "Date"))
            strcpy(TmpBuf, pPrinterData->Date);
        else
          if (!stricmp(Var.VarId, "Time"))
            strcpy(TmpBuf, pPrinterData->Time);
        else
        if (!stricmp(Var.VarId, "Amount"))
            strcpy(TmpBuf, pPrinterData->Amount);
        else
                if (!stricmp(Var.VarId, "Summ"))
            strcpy(TmpBuf, pPrinterData->Summ);
        else
                if (!stricmp(Var.VarId, "Persent"))
            strcpy(TmpBuf, pPrinterData->Persent);
        else
        if (!stricmp(Var.VarId, "AmountCurrency"))
            strcpy(TmpBuf, pPrinterData->AmountCurrency);
        else
        if (!stricmp(Var.VarId, "TerminalId"))
            strcpy(TmpBuf, pPrinterData->TerminalId);
        else
                if (!stricmp(Var.VarId, "MerchantId"))
            strcpy(TmpBuf, pPrinterData->MerchantId);
         else
                if (!stricmp(Var.VarId, "CardType"))
            strcpy(TmpBuf, pPrinterData->CardType);
        else
        if (!stricmp(Var.VarId, "ActionCode"))
            strcpy(TmpBuf, pPrinterData->ActionCode);
                else
          if (!stricmp(Var.VarId, "ApprovalCode"))
            strcpy(TmpBuf, pPrinterData->ApprovalCode);
                else

         if (!stricmp(Var.VarId, "ArticleName"))
            strcpy(TmpBuf, pPrinterData->ArticleName);
                else

         if (!stricmp(Var.VarId, "ArticleSerial"))
            strcpy(TmpBuf, pPrinterData->ArticleSerial);
                else

         if (!stricmp(Var.VarId, "ArticleADD_1"))
            strcpy(TmpBuf, pPrinterData->ArticleADD_1);
                else

         if (!stricmp(Var.VarId, "ArticleADD_2"))
            strcpy(TmpBuf, pPrinterData->ArticleADD_2);
                else

         if (!stricmp(Var.VarId, "Reconciliation"))
            strcpy(TmpBuf, pPrinterData->Reconciliation);
                else

         if (!stricmp(Var.VarId, "Name"))
            strcpy(TmpBuf, pPrinterData->Name);
                else

        if (!stricmp(Var.VarId, "Comment"))
            strcpy(TmpBuf, pPrinterData->Comment);


        int Len=strlen(TmpBuf);
        if(Var.VarLen==0)
        {
            strcpy(strOut,TmpBuf);
            return 0;
        }
        if(Len>Var.VarLen)
        {
            TmpBuf[Var.VarLen]=0;
            strcpy(strOut,TmpBuf);
            return 0;
        }

        //------------------ Visualisation ---------------------
        if (strlen(Var.VarMetodVisualisation)) {
            int len = strlen(Var.VarMetodVisualisation) >= Var.VarLen ? Var.VarLen: strlen(Var.VarMetodVisualisation);

            for (int i=0; i<len; i++)
            {
                if (Var.VarMetodVisualisation[i+1]=='X' || Var.VarMetodVisualisation[i+1]=='x')
                    TmpBuf[i]=Var.VarMetodVisualisation[i+1];
            }
        }
        //------------------------------------------------------

        if(!strcmp(Var.VarPlaceType,"right"))
        {
            int offset=Var.VarLen-Len;
            int Loop;
            for(Loop=0;Loop<offset;Loop++) strOut[Loop]=' ';
            strcpy(&strOut[offset],TmpBuf);
            return 0;
        }
          if(!strcmp(Var.VarPlaceType,"center"))
        {
            int offset=Var.VarLen / 2 - Len / 2;
            int Loop;
            for(Loop=0;Loop<offset;Loop++) strOut[Loop]=' ';
            strcpy(&strOut[offset],TmpBuf);
            return 0;
        }

        if(!strcmp(Var.VarPlaceType,"left"))
        {
            int Loop;
            strcpy(strOut,TmpBuf);
            for(Loop=Len;Loop<Var.VarLen;Loop++) strOut[Loop]=' ';
            strOut[Var.VarLen]=0;
            return 0;
        }


    }
}

int CPrinter::SeparateLine(char *strLine, char *PrintData)
{
    int Point=0;
    int PointWorld=0;
    if(strLine[Point]!=0)
    {
        while(strLine[Point]!='"') Point++;
        Point++;
        PrintData[PointWorld++]=strLine[Point++];
        while((strLine[Point]!='"')&&(strLine[Point]!=0))
        {
                PrintData[PointWorld++]=strLine[Point];
                Point++;
        }
        PrintData[PointWorld]=0;
        if(strLine[Point]==0) return 1;
        return 0;
    }
    return 1;
}

//----Заголовочный файл
Код

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct PRINTERDATA
{
        char Number[20];
        char PAN[20];
        char EXP[10];
        char RRN[20];
        char Date[10];
        char Time[10];
        char Summ[20];
        char Persent[20];
        char Amount[20];
        char AmountCurrency[20];
        char TerminalId[20];
        char MerchantId[20];
        char CardType[20];
        char ActionCode[20];
        char ApprovalCode[20];
        char Comment[0xFF];
        char ArticleName[40];
        char ArticleSerial[40];
        char ArticleADD_1[40];
        char ArticleADD_2[40];
        char Reconciliation[10];
        char Name[40];

        PRINTERDATA() {
                memset(this, 0, sizeof(PRINTERDATA));
        };
};


class CPrinter
{
public:
    struct Queue
    {
        void* Buf;
        Queue* NextComponent;
        Queue()        {
            Buf=NULL;
            NextComponent=NULL;
        }
    };

    struct ParamVar
    {
        char    VarName[16];
        char    VarId[100];
        char    VarType[16];
        int     VarLen;
        char    VarPlaceType[16];
        char    VarMetodVisualisation[128];
    };

public:
    int GetParamVar(char*TmpBuf,ParamVar& Var);
    int TranslateLine(char* strLine,char* OutData);
    int GetPrintData(char* FileName,PRINTERDATA& TerminalPrintData, char* OutData);
    CPrinter();
    virtual ~CPrinter();
protected:
    int SeparateLine(char* strLine,char* PrintData);
    int GetPrintParam(ParamVar& Var, char* strOut);
    Queue* pParamList;
    PRINTERDATA* pPrinterData;
    int AddParamVar(ParamVar& Var);
    int LoadPrintData(char* PrintData,char* OutData);
    int SeparateWorld(int NumberField,char*strLine,char*strWorld, short maxlen);
};




--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
SenkraD
Дата 6.2.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



Если никто не знает то может кто-то скинет ссылку на книгу по даной теме типа "Работа с внешними устройствами на С++" где под устройствами рзумеется: принтеры, мониторы, сканеры и т.д и т.п.
Пожалуйста!


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Artemon
Дата 8.2.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Я тебе открою маленький секрет - на твой топик никто не отвечает, потому что слишком много кода.

Вот если бы ты сам начал хоть что-нибудь делать и утебя что-нибудь не получилось, вот тогда тебе помоглибы.




--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
SenkraD
Дата 8.2.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



Вопрос снимается за ненужностью.(сам уже разобрался)
Но вцелом, спасибо за замечание.


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.