C++Builder 程序员博客
5 Sep
我在DBgrideh里面的OnGetCellParams事件写如下代码:
if(DBGridEh1->SelectedIndex==1)
{
AnsiString ss="";
ss=Trim(DBGridEh1->Columns->Items[1]->Field->AsString);
DBGridEh1->Columns->Items[1]->PickList->Clear();
if(ss!="")
{
ADOQuery2->Close();
ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add("select distinct nowLoginNickName from bbs where nowLoginNickName like '%"+ss+"%'");
ADOQuery2->Open();
for(ADOQuery2->First();!ADOQuery2->Eof;ADOQuery2->Next())
{
AnsiString temp="";
temp=ADOQuery2->Fields->Fields[0]->AsString;
DBGridEh1->Columns->Items[1]->PickList->Add(temp);
}
}
}
实际运行测试,却发现DBgrideh不能实时的捕抓到输入时候的字符变化,也就是达不到类似Edit控件那种onchange事件那种效果,请问该如何解决这个问题?
靠,你是卖广告的?
你是卖广告的?
该回复于2008-07-31 22:00:35被版主删除
似乎DBGridEh本身有这个功能。
怎么使用?
我使用DBgridEh的OnDrawColumnCell事件,在事件里面我有如下代码:
POINT pt;
pt.x=Rect.Left;
pt.y=Rect.Top;
::ClientToScreen(DBGridEh1->Handle,&pt);
Edit3->Text=IntToStr(pt.x);
Edit4->Text=IntToStr(pt.y);
,那么在相同的cell里面我随便输入内容,并且多次回车(此时编辑的焦点依然是在同一个cell里面) 正常来说,Edit显示的坐标每次都是一样的,我单独建立一个工程放1个Dbgrideh上去,测试的时候很正常,但我现在用同样的方法在已做的项目里面的Dbgrideh的OnDrawColumnCell事件加入相同的代码,却发现在同一个cell里面不断的按回车(焦点依然保留在同一个cell里面),定位出来的坐标竟然是在2组不同的坐标之间不断的切换(其中一组当然是正确的),出现这样的情况,我就弄糊涂了,不知道问题出在哪里?
因为我这样做的目的是为了能够获得这个当前编辑的cell坐标,然后把鼠标移动过去,那你有什么好办法吗?
该回复于2008-08-03 13:19:11被版主删除
我写在csdn博客上了,地址:
http://blog.csdn.net/hemiya/archive/2008/08/28/2845531.aspx
这个是简单的例子,希望给和我一样遇到相同问题的人一点帮助.
firebird数据库用的人比较少吧
我上次去下了个,不会玩,后来就没有玩了!
2 Sep
如何使用ShellExecute调用外部程序, 只能运行一次,再次调用时,显示已经调用过的窗口.
HANDLE mutex ;
const char mutexname [] = "EEGSysSet" ;
mutex = OpenMutex (0, false, mutexname) ;//
if (mutex == NULL)
{
mutex = CreateMutex(0,1,mutexname);
if(!ERROR_ALREADY_EXISTS == ::GetLastError())
{
AnsiString ans;
ans.sprintf("%s\\EEGSysSet.exe", CDBIN);
ShellExecute(NULL, "", ans.c_str(), "EEGSys", CDBIN, SW_MAXIMIZE);
}
}
else
{
ShowMessage ("Application Already Running") ;
} *
使用以上程序,创建CreateMutex,第二次调用的时候确实没有启动,但是,如果第一次调用的已经关闭了,再次调用的时候就没有反应了,等于CreateMutex还在起作用呀!不知道有没有其它的方法.
//试试这个,你那个看着有点乱,改了改,看是否合适 HANDLE mutex ; const char mutexname [] = "EEGSysSet" ; mutex = CreateMutex(0,1,mutexname); if(!ERROR_ALREADY_EXISTS == ::GetLastError()|| mutex == NULL) { MessageBox(0,"您已经起动了本程序!","提醒:禁止多次运行。",MB_OK); return ; } ShellExecute(NULL, "", ans.c_str(), "EEGSys", CDBIN, SW_MAXIMIZE);
HANDLE mutex ;
是个全局的,你有没有注销这个 HANDLE 。
你程序只能对自己本事多次调用起到作用,但是对于外界关闭程序,并没有促使你释放信号量,所以不可以!
up
该回复于2008-07-10 02:38:26被版主删除
该回复于2008-07-10 02:47:04被版主删除
C Builder中使用Delphi文件问题中,我还是无法在.pas同目录下找到生成.hpp文件。我就步骤是我把我需要用的text1.pas源文件放到一个文件夹中,打开C++ Builder,打开我的工程选择Projet ⦁dd to Project ,从Add to Project对话框中的文件类型选择PAS文件名选择text.pas,然后点击OK。
别人说会生成对应的.hpp文件(这个文件和你的单元文件在同一目录下面) ,可我没找到,不知道什么原因,是我做的顺序有问题?
是不是编译正确了才生成.hpp.在delphi中没错,怎么一加入后出现很多原来没有的错误
最好把代码/错误贴上来看一下
要确认你的BCB IDE没有装bcc32pch,或在编译的时候bcc32pch需要关闭。
怎么知道我的 IDE是否装bcc32pch
是不是在delphi中showmessage可以全是小写,但其中一个错误是 Undeclared identifier: 'showmessage'。
这句showmessage("数据开始有非法字符!");还有2个错误
[Pascal Error] test1.pas(96): Illegal character in input file: '"' ($22)
[Pascal Error] test1.pas(96): Illegal character in input file: '非' ($B7C7)
看上去你是用c++的编译器去编译pas文件了,不要把pas的代码贴入BCB中.只能加入pas的unit,然后再
#include <pas_unit.hpp>
具体可参考:
hnsyf(鱼片儿)写的:
http://topic.csdn.net/t/20020618/17/813364.html
我加入的就是pas的unit,我选择Projet ⦁dd to Project 加入test1.pas后上面显示还是test.pas不是test.hpp?
研究了很长时间了,一直弄不好,心里很急,很需要兄弟的帮忙
上面只会显示unit的名字test,没有.pas或.hpp
显示.pas,不过我是按照你和我说的也就是你给我的文章中的步骤做的
你的BCB是什么版本?
6.0
你有QQ吗?,你是否可以用QQ上的远程协助给我演示个简单的例子
那就奇怪了,可能是你的bcb本身的问题了
很需要keiy的帮忙,为了这个问题,我愁死了,我现在终于承认自己别正常人笨一些了
写一个简单的test.pas
unit test ;
interface
implementation
function testf:integer;
begin
testf:=100;
end;
end.
然后存盘,在同一目录下,新建一个bcb项目,将test.pas加入,BCB的程序为:
//————————————————————————— #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "test.hpp" //————————————————————————— #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //————————————————————————— __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //————————————————————————— void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage(testf()); } //————-
编译看看结果
用delphi建简单例子的时候
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
这些东西删掉吗?
可以,可以生成.hpp
看来是我的程序有问题
我的test.pas是我截取的我原来的一个.pas文件的一部分,是不是与这个有关
上面我的也有小问题:
unit test ;
interface
function testf:integer; //少了声明
implementation
function testf:integer;
begin
testf:=100;
end;
end.
不然能编译不能运行
回头再看了一下你的错:
1.你没有uses Dialogs,就会报:
Undeclared identifier: 'showmessage'
2.showmessage("数据开始有非法字符!");
delphi的字中用不能",要用',要改成
showmessage('数据开始有非法字符!');
学无止境哪““
非常感谢keiy,虽然我的还没做出,但你给我的例子我做,,这贴现在结。以后还大有可能向您请教
30 Aug
尽量说的详细下
先把De做成Dll形式,再用CBC调用
请您说的详细下怎么样
直接加入pas文件
具体怎么加
project->add to project
把pas单元文件直接加入到工程(Project->add to project)文件类型选择 pascal unit (*.pas)
然后builder 一下工程
这时会生成对应的.hpp文件(这个文件和你的单元文件在同一目录下面)
在需要使用的地方 #include "xxx.hpp" ok
我按照这样的步骤做的,但没找到.hpp文件啊
1、选择Projet ¦Add to Project
2、从Add to Project对话框中选择CPP、C、PAS、RES、LIB或OBJ。对于Delphi单元,选择PAS。
3、浏览目录并选择加入项目所需要的文件。
4、找到所需的文件后,单击Open完成。无须以任何方式进一步处理Pascal文件。
我怎么没有发现我的里面有生成.hpp文件啊
阿发伯:
弄了很长时间了还是弄不好,心里很急,急需您的帮忙
呵呵,以前好像加过.好几年了.
映象中,在BCB6.00中把DELPHI6.00的PAS拿来就用的.
在程序中直接把PAS加载,然后运行,好像会自动得到一个HPP文件,然后加载这个文件.
我觉得以程序的稳定性来说,还是做动态库.然后动态加载的更好.(这才是一劳永逸的好方法.)
我对动态库可是一点也不会啊
必须成功的编译一次,才能形成hpp文件
29 Aug
//function.h
struct site
{
double a;
double b;
…………
}
extern site site_data[NUM];//NUM为常量
//tin.h
class T_tin
{
public:
T_tin();
~T_tin();
void CreatPoint(site * site_data);
…………
}
在tin.cpp里实现。
在main里使用时,出错
error C2061: syntax error : identifier 'site'
正确的应该怎么改?谢谢大家了。
在线等。
已经加过了,
#ifndef _TIN_H_
#define _TIN_H_
#include "function.h"
…………
…………
#endif
还是一样的错误。
谢谢。
//可以改成这样 //—function.h — #define NUM 5 struct site { double a; double b; //………… }; extern site site_data[NUM]; //NUM为常量 //—tin.h— #include "function.h" #include <iostream> using namespace std; class T_tin { public: T_tin(){}; ~T_tin(){}; void CreatPoint(site * site_data); //………… }; //—main.cpp— #include "tin.h" void main() { }
找到错误了。谢谢3楼。我在function.h 里有包含了tin.h.文件互相包含就出错了、
27 Aug
我想在C++ Builder中使用VLC控件播放,但是控件导入后无法播放,只有一个图标在上面。
哪位大大能给解释一下怎么弄才能播放出来?
我的VLC播放器的版本是0.8.6c
这恐怕是VLC控件的兼容性问题。
TMediaPlayer?
播放的是什么文件格式?有操作系统有装解码器么?
27 Aug
软件中大量使用了ShockWaveFlash ,当程序在BCB编程环境中编译状态时,不会出现任何问题.
当软件release后,偶而某个窗口会弹出Accress violation at XXXXXXXX(感觉象吃了苍蝇一样恶心),点确定后,发现Flash没有播放出来.关闭出错窗体,重新打开,Flash又能正常播放了,很邪门吧!
请高手指点,问题出在哪儿,该如何解决!
我觉得不一定是ShockWaveFlash 的事情,也可能是某处代码有泄露或者有冲突,造成的!比如对VCL控件的访问,最好不要放在子线程里,或者内存溢出(用CodeGuard查看一下),或者线程的互斥没有做好,都有可能!
26 Aug
如何使用ADOTable控件获取access表中的字段名称和类型
楼上的真牛啊!!!~
= =~用那么复杂吗?
一个数据源指定ACCESS的连接路径,,ODBC~
然后用一条SQL语句用ADOQUERY来执行不就可以获得了么。。。
连接以后也应该可以在代码中直接指定TABLE的表吧。。我没试过。。。
感觉ADOQUERY好用