我爱builder

C++Builder 程序员博客

Archive for 03月, 2009

定义了一个函数,用于检索数据,其中一个参数是TADOQuery类型的,
如下
void QuerySQL(TADOQuery *ADOQuery, String Str);
明明在别的机子上该函数可以编译通过,但是我添加这个函数后
却编译时产生错误:

[C++ Error] UnitPublic.h(256): E2147 'TADOQuery' cannot start a parameter declaration
这是什么原因啊,差了半天也没有查出来

没有ado添加这个控件吧

有的啊,我从组件面板里拉到Form里的
难道还要像VC那样先包含ADO15这个DLL??

问题解决,原来是没有在头文件中包含ADO组件的头文件
只要在头文件中
"#include <ADODB.hpp>"即可。

  • Filed under: C++ Builder
  •   Variant ex,wb,sheet,range;
    try
    {
      ex=CreateOleObject("Excel.Application");//创建应用对象
    }
    catch(…)
    {
      MessageBox(0, "启动Excel出错,可能是没有安装Excel","DBGrid2Excel",MB_OK | MB_ICONERROR);
      return;
    }
    ex.OlePropertySet("Visible",true);//显示excel
    ex.OlePropertyGet("Workbooks").OleProcedure("Add"); // 工作表
    wb=ex.OlePropertyGet("ActiveWorkBook");//创建工作簿对象
    sheet=wb.OlePropertyGet("ActiveSheet");

    问题1:现在已经有sheet1,sheet2,sheet3,怎样添加sheet4,5….
    问题2:wb.OleFunction("SaveAs","优化前的电压");与sheet.OleFunction("SaveAs","优化前的电压");
          怎么效果一样啊都是给excel文档命名,怎么把sheet1,2,3重命名啊
    问题3:ex.OlePropertyGet("workbooks").OleFunction("Add","E:\\result.xls");替换上面的
    ex.OlePropertyGet("Workbooks").OleProcedure("Add");运行到此处时发生错误"发生意外"

    这些对各位BCB精英都是小儿科,可我解决不了啊太菜了,明天该交差了很急啊……..

    非常感谢啊!2、sheet重命名没问题。
    但是1、
    ex.OlePropertySet("Visible",true);
    ex.OlePropertyGet("Workbooks").OleProcedure("Add");
    wb=ex.OlePropertyGet("ActiveWorkBook");
    sheet=wb.OlePropertyGet("ActiveSheet");
    wb.OlePropertyGet("Sheets").OleFunction("Add", "Sheet4");//运行到此处提示"发生意外";
    又不知道怎么办了。。。。

    Variant  ex,wb,sh1; 
      AnsiString  p_name; 
      p_name="d:\\h.xls"; 
      ex=CreateOleObject("Excel.Application"); 
      ex.OlePropertyGet("WorkBooks").OleProcedure("open",p_name.c_str()); 
      ex.OlePropertySet("Visible",(Variant)true); 
      wb=ex.OlePropertyGet("ActiveWorkBook"); 
      wb.OlePropertyGet("worksheets").OleFunction("Add");      //增加工作表

    ok
    增加工作表没问题了,谢谢thwen//
    不过打开已存在excel或在指定路径下创建excel仍有问题
    1、假如E:\优化结果.xls已存在
    Variant  ex,wb,sh1; 
      AnsiString  p_name; 
      p_name="d:\\优化结果.xls"; 
      ex=CreateOleObject("Excel.Application"); 
      ex.OlePropertyGet("WorkBooks").OleProcedure("Open",p_name.c_str());//在这仍然"发生意外"
    2、假如"优化结果.xls"不存,在E盘新建优化结果.xls
    AnsiString  p_name; 
      p_name="d:\\优化结果.xls"; 
      ex=CreateOleObject("Excel.Application"); 
      ex.OlePropertyGet("WorkBooks").OleProcedure("Add",p_name.c_str());//在这仍然"发生意外"

    mark

    ole非常不好用啊

    AnsiString p_name="d:\\\\优化结果.xls";

    if(!FileExists(p_name))
    {
    Application->MessageBox("报表模板文件不存在,无法打开!",
    "错误",MB_ICONSTOP|MB_OK);
    return;
    }
    //file://建立Excel的Ole对象Ex
    try
    {
    Ex = Variant::CreateObject("Excel.Application");
    }
    catch(…)
    {
    Application->MessageBox("无法启动Excel","错误",MB_ICONSTOP|MB_OK);
    return;
    }
    //file://设置Excel为不可见
    Ex.OlePropertySet("Visible",true);
    //file://打开指定的Excel报表文件。报表文件中最好设定只有一个Sheet。
    Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",p_name.c_str());
    Wb = Ex.OlePropertyGet("ActiveWorkBook");
    Sheet = Wb.OlePropertyGet("ActiveSheet");//获得当前默认的Sheet

    细心一点!!!!!!!!!!!!!!!!!!!

    不容易啊,刚学BCB,还得努力啊!!!

  • Filed under: C++ Builder
  • EVC下宽字符的宏连接问题 

    PC:下如此定义可以实行
    #define  FILE_NAME(name)  "D:/file_name/"#name
    #define  FILE_1          FILE_NAME("file1.bin")

    ARM下如此定义不能实行
    #define  FILE_NAME(name)  _T("D:/file_name/"#name)
    #define  FILE_1          FILE_NAME("file1.bin")

    请问EVC下宽字符的连接该如何定义 

  • Filed under: C++ Builder
  • 现在我本来有个类,不带窗体的,现在需要在网页上调用,要做成activex的,不知道如何写?网上的资料好像也很少,做过的朋友帮个忙

    我随便生成了一个vcl组件,显示在了sample上,但是,我想把这个vcl组件变成activex控件,在可以选择的vcl组件列表里面没有显示,这是怎么回事情呢/

    建一个ActiveX工程,生成后,regsvr32 注册控件

    http://topic.csdn.net/t/20030102/13/1320208.html

    学习

    学习.

    楼上的朋友说的都好简单,我通过这几天的摸索,基本上搞清楚了

    1.建立activeform
    2.通过type library editor新增接口,注意,接口的返回值只能是hresult,真正函数的返回要放在参数中,并且,一定要用指针
    3.发布,注册,ok

  • Filed under: C++ Builder
  • 最近想做个打印服务程序,大家帮忙看下下面的设想是否可行:
    当某台网络打印机出现故障时(判断网络打印机状态似乎比较困难..因为好多厂家都没有对应ping的返回信息,所以我打算通过服务器积压的打印任务获取对应的打印机IP地址,这个不知道有没有API能够获取…),如果能获取故障打印机的IP,那么我就修改该打印机的注册表信息,将它的一部分替换成事先设置好的备用打印机注册信息(这里有个难点.不知道有没有办法让注册表信息发生改变后直接生效,而不用重启系统;还有最重要的就是如果能直接生效,那些积压的打印任务能不能因此而转发给备用打印机呢)

    ….自己顶下..

  • Filed under: C++ Builder
  • WINDOWS我做一个与爱普生并口打印机的通信,打印号票,找不到好办法希望你能帮我解决一下。
    1.我查了一些资料说WINIO类。看了一下,SETPORTVAL GETPORTVAL 发现是对硬件直接操作,什么高底电这样,不知道发一个字符串过去怎么调用这两个函数,引脚高底位的流程。然后取打印机状态。
    2.还有就是用CRETEFILE 可以发送数据,但是用READFILE取打印机缺纸时就阻塞没有数据返回。
    有没有直接操作并口打印机的方法??我想直接发打印数据过去(例如一个函数SENDDATE()),不操作并口25个针。因为我对这个不太熟习。
    如果大家有什么类最好啦。

    是并口打印机。

    谢谢大家 邮箱wapjia@yahoo.com.cn

    发错,上面是usb的了,这里是头文件
    #ifndef _PRNPORT_H_VICTORCHEN_
    #define _PRNPORT_H_VICTORCHEN_
    /*————————————————————————-*\
    |                        直接控制打印口(并行口)                            |
    |                        Copyright (C) Victor Chen                          |
    |                    Homepage: http://www.cppfans.com/                      |
    \*————————————————————————-*/
    #include <vcl.h>
    //—————————————————————————
    extern unsigned char  (*inportb)(unsigned short);
    extern unsigned short (*inportw)(unsigned short);
    extern unsigned long  (*inportd)(unsigned short);
    extern void (*outportb)(unsigned short, unsigned char );
    extern void (*outportw)(unsigned short, unsigned short);
    extern void (*outportd)(unsigned short, unsigned long );
    //—————————————————————————
    class TWinIo
    {
    public:
      __property bool IsValid = { read = fGetValid };

      bool  (_stdcall *InitializeWinIo)();
      void  (_stdcall *ShutdownWinIo)();
      PBYTE (_stdcall *MapPhysToLin)(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE *pPhysicalMemoryHandle);
      bool  (_stdcall *UnmapPhysicalMemory)(HANDLE PhysicalMemoryHandle, PBYTE pbLinAddr);
      bool  (_stdcall *GetPhysLong)(PBYTE pbPhysAddr, PDWORD pdwPhysVal);
      bool  (_stdcall *SetPhysLong)(PBYTE pbPhysAddr, DWORD dwPhysVal);
      bool  (_stdcall *GetPortVal)(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
      bool  (_stdcall *SetPortVal)(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
      bool  (_stdcall *InstallWinIoDriver)(PSTR pszWinIoDriverPath, bool IsDemandLoaded = false);
      bool  (_stdcall *RemoveWinIoDriver)();

      bool LoadWinIo(char *lpFileName);
      void FreeWinIo(void);

      TWinIo(char *lpFileName);
      ~TWinIo();
    private:
      bool _bInitialized;
      HINSTANCE hWinIo;
      void InitPortFuncs(void);
      bool fGetValid(void) {return hWinIo!=NULL;}
    };

    //—————————————————————————
    // Parallel port class definition
    //—————————————————————————
    /*
    打印口各引脚的定义:
    1.选通, PC->Printer
    2-9.数据(D0-D7)
    10.应答(ACK),Printer->PC
    11.忙(BUSY), Printer->PC
    12.无纸(PE), Printer->PC
    13.联机(SLCT), Printer->PC
    14.自动换行(AUTO FD), PC->Printer
    15.错误(ERROR), Printer->PC
    16.初始化(INIT),PC->Printer
    17.选择输出(SELECT IN), PC->Printer
    18-25.地(GND)
    */
    class TParallelPort
    {
    public:
      int Send(unsigned char data) ;
      //参数与标准 C 的 printf 相同, 返回值为错误码, 这个函数是从打印机输出数据
      int printf(const char *format,…);
      //参数与标准 C 的 vprintf 相同, 这个函数是从打印机输出数据
      int vprintf(const char* format, va_list paramList);
      //初始化打印机, 两个参数分别是初始化时间和初始化之后的延时(ms)
      void InitPrinter(int iInitDelay=5000, int iInitWait=1000);

      //并行口的数据 D0-D7, 可读写
      __property unsigned char  Data = { read=fGetData , write=fSetData };
      //并行口的状态, 包括 ~BUSY, ACK, PE, ONLINE, ~ERROR 等, 这个属性是只读的
      __property unsigned char  Flag = { read=fGetFlag , write=fSetFlag };
      //并行口的状态, 包括 ~INIT, AUTOFD, STORE 等, 这些属性是可写的。
      __property unsigned char  Ctrl = { read=fGetCtrl , write=fSetCtrl };
      //并行口的开始地址, 默认值为 0×378
      __property unsigned short Base = { read=_DataPort, write=fSetPort };

      enum TPrnError
      {
        peNoError    =  0,
        peNotOnLine  = -1,
        peOutOfPaper = -2,
        pePrinterErr = -3,
      };

      enum TPrnFlags
      {
        pfIdle    = 0×80, //F7 = ~BUSY    1: idle        0 : busy
        pfAck    = 0×40, //F6 = ACK      1: ack          0 : no ack
        pfPE      = 0×20, //F5 = PE        1: paper out    0 : paper in
        pfOnLine  = 0×10, //F4 = ONLINE    1: select in    0 : not select
        pfNoError = 0×08, //F3 = ~ERROR    1: no error    0 : error
      };

      enum TPrnCtrls
      {
        pcIRQE  = 0×10, //C4
        pcSelect = 0×08, //C3
        pcFInit  = 0×04, //C2 = ~INIT
        pcAutoFD = 0×02, //C1
        pcStore  = 0×01, //C0 = STORE
      };
      //这个属性是控制打印的, 默认为 false, 如果这个属性为 true, 打印不会抛出异常, 而是返回错误码
      __property bool NoException = { read = _bNoException, write = _bNoException };
      //产生错误时会触发这个事件, 默认的处理是询问是否重试
      __property bool __fastcall (__closure *OnMakeSure)(TPrnError ErrCode) = { read = _lpMakeSure, write = _lpMakeSure };

      int PrintString(char *lpLine);
      TParallelPort(unsigned short p=0×378);
      unsigned char ReadStatus() ;

    private:
      inline unsigned char fGetData(void)
      {
        return inportb(_DataPort  );
      }

      inline unsigned char fGetFlag(void)
      {
        return inportb(_StatusPort);
      }

      inline unsigned char fGetCtrl(void)
      {
      return inportb(_CtrlPort  );
      }

      inline void fSetData(unsigned char d)
      {
        outportb(_DataPort  , d);
      }

      inline void fSetFlag(unsigned char d)
      {
        outportb(_StatusPort, d);
      }

      inline void fSetCtrl(unsigned char d)
      {
        outportb(_CtrlPort  , d);
      }

      void fSetPort(unsigned short p);
      unsigned short _DataPort, _StatusPort, _CtrlPort;

      bool _bNoException;
      bool _fMakeSure(TPrnError ErrCode);
      bool __fastcall (__closure *_lpMakeSure)(TPrnError ErrCode); //return retry;
    };

    //—————————————————————————
    extern TWinIo WinIo;
    extern TParallelPort ParallelPort;
    //—————————————————————————
    #endif

    这里是实现部分
    /*————————————————————————-*\
    |                        直接控制打印口(并行口)                            |
    |                        Copyright (C) Victor Chen                          |
    |                    Homepage: http://www.cppfans.com/                      |
    \*————————————————————————-*/
    #include "PrnPort.h"
    #include <vcl.h>
    //—————————————————————————
    TWinIo WinIo("WinIo.dll");
    TParallelPort ParallelPort; 
    //—————————————————————————
    unsigned char  inportbNT(unsigned short p) { unsigned long v = 0; WinIo.GetPortVal(p, &v, 1); return v; }//{ asm mov dx, p; asm in al, dx; return _AL; }
    unsigned short inportwNT(unsigned short p) { asm mov dx, p; asm in ax, dx; return _AX; }
    unsigned long  inportdNT(unsigned short p) { asm mov dx, p; asm in eax,dx; return _EAX;}
    void outportbNT(unsigned short p, unsigned char  v) { asm mov dx, p; asm mov al, v; asm out dx,al; }
    void outportwNT(unsigned short p, unsigned short v) { asm mov dx, p; asm mov ax, v; asm out dx,ax; }
    void outportdNT(unsigned short p, unsigned long  v) { asm mov dx, p; asm mov eax,v; asm out dx,eax;}
    //—————————————————————————
    unsigned char  inportb9x(unsigned short p) { unsigned long v = 0; WinIo.GetPortVal(p, &v, 1); return v; }
    unsigned short inportw9x(unsigned short p) { unsigned long v = 0; WinIo.GetPortVal(p, &v, 2); return v; }
    unsigned long  inportd9x(unsigned short p) { unsigned long v = 0; WinIo.GetPortVal(p, &v, 4); return v; }
    void outportb9x(unsigned short p, unsigned char  v) { WinIo.SetPortVal(p,v,1); }
    void outportw9x(unsigned short p, unsigned short v) { WinIo.SetPortVal(p,v,2); }
    void outportd9x(unsigned short p, unsigned long  v) { WinIo.SetPortVal(p,v,4); }
    //—————————————————————————
    unsigned char  (*inportb)(unsigned short) = inportbNT;
    unsigned short (*inportw)(unsigned short) = inportwNT;
    unsigned long  (*inportd)(unsigned short) = inportdNT;
    void (*outportb)(unsigned short, unsigned char ) = outportbNT;
    void (*outportw)(unsigned short, unsigned short) = outportwNT;
    void (*outportd)(unsigned short, unsigned long ) = outportdNT;
    //—————————————————————————
    /////////////////////////////////////////////////////////////////////////////
    //—————————————————————————
    TWinIo::TWinIo(char *lpFileName)
    {
      hWinIo = NULL;
      _bInitialized = false;
      LoadWinIo(lpFileName);
    }
    //—————————————————————————
    TWinIo::~TWinIo()
    {
      FreeWinIo();
    }
    //—————————————————————————
    bool TWinIo::LoadWinIo(char *lpFileName)
    {
      if(!hWinIo)
      {
        if((hWinIo=LoadLibrary(lpFileName))!=NULL)
          {
            bool bOK = true;
            if(((FARPROC)InitializeWinIo    = GetProcAddress(hWinIo, "InitializeWinIo"    ))==NULL)bOK=false;
            if(((FARPROC)ShutdownWinIo      = GetProcAddress(hWinIo, "ShutdownWinIo"      ))==NULL)bOK=false;
            if(((FARPROC)MapPhysToLin        = GetProcAddress(hWinIo, "MapPhysToLin"      ))==NULL)bOK=false;
            if(((FARPROC)UnmapPhysicalMemory = GetProcAddress(hWinIo, "UnmapPhysicalMemory"))==NULL)bOK=false;
            if(((FARPROC)GetPhysLong        = GetProcAddress(hWinIo, "GetPhysLong"        ))==NULL)bOK=false;
            if(((FARPROC)SetPhysLong        = GetProcAddress(hWinIo, "SetPhysLong"        ))==NULL)bOK=false;
            if(((FARPROC)GetPortVal          = GetProcAddress(hWinIo, "GetPortVal"        ))==NULL)bOK=false;
            if(((FARPROC)SetPortVal          = GetProcAddress(hWinIo, "SetPortVal"        ))==NULL)bOK=false;
            if(((FARPROC)InstallWinIoDriver  = GetProcAddress(hWinIo, "InstallWinIoDriver" ))==NULL)bOK=false;
            if(((FARPROC)RemoveWinIoDriver  = GetProcAddress(hWinIo, "RemoveWinIoDriver"  ))==NULL)bOK=false;

            if(bOK)
            {
              _bInitialized = InitializeWinIo();
              if(!_bInitialized)
                bOK = false;
            }
            if(!bOK)FreeWinIo();
          }
      }
      InitPortFuncs();
      return IsValid;
    }
    //—————————————————————————
    void TWinIo::FreeWinIo(void)
    {
      if(hWinIo)
      {
        if(_bInitialized)
          {
            ShutdownWinIo();
            _bInitialized = false;
          }
        FreeLibrary(hWinIo);
        hWinIo = NULL;
      }
    }
    //—————————————————————————
    void TWinIo::InitPortFuncs(void)
    {
      OSVERSIONINFO osVer = {sizeof(OSVERSIONINFO)};
      GetVersionEx(&osVer);

      if((osVer.dwPlatformId == VER_PLATFORM_WIN32_NT)||(!IsValid))
      {
        inportb = inportbNT; outportb = outportbNT;
        inportw = inportwNT; outportw = outportwNT;
        inportd = inportdNT; outportd = outportdNT;
      }
      else
      {
        inportb = inportb9x; outportb = outportb9x;
        inportw = inportw9x; outportw = outportw9x;
        inportd = inportd9x; outportd = outportd9x;
      }
    }
    //***************************************************************************
    //————————————————————————–*
    // Parallel port class definition                                          *
    //————————————————————————–*
    //***************************************************************************
    TParallelPort::TParallelPort(unsigned short p)
    {
      fSetPort(p);
      _lpMakeSure = NULL;
      _bNoException = false;
    };
    //—————————————————————————
    void TParallelPort::fSetPort(unsigned short p)
    {
      _DataPort  = p;      //dedault : 0×378
      _StatusPort = p+1;    //dedault : 0×379
      _CtrlPort  = p+2;    //dedault : 0×37a
    }
    //—————————————————————————
    bool TParallelPort::_fMakeSure(TPrnError ErrCode)
    {
      if(_lpMakeSure)
      {
        return _lpMakeSure(ErrCode);
      }
      else
      {
        AnsiString s;
        switch(ErrCode)
          {
            case peOutOfPaper: s="打印机缺纸!"; break;
            case peNotOnLine : s="打印机脱机!"; break;
            default          : s="打印机出错!"; break;
          }
        bool bRetry =
        Application->MessageBox(L"s.c_str()",L"打印机错误",
        MB_RETRYCANCEL|MB_ICONEXCLAMATION) == IDRETRY;
        if ( (!bRetry) && (!_bNoException) )
        {
            //throw Exception(s);
        }
        return bRetry;
      }
    }
    //—————————————————————————
    int TParallelPort::printf(const char *format,…)
    {
      int rc;
      va_list paramList;
      va_start(paramList, format);
      rc = vprintf(format, paramList);
      va_end(paramList);
      return rc;
    }
    //—————————————————————————
    int TParallelPort::vprintf(const char* format, va_list paramList)
    {
      AnsiString s;
      s.vprintf(format,paramList);
      return PrintString(s.c_str());
    }
    //—————————————————————————
    void TParallelPort::InitPrinter(int iInitDelay, int iInitWait)
    {
      Ctrl &= ~pcFInit;
      Sleep(iInitDelay);
      Ctrl |= pcFInit;
      Sleep(iInitWait);
    }

    非常感谢你,我去试一下。。

    我想问一下,我是XP BCB5
    直接拿过去可以用不。。
    asm mov dx不会有权限问题吧。。能加你QQ不我的43106140

    感谢分享,顶一个.

    解决啦非常好,网站不错,谢谢

  • Filed under: C++ Builder
  • 在CSDN上下载了ehlib42 for bcb2009,但不知道如何安装,请高手指点.不胜感激.

    在编译DclEhLibB2009.cbproj时,提示需要EhLibB2006.lib,EhLib4.3.21中没有这个文件,我选择了EhLib120.lib,编译到最近,提示[ILINK32 Error]Fatal:Unable to open file 'EHLIBB2009.BPI',再在菜单中用Component->Install Package时,找不到对应的bpl文件.请有安装成功的朋友,给出详细的安装说明,谢谢

    重下一个试试

    已经安装成功了,如果有遇到同样问题的朋友,可以联系我jerry_soft@126.com

    楼上的,能告诉我吗:qq:42872272

    楼上的,能告诉我吗:qq:42872272

    我安装成功 已经加你QQ…

    楼主能把方法说一下吗,先谢谢了

    长时间没有上网了,还是把安装方法贴出来了,
    下载EhLib后,解压放任一目录下,我一般是放在安装中,
    1. Open project…,打开EhLibB2009.cbproj文件后,从菜单Project->Build all project,完成后, Close all.

    2. Open project…,打开DclEhLibB2009.cbproj文件,同样Build all project,这时它会提示要选择EhLibB2006的文件(具体名称不记得了),这时可以到安装目录:D:\Software\Borland\BCB2009\RAD Studio\6.0\BPL,将里面的文件全部copy到EhLib目录中,应该就会有了(如果没有那么就会去另一个路径中:D:\Software\Borland\BCB2009\RAD Studio\6.0\Projects\Bpl,将下面的文件都copy到EhLib文件夹下,这二个文件路径下的文件都要copy后EhLib目录中,后面会用到),选择好,再勾选下面一个选择框,完成后,Close all~~

    3. 从菜单中Component->Install Packages, Add..在EhLib目录中选择DclEhLibB2009.bpl

    至此安装完成收工~~

    总结得不错啊!!!

  • Filed under: C++ Builder
  • 用BCB6开发一个ActiveForm控件,里面用了几个TESimageFM控件按钮,deploy以后,在发布的网页上按钮是死的,无法点击
    这是什么原因啊,请教大家如何进行ActiveX开发

    有没有人知道,这两天怎么就没人呢

    创建的时候是不是需要消息支持?

    对那个ESimageFM控件也不熟悉,如果添加消息支持的话?
    你的意思是我要自己实现图片的切换??

    也不熟悉,帮顶

    谢谢楼上,自己再顶,

    使这个问题太简单么?大家不想回答啊?

    不懂,up

    不懂,up

    问题没解决,各位帮顶有分,谢谢

  • Filed under: C++ Builder
  • 例如:有一个文本文件,App.txt,其文本内容如下:
    1 1号电容器            9090    0  1  10000   
    2 1号主变              2032    0  1  -10000
    3 2号电容器最大电压    3070    0  1  10000

    如上所述3行的一个文本文件,CB5如何读取每行的值(去掉空格)?

    C/C++ code
    TStringList* app = new TStringList(); TStringList* fields = new TStringList(); try { app->LoadFromFile("App.txt"); for (int i = 0; i < app->Count; ++i) { fields->CommaText = app->Strings[i]; //todo: fields->Strings[0..n] } } __finally { delete app; delete fields; }

    非常感谢上面两位高手的指点,已经解决了,特别感谢shadowstar,代码简单易用!

  • Filed under: C++ Builder
  • 比如说在execute函数里new 的query也是在这里open的,当然,可以在处理完数据库操作,完美的close掉,甚至是delete掉它。
    可是,当程序直接close,该怎样close数据库呢?还有线程, 需要delete吗?貌似直接delete一个没有执行的线程,会卡死,如同newThread->waitfor(),它是等待线程结束后才返回。

    引用 1 楼 songhtao 的回复:
    在OnTerminate;事件集中处理线程中断后的处理。

    可是线程类不像form类,用f11切出事件处理模板呀,这个要怎么写?

    引用 1 楼 songhtao 的回复:
    在OnTerminate;事件集中处理线程中断后的处理。

    再说了,query是execute函数里申明的,是个局部变量,onterminate里不认识它呀!!!!!!!!!!!!!!!!!

    高手帮我分析一下吧,
    我有个form2是available,用的时候自己new
    new,以及showmodal的时候,用try捕获了,
    但好像在showmodal之后,delete form2的时候,内在出错,只报地址volation什么的,也没具体说是什么,

    我只知道,我在form2里new了一个全局线程,这个线程处理数据库,当处理完的时候freeonterminated,自动释放,好像确实是处理完之后,关form2没事,
    但在处理中,关掉form2内存出错,但是,又有另一种情况,就是在form2的onclose事件中,加个message,就是在关的时候,等待一下下,也不会内存报错,
    而且,这个线程会继续执行下去,直到数据库处理完毕,这可以理解,因为该线程是个全局线程。当然不会随form2的释放而释放。

    可为什么会内存出错呢?

    _fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        QuerysCount = 0;
    }
    //—————————————————————————

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        TQuery *qry = new TQuery(this);
        Querys[QuerysCount++] = (long)(void*)qry;
        qry->DatabaseName = "BCDEMOS";
        qry->SQL->Text = "select * from animals";
        this->DataSource1->DataSet = qry;
        qry->Open();
    }
    //—————————————————————————

    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
        for(int i=QuerysCount; i>0; i–)
        {
            TQuery* qry = (TQuery*)(void*)Querys[QuerysCount-1];
            qry->Close();
        }
    }

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档