C++Builder 程序员博客
3 Sep
OptionEh 里的AutoSortMarking = true;
SortLocal = true;
所有列 Column->TitleButton = true;
在DBGridEhTitleClick(TColumnEh *Column)事件里
AnsiString IFieldName;
if(Column->FieldName =="" )return;
IFieldName = Column->FieldName;
if(DBGridEh->DataSource->DataSet->FieldByName(IFieldName)->IsBlob((TMetaClass *)this))
return ;
IFieldKind = DBGridEh->DataSource->DataSet->FieldByName(IFieldName)->FieldKind;
switch(IFieldKind)
{
case fkLookup:
IFieldName =DBGridEh->DataSource->DataSet->FieldByName(IFieldName)->KeyFields;
break;
case fkData:
break;
default:
return;
}
try
{
if(!qryData->Eof)
{
{
if(qryData->Sort == IFieldName+" ASC")
{
qryData->Sort=IFieldName+" DESC";
}
else
{
qryData->Sort=IFieldName+" ASC";
}
}
}
}
catch(…)
{}
可以实现双击排序,但是标题上的图标在单击时候就更改了,有什么办法能屏蔽单击事件,只有在双击时才改变吗
这样是可以的,但是客户那边希望做成双击才进行排序,单击排序太容易误点了.
恩,这个倒是个好方法,试下先.
已经解决问题了。TDBGridEh 在它的DBGridEhTitleClick()事件里先判断是否需要进行排序
这里要过滤到fkLookup,它不能进行排序
要进行排序,qryData 是TDBGridEh 的DataSet
if(qryData->Sort == IFieldName+" ASC")
{
qryData->Sort=IFieldName+" DESC";
Column->Title->SortMarker = smDownEh;
}
else
{
qryData->Sort=IFieldName+" ASC";
Column->Title->SortMarker = smUpEh;
}
29 Aug
pc端通过界面控制温度,通过在输入框中输入一定的值,然后当温度超过一定的值时就会自动报警,
(PC通过串口和协调器相连接,协调器通过无线网络接受传感器传来的值)请问怎么实现?具体实现代码是什么?
希望各位大侠相助,本人菜鸟一个,昨天到今天查资料也没搞定。
这具体代码也太难了吧?协调器里有什么东西不知道,无线网络用什么协议不知道。
定時去收取數據 把收到的數據拿來對比就行了
<
<
<
看不懂,帮顶!
取了数据就判断是不是超过范围!!
不知道你的软件和PLC连接上没有??没有的话可以参考!!
以三菱fx系统为例,找到那条连接电脑编程线,rs422转rs232的,接电脑上!!
了解plc的驱动指令!!
例如
假如plc里把数据存储到数据寄存器D21,
用c++builder串口通讯往发送读取数据寄存器D21的指令,
你就可以把plc返回的数据显示出来!!
我这里有个API串口程序http://download.csdn.net/source/1633176,可以直接往PLC里面发送数据!!
9 Aug
自己完成ftp客户端的实现,怎么显示远程ftp站点的指定目录下的所有文件??
我发送 LIST
的时候发现数据显示不全,我本地缓冲区已经开的很大了,最大到64K了。发现未能显示完整,这是什么原因
socket都recv()函数接收数据都返回零了,但是现实的数据不全,比如说下面是我读完整的数据,
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (347).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (348).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (349).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (350).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (360).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (369).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (370).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (371).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (372).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (373).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (374).asp
-rw-rw-rw- 1 user group 11255 Jun 17 2009 34 (375).asp
-rw-rw-rw- 1 user
这是什么原因呢? 一般的好的ftp客户端软件 不论远程文件夹下面有多少文件都能显示全,我看他们发送的也是 LIST 呀,这就奇怪了。。
ftp
CB目录目录下的例子
Examplefastnetftp
<
<
void TFtp::RemoteFileList(String path)
{
WIN32_FIND_DATA F;
HINTERNET Enum;
String FileName;
Enum = FtpFindFirstFile(ftp,(path+"/*.*").c_str(),&F,0,0);
bool end=!Enum;
while(!end)
{
FileName= F.cFileName;
if(F.dwFileAttributes==faDirectory)
ShowMessage(FileName+" 目录");
else
ShowMessage(FileName+" 文件");
end=!InternetFindNextFile(Enum, &F);
}
}
现在都用TidFtp了
<
<
问题终于得到解决啦,哎,马上结贴
29 Jul
要求:
1.可以判断FIFO里面数据长度
2.可以向FIFO加入多个字节数据
3.可以从FIFO取出多个数据,
4.可以查询FIFO多个数据(不取出来)
怎么实现?
BCB好像是有个链表类的,如果不能用,那么就自己实现一个链表
按先进先出操作即可
STL里面有queue,队列的操作应该比较全了吧?
操 作 功 能
empty() 如果队列为空 则返回 true 否则返回 false
size() 返回队列中元素的个数
pop() 删除 但不返回队首元素 在 priority_queue 中 队首元素代表优先级最
高的元素
front() 返回 但不删除队首元素 它只能应用在一般队列上
back() 返回 但不删除队尾元素 它只能应用在一般队列上
top() 返回 但不删除 priority_queue 的优先级最高的元素 只能应用在
priority_queue 上
push(item) 在队尾放入一个新元素 对于 priority_queue 将根据优先级排序
《C++ Primer 中文第3版》 P271
不管他几字节、、我只认是否在官网上下的?
可以定义个数组来实现队列功能
29 Jul
要求:
1.可以判断FIFO里面数据长度
2.可以向FIFO加入多个字节数据
3.可以从FIFO取出多个数据,
4.可以查询FIFO多个数据(不取出来)
怎么实现?
BCB好像是有个链表类的,如果不能用,那么就自己实现一个链表
按先进先出操作即可
STL里面有queue,队列的操作应该比较全了吧?
操 作 功 能
empty() 如果队列为空 则返回 true 否则返回 false
size() 返回队列中元素的个数
pop() 删除 但不返回队首元素 在 priority_queue 中 队首元素代表优先级最
高的元素
front() 返回 但不删除队首元素 它只能应用在一般队列上
back() 返回 但不删除队尾元素 它只能应用在一般队列上
top() 返回 但不删除 priority_queue 的优先级最高的元素 只能应用在
priority_queue 上
push(item) 在队尾放入一个新元素 对于 priority_queue 将根据优先级排序
《C++ Primer 中文第3版》 P271
不管他几字节、、我只认是否在官网上下的?
可以定义个数组来实现队列功能
26 Jul
软件A 通过串口检测是否连接硬件,通过串口发送0xaa,反回0×55.来检测。
如果无硬件软体无法运行(当然使用中还需要通过串口通讯)。
现在我没有软件A的硬件,所以写一个软件B,软件B可以虚拟一个串口出来,然后设置软件A使用这个虚拟的串口,软件A通过虚拟的串口通讯,实际数据是发送到软件B,软件B通过接收的数据(软件A通过虚拟串口发送的),返回不同的数据,虚拟出这个硬件出来,使软件A可以正常运行。
现在的问题是,怎么实现软件B的虚拟串口。。。
自己写一个虚拟串口有一定的难度,你可参考
http://bbs.driverdevelop.com/htm_data/11/0404/65804.html
网上有很多虚拟串口软件,如SerialNull,不知能否符合你的要求?
好久不见keiy老大。
好久不见keiy老大。
观摩观摩下。。。
自己顶一下。。
用现成的虚拟串口软件吧
<
似乎传说中的老大都出现了,趁机问个问题
再重复一边 上网 找个软件下载
VSPD XP 5 关键字
下了就能用
不行了 发个邮件给我
我发给你
34727498@qq.com
用现成的虚拟串口软件 是不行的..
比如虚拟一个串口COM3
软件A 通过COM3 发送数据,这个数据能到我的软件B中来吗? 软件B能通过COM3返回数据给软件A吗?
http://www.powerip.net/product_VSPM.htm
VSPM虚拟串口软件Ver2.76,它将串口信号转换为网络数据,配合TCP/UDP测试工具就可以满足你的要求
运行在Client模式,会自动建立几个虚拟串口,修改远程Server地址及端口。
这个软件是我见过的最好的了,而且免费的。
再推荐一个工具AccessPort,最好的串口数据监听软件。
<
DDK 开发虚拟串口.
但有虚拟串口未必能解决楼主的问题,软件A 通过串口检测是否连接硬件,可能要求硬件回相应信息的.
楼主最好还是找到连接的硬件,才能解决问题.
"软件A 通过串口检测是否连接硬件,通过串口发送0xaa,反回0×55.来检测"
如果能确定返回0×55,两个串口对接,用一个串口调试程序就可发送返回0×55,不用虚拟串口.
找一台有两个串口的电脑,或两台个有一个串口的电脑,两个串口互相能发送接收.
<
虽然这个有点麻烦,但还是再顶顶…
<
学习
再顶顶看看.
书店有本 龚建伟 写串口书里很详细…
看来是没什么希望了…
不会呀,学习!!!
真的没有了吗?
买个串口卡有2口的,然后用串口线将2个串口连接起来,这样你就可以写软件B了,如果实时性没有要求,根本就不用写,用个串口调试软件接收就可以了,然后该回应什么自己手动输入。
一般新装的串口卡串口是com3,com4,那么A用串口3,B用串口4,按照我说的就可以试验。
串口卡不贵,一块也就100块左右吧。我的电脑装机是不带串口的,都靠她了
这么个好帖居然这么长时间没有注意。
顶顶
<
<
我也一直在进行串口产品,和基于串口通信的系统开发!要用的反馈都是才有双串口通信活着双机手动检验!今天才知道还有虚拟一说,确实能节省很大人力啊!希望传奇大哥们这个问题多指点啊!
……这个问题..你可以先用虚拟串口的工具虚拟出两个串口..比如com1和com2 接着让它们互联..然后..你的A软件..打开com1 b软件.打开com2 他们就能互通了~
16 Jul
6 Jul
请问ListView控件中使用CheckBox如何实现只能单选的功能?感谢!
选中一个的时候判断,把其它的去掉。
是循环判断么?从ListView1-> Items-> Items[0]到ListView1-> Items-> Items[i]?
可是这样的话总是先检查上面的,比如先选了第3行,现在想改选第2行,这样循环最后结果还是第3行的checkbox被选中阿。
555
选把你要选中的勾起,循环去掉其他的。
可是怎么获得勾选的item序号呢?只会循环检查item-> checked是否为真,但是这样循环下来总是检查到第一个被选中的item。
你在循环的时候想选哪个都可以啊
选的为真,其他的为假。。。
你还想怎么实现?
是我表达不清.
我的意思是比如有3行,原本选中了第二行的checkbox,现在勾选第三行的时候希望去掉第二行,但是我不知道怎么获得当前选中的checkbox。用循环的话,在listview的onclick事件中:
for( int i = 0; i < 3; i++)
{
//从头开始检查是否有一行的checkbox被勾选,若有则取消其它行的checkbox
if(ListView1-> Items-> Item[i]-> Checked)
{
for(int j = 0; j < 3; j++)
{
if(j != i)
ListView1-> Items-> Item[j]-> Checked = false;
}
}
}
T.T 只会这样写,如果先选了第二行再想改选第三行就不能选了,请问该怎么写呢?
ListView1-> Selected 应该是你点击的ITEM,先确定如何处理,然后把所有的都处理了再把这个处理一下。
Selected只响应item的caption点击,如果只是在checkbox里打勾好像ListView1-> Selected无法得到哪一行被勾选阿。
int c; //c+1为你要选中的行数
for(int i=0;i <ListView1-> Items-> Count;i++)
{
ListView1-> Items-> Item[i]-> Checked=false;
}
ListView1-> Items-> Item[c]-> Checked=true;
谢谢!
为什么需要循环,太浪费时间了吧,用一个变量保存选中的CHECK,选择新的行的时候,把这个保存起来的行设为FALSE,就可以了,
1 Jul
如题..
自己继承该控件,然后编写相应功能
到底是要拖动多个呢?
还是要排序什么的?
没有看懂
比如原来是1.2.3.4.5.6.7.8.9.10
如果拖动5.6.7移动到2的位置,顺序就变成1.2.5.6.7.3.4.8.9.10
如果拖动5.7.9移动到2的位置,顺序就变成1.2.5.7.9.3.4.6.8.10
先delete(),再insert()
用4楼方法也行
用http://topic.csdn.net/t/20040817/10/3281700.html
也行,方法多种 自己选择
9 May
我想要存储持续传输进来的数据流(每两次数据流间有一定时间间隔),请问SaveDialog能实现持续自动存储文件(每次数据流希存储为一个文件)吗?
自动保存数据用SaveDialog干嘛?
你直接用数据流的SaveToFile()函数即可
SaveDialog仅仅是提供一个选择文件的功能而已,说白了就是只提供一个文件名。至于保存什么内容,以及写入文件等等,需要你自己来操作。
那请问用SaveToFile()怎样怎么实现连续存储多个文件(要求能自动生成文件名)?
“我想要存储持续传输进来的数据流(每两次数据流间有一定时间间隔)”
你不是收到数据流了吗?
有了数据流直接保存就可以了
<
<
<
谢谢大哥,非常感谢!