我爱builder

C++Builder 程序员博客

直接在程序中将一字符串赋值给TPanel的Caption属性,发现程序运行时还是原来的名字,不知道是什么原因,还是方法不对?

panel->Caption="abc";
这样就给Panel修改它的确Caption属性值,
楼主可能是多个Panel,或是显示的panel与设置Caption的panel不是同一个Panel

请确定设置Caption属性的Panel是当前眼睛看到的

哈哈,晕倒了Panel9->Caption == "XXXX";,拷贝时用了 "==",我说呢,太不小心了。谢谢二位。~

  • Filed under: C++ Builder
  • 一般的exe程序可以用枚举进程映像名称的方法来判断是否在运行,我现在遇到的问题是,我bat文件运行一个JAVA编写的程序,这时无论运行多少个程序,它的映像名称都是一样的(CMD.exe),请问我该用什么办法来判断把各个程序区别开呢?

    同一个程序的多个实例??按照什么来区分呢??进程ID??

    用CreateProcess运行程序, 根据返回的PID判断

    很多办法,比如每一个程序开始运行时创建不同ID的互斥体对象

    支持不惑

    如果java程序是自己编写的,就容易办了,如果不是自己写的,只有可执行文件,就应该考虑在运行期各程序有什么区别,征对其不同点判断,否则就算获取了进程PID,区分开了又有什么意义呢

    呵呵,你是在DOS的环境下运行,这却实是一个棘手的问题,嘻嘻~~如果这个JAVA程序是你写的,还可以通过共享内存来判断,如果不是还真不好处理…

  • Filed under: C++ Builder
  • 我在C++Builder6.0环境下开发程序,如果这个过程中不保存文件,程序能正常编译和运行,如果中间保存且换了个名字,程序就报错: 
      [Linker  Fatal  Error]Fatal:Expected  file  name 
    保存的时候另外用了一个路径,但是全是英文的。应该没有什么问题啊,可就是没办法运行了。不知道是咋回事,高手解释解释!

      估计是你的目录中存在同样的文件名,你保存在一个单独的文件夹肯定可以。

    就是,就连它默然的路径保存都一样不能使用了,唉…

    查看任务管理器,是不是有个同名进程在使用中,没有关闭

    我是用的一个单独的文件夹啊,郁闷惨了。搞了很久了。网上说那些也试了不少…

    拜托先回答,ExtractFilePath(Application->ExeName)之后是不是确定没有中文。
    以及任务管理器里有没有同名的EXE,比如PROJECT,EXE

    没有中文,没有同名。
    以前是很正常的。今天发现不行了。但是在安装文件夹的Projects文件夹里面已经生成了.exe应用程序,可以使用。
    保存后可以打开,就是不能运行

    神奇了,我开始开了三个项目,现在全部关闭。只开一个项目的时候就没有问题了。但是三个项目的名字是不一样的。现在好了。

    那是因为你编译某工程之后有同名的EXE到了任务管理器,因为某种故障中途退出,你没有关闭
    又或者,你以为你关闭了,但是任务管理器进程还在
    刚才建议你看任务管理器的,估计你没看。

    进程里面名字没有一样啊。不管怎么说,谢谢大家帮忙,yumikoo经常帮我哈。谢啦

  • Filed under: C++ Builder
  • 我用BCB用BDE做了一个简单的学生管理系统,
    但是在其他电脑却不能运行,
    就算把数据库文件放在同一个文件夹里也不行,
    请问还要添加什么文件吗?
    或者安装什么文件?
    怎样才能使这个程序在其他人的电脑运行啊?
    急啊!

    提示什么错误.是否是连接不到数据库?

    CB2009 下独立执行(生产环境)程序的设置。
    项目File列表 Build Configurations 选择 Release
    菜单 Project Options -> Packages -> Build with runtime packages (取消打勾)
    以上操作后,你的 EXE 文件将能够独立运行

    然后剩下的就是配置,比如你的BDE/SQL的连接字符串内容是否正确,建议把配置写在文件中,程序启动的时候临时读取,在网络环境改变的情况下可直接修改配置文件即可。

    楼上的正解,提示少什么文件就从电脑上拷什么过去

    bde做数据库不太好,最好那台机器上也安装bde数据库引擎.

    转移数据库程序需要相应的数据库引擎,以及要将自己的EXE进行“脱包”也就是类似3楼的做法。你可以理解为脱BCB编译环境的EXE。看看你的BCB版本后去Google下相应版本“脱包”的步骤

    C/C++ code
    // 除了release build外 // 还要打包BDE驱动程序。

    用了BDE 就要在客户端装上 BDE
    还要配置好BDE…

      客户机上装了sql?

    呵呵,这么人回答了我的问题.先谢谢各位!
    别人的电脑上装了SQL了,
    并且我选了RELEASE BUILD和取消PACKAGES的打勾,
    在别人的电脑运行时提示与WIN32有冲突,
    我不知道别人的电脑装了BDE没有,
    但装了SQL应该不用装BDE了吧?
    我实在是搞不清楚.
    三楼所说的把配置写在文件中,我试试看.

    再问一句,不用BDE,用ADO是不是不存载上述问题?
    因为实在是个新手菜鸟,所以不懂的太多了.

    “但装了SQL应该不用装BDE了吧? ”
    你用了BDE,
    如果别人电脑没有装cb
    就要单独安装BDE
    配置好数据库名\服务器名…

    好的,谢谢.我安装看看还有没有问题.

    谢谢各位终于行了!

  • Filed under: C++ Builder
  • 如何在BCB获取运行窗体的名称, 这个窗体是工程中的  但不知道是哪一个?
    项目中窗体太多, 想找到窗体的名字。

    找出所有已創建的Form
    for(int i = 0; i < Screen->FormCount; i++)
        ShowMessage(Screen->Forms[i]->Name);

    如果要單獨處理再加條件
    for(int i = 0; i < Screen->FormCount; i++)
    {
        String strName = Screen->Forms[i]->Name;
        if(strName = …)
        {
        ….
        }
    }

    运行中的窗体名称。。。。。。,你获取窗体名称的目的是什么?想要达到什么样的效果?
    自己写个函数,然后让每个窗体在显示的时候调用这个函数,把名称显示到某个你指定的地方。这是在你可以修改程序的情况下

    来迟了一楼二楼的都可以。一楼的需要知道窗口的标题。

  • Filed under: C++ Builder
  • 我现在有一个程序可以在pc上运行,但是如果把它放在u盘上,然后直接在u盘上运行,就会出现exception提示,这是怎么回事呢?请高手们指教!

    楼主的提问属于天书啊

    格式化U盘为Fat32格式然后重新拷贝程序

    格式化U盘为Fat32格式然后重新拷贝程序

    引用 2 楼 xabcxyz 的回复:
    楼主的提问属于天书啊
    ..

    是不是没有编译成release版本啊?

    没有打包吧!
    你在project->option里面把runtime还有use dynamatic RTL前面的钩也去掉。

  • Filed under: C++ Builder
  • void __fastcall TForm1::Button4Click(TObject *Sender)
    {
      bool IsNo=true;
      AnsiString str=Form1->Edit9->Text;
      for(int i=0;i <str.Length();i++)
      {
        if(str[i] <='9' && str[i]>='0')
          IsNo=true;
        else{
          IsNo=false;
          break; }
      }
      if(IsNo)
      {               
        Query2->Close();
        Query2->SQL->Clear();
        Query2->SQL->Add("SELECT * FROM TESTRECORD");
        Query2->SQL->Add("WHERE RECORDNO="+Form1->Edit9->Text);
        Query2->Open();
        if(StrToInt(Form1->Edit9->Text)==Query2->FieldByName("RECORDNO")->AsInteger)
        {
          ShowMessage("该记录编号已经存在");
          Form1->Edit9->SetFocus();
        }
        else
        {
      Table1->Last();
      Form1->Table1->Insert();
      Form1->Table1->FieldByName("RECORDNO")->AsInteger=StrToInt(Edit9->Text);//Query2->FieldByName("RECORDNO")->AsInteger+1;
    //*****************获取参数——————————————————
      Form1->Table1->FieldByName("WINDMACHINENO")->AsString="000";
      Form1->Table1->FieldByName("SPEED")->AsString="000";
      Form1->Table1->FieldByName("v")->AsString="000";
      Form1->Table1->FieldByName("I")->AsString="000";
      Form1->Table1->FieldByName("TESTDATE")->AsString=DateTimeToStr(Now());
      Form1->Table1->FieldByName("REMARK")->AsString="000";
      Table1->Post();
      Table1->Refresh();

      Table2->Last();
      int x=Table2->FieldByName("OPRATIONNO")->AsInteger;
      Form1->Table2->Insert();
      Form1->Table2->FieldByName("OPRATIONNO")->AsInteger=x+1;
    //*****************获取参数———————————————————
      Form1->Table2->FieldByName("DATETIME")->AsString=DateTimeToStr(Now());
      Form1->Table2->FieldByName("OPRATION")->AsString="新增加一项测试记录,记录编号是:"+Edit9->Text;
      // Form1->Table2->FieldByName("REMARK")->AsString="";
      Table2->Post();
      Table2->Refresh();
        }
      }
            else
            {
              ShowMessage("输入记录编号错误–非整数");
              Form1->Edit9->SetFocus();
            }                         
        Form1->Edit9->Clear();
        return;      }

    嗯,你可以捕捉这个异常的,然后给客户一个温馨的提示!

    我想你把这个放在Edit9KeyPress()事件里做判断会更好

    我想你把这个放在Edit9KeyPress()事件里做判断会更好

    如果我没判断错的楼,你的SQL语句写的有点问题,提示的是SQL出问题的吧?
    改成如下:

        Query2->Close();
        Query2->SQL->Clear();
        Query2->SQL->Add("SELECT * FROM TESTRECORD");
        Query2->SQL->Add("WHERE RECORDNO='"+Form1->Edit9->Text);
        Query2->SQL->Add("'");
        Query2->Open();

    楼主这样书写的SQL不是个太好的习惯,你最好是完全生成一个查询语句后,再用Query2->SQL->Add(),程序代码更清晰一些,效率会更高一些.

    我认为还是放在Edit9的Change事件中好,代码如下:

    void __fastcall TForm1::Edit9Change(TObject *Sender)
    {
    try{
        if(this->Edit9->Text.IsEmpty() )
          return;
        this->Edit9->Text.ToInt() ;
      }
    catch(…)
      {
        ShowMessage("输入错误!");
        return;
      }
    }

  • Filed under: C++ Builder
  • #include <stdexcept>
    #include <string>
    #include <limits.h>
    #include <iomanip>
    #include <cctype>

    using namespace std;
    using std::domain_error;
    using std::range_error;
    using std::string;
    namespace
    {
        inline int digit(char c,int base)
        {
            int value;
            switch(c)
            {
                case '0': value = 0; break;
                case '1': value = 1; break;
                case '2': value = 2; break;
                case '3': value = 3; break;
                case '4': value = 4; break;
                case '5': value = 5; break;
                case '6': value = 6; break;
                case '7': value = 7; break;
                case '8': value = 8; break;
                case '9': value = 9; break;
                case 'a': case 'A': value = 10; break;
                case 'b': case 'B': value = 11; break;
                case 'c': case 'C': value = 12; break;
                case 'd': case 'D': value = 13; break;
                case 'e': case 'E': value = 14; break;
                case 'f': case 'F': value = 15; break;
                default:
                    throw domain_error(string("invalid digit"));
            }
            if(value >= base)
                throw domain_error(string("invalid digit"));
            return value;
        }
        inline char next_char(char const *&p)
        {
            if(*p != '\\')
                return *p++;
            else
            {
                int char_value = digit(p[1], 8)*64
                                +digit(p[2], 8)*8
                                +digit(p[3], 8);
                if(char_value > std::numeric_limits <char>::max() && char_value < std::numeric_limits <char>::min())
                    throw domain_error(stirng("not a char"));
                p += 4;
                return char_value;
            }
        }
        void load_first_digit(char const *&s, int &value,
                                bool &is_negative, int &base)
        {
            char cl = next_char(s);
            is_negative = cl == '-';
            if(cl == '-' || cl == '+')
                cl == next_char(s);
            if(cl == '\0')
            {
                throw domain_error(string("incakid input"));
            }
            else if(cl != '0')
            {
                base = 10;
            }
            else
            {
                char const *p = s;
                char c2 = next_char(p);
                if(c2 == 'x' || c2 == 'X')
                {
                    base = 16;
                    s = p;
                    cl = next_char(s);
                }
                else
                {
                    base = 8;
                }
            }
            value = digit(cl,base);
        }
    }
    int atoi(char const *s){
        int value, base;
        bool is_negative;
        load_first_digit(s, value, is_negative, base);
        while(char c = next_char(s)){
            if(value > std::numeric_limits <int>::max()/base)
                throw range_error(string("out-of-range"));
            value *= base;
            int d = digit(c, base);
            if(value > std::numberic_limits <int>::max()-d)
                throw range_error(string("out-of-range"));
                value += d;
            }
      }
      return is_negative? -value: value;
    }
    运行时系统错误提示信息为:
    [error] '::numberic_limits'undeclared(first use here)
    [error] parse error before '>'
    [error] confused by earlier error, bailing out

    请大虾指点~~~~!

    std::numeric_limits <char>::max() 这段方法应该是包含在 <limits.h>头文件中的,表示char类型的最大值。不知道运行起来怎么会抱错的,很奇怪,请大虾指点~~~~!

    isdigit
    isalnum

    这两个已经够你用了.

    标准字符串中关于这个std::numberic_limits  等我不怎么用的.

    有点长,LZ还是用跟踪调试的方式吧

    头文件中的函数报错,就是你的调用方法不对拉

  • Filed under: C++ Builder

  • 以前用2007从没出现过

    检查下程序,是所有程序都是这个错误么?
    有可能是:
    引用了已经删除的对象; 删除了已经删除的对象;访问了尚未创建的对象;

    到Projiect->Options里面看看相关的设置
    还有就是 Tools 下面有个 Configure Tools 你去看看~~

    xue xi

  • Filed under: C++ Builder
  • 我程序里用到了VC里的MSCOMM控件,suiPack界面,ADO数据库操作,数据库用的是ACCESS,打包后,将软件安装到别人电脑上运行软件就提示“无注册类别”,MSCOMM的注册信息已经写入了注册表,请问还有哪些信息需要写入注册表呀?或者还是因为其他的原因?急呀。。。。。。。。。。。。。。。。。。。。。

    无注册类别一般都是ocx控件造成的

    问题早解决了,忘了来结贴了。
    的确是因为OCX控件引起的,虽然我注册表了写了键值进去了,但是有些电脑上还需要用regsvr32.exe注册一下。

  • Filed under: C++ Builder