C++Builder 程序员博客
26 Dec
直接在程序中将一字符串赋值给TPanel的Caption属性,发现程序运行时还是原来的名字,不知道是什么原因,还是方法不对?
panel->Caption="abc";
这样就给Panel修改它的确Caption属性值,
楼主可能是多个Panel,或是显示的panel与设置Caption的panel不是同一个Panel
请确定设置Caption属性的Panel是当前眼睛看到的
哈哈,晕倒了Panel9->Caption == "XXXX";,拷贝时用了 "==",我说呢,太不小心了。谢谢二位。~
25 Dec
一般的exe程序可以用枚举进程映像名称的方法来判断是否在运行,我现在遇到的问题是,我bat文件运行一个JAVA编写的程序,这时无论运行多少个程序,它的映像名称都是一样的(CMD.exe),请问我该用什么办法来判断把各个程序区别开呢?
同一个程序的多个实例??按照什么来区分呢??进程ID??
用CreateProcess运行程序, 根据返回的PID判断
很多办法,比如每一个程序开始运行时创建不同ID的互斥体对象
支持不惑
如果java程序是自己编写的,就容易办了,如果不是自己写的,只有可执行文件,就应该考虑在运行期各程序有什么区别,征对其不同点判断,否则就算获取了进程PID,区分开了又有什么意义呢
呵呵,你是在DOS的环境下运行,这却实是一个棘手的问题,嘻嘻~~如果这个JAVA程序是你写的,还可以通过共享内存来判断,如果不是还真不好处理…
2 Dec
我在C++Builder6.0环境下开发程序,如果这个过程中不保存文件,程序能正常编译和运行,如果中间保存且换了个名字,程序就报错:
[Linker Fatal Error]Fatal:Expected file name
保存的时候另外用了一个路径,但是全是英文的。应该没有什么问题啊,可就是没办法运行了。不知道是咋回事,高手解释解释!
估计是你的目录中存在同样的文件名,你保存在一个单独的文件夹肯定可以。
就是,就连它默然的路径保存都一样不能使用了,唉…
查看任务管理器,是不是有个同名进程在使用中,没有关闭
我是用的一个单独的文件夹啊,郁闷惨了。搞了很久了。网上说那些也试了不少…
拜托先回答,ExtractFilePath(Application->ExeName)之后是不是确定没有中文。
以及任务管理器里有没有同名的EXE,比如PROJECT,EXE
没有中文,没有同名。
以前是很正常的。今天发现不行了。但是在安装文件夹的Projects文件夹里面已经生成了.exe应用程序,可以使用。
保存后可以打开,就是不能运行
神奇了,我开始开了三个项目,现在全部关闭。只开一个项目的时候就没有问题了。但是三个项目的名字是不一样的。现在好了。
那是因为你编译某工程之后有同名的EXE到了任务管理器,因为某种故障中途退出,你没有关闭
又或者,你以为你关闭了,但是任务管理器进程还在
刚才建议你看任务管理器的,估计你没看。
进程里面名字没有一样啊。不管怎么说,谢谢大家帮忙,yumikoo经常帮我哈。谢啦
25 Nov
我用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下相应版本“脱包”的步骤
// 除了release build外 // 还要打包BDE驱动程序。
用了BDE 就要在客户端装上 BDE
还要配置好BDE…
客户机上装了sql?
呵呵,这么人回答了我的问题.先谢谢各位!
别人的电脑上装了SQL了,
并且我选了RELEASE BUILD和取消PACKAGES的打勾,
在别人的电脑运行时提示与WIN32有冲突,
我不知道别人的电脑装了BDE没有,
但装了SQL应该不用装BDE了吧?
我实在是搞不清楚.
三楼所说的把配置写在文件中,我试试看.
再问一句,不用BDE,用ADO是不是不存载上述问题?
因为实在是个新手菜鸟,所以不懂的太多了.
“但装了SQL应该不用装BDE了吧? ”
你用了BDE,
如果别人电脑没有装cb
就要单独安装BDE
配置好数据库名\服务器名…
好的,谢谢.我安装看看还有没有问题.
谢谢各位终于行了!
10 Nov
如何在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 = …)
{
….
}
}
运行中的窗体名称。。。。。。,你获取窗体名称的目的是什么?想要达到什么样的效果?
自己写个函数,然后让每个窗体在显示的时候调用这个函数,把名称显示到某个你指定的地方。这是在你可以修改程序的情况下
来迟了一楼二楼的都可以。一楼的需要知道窗口的标题。
9 Nov
我现在有一个程序可以在pc上运行,但是如果把它放在u盘上,然后直接在u盘上运行,就会出现exception提示,这是怎么回事呢?请高手们指教!
楼主的提问属于天书啊
格式化U盘为Fat32格式然后重新拷贝程序
格式化U盘为Fat32格式然后重新拷贝程序
..是不是没有编译成release版本啊?
没有打包吧!
你在project->option里面把runtime还有use dynamatic RTL前面的钩也去掉。
8 Nov
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;
}
}
4 Nov
#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还是用跟踪调试的方式吧
头文件中的函数报错,就是你的调用方法不对拉
24 Oct
以前用2007从没出现过
检查下程序,是所有程序都是这个错误么?
有可能是:
引用了已经删除的对象; 删除了已经删除的对象;访问了尚未创建的对象;
到Projiect->Options里面看看相关的设置
还有就是 Tools 下面有个 Configure Tools 你去看看~~
xue xi
22 Oct
我程序里用到了VC里的MSCOMM控件,suiPack界面,ADO数据库操作,数据库用的是ACCESS,打包后,将软件安装到别人电脑上运行软件就提示“无注册类别”,MSCOMM的注册信息已经写入了注册表,请问还有哪些信息需要写入注册表呀?或者还是因为其他的原因?急呀。。。。。。。。。。。。。。。。。。。。。
无注册类别一般都是ocx控件造成的
问题早解决了,忘了来结贴了。
的确是因为OCX控件引起的,虽然我注册表了写了键值进去了,但是有些电脑上还需要用regsvr32.exe注册一下。