2020-01-09:kbmMW 5.10.20解决了下面的问题,如果你已经升级到该版本,则下面内容没必要读了!

千呼万唤始出来,最新的kbmMW 5.10.01终于发布了,详情可以看xalion发的更新日志

我期待的Smartbinding for Listview终于来了,在这一版本中,对SmartBinding做了大量的功能扩展与更新,对Listview只是其中之一。这几天一直测试这个Listview的支持情况,发现一个致命的问题,看下面这行代码:

bnd:=Binding.Bind(dataset,'f1',Edit1,'Text',[mwboTwoWay]);

将dataset的f1字段绑定到Edit1的Text属性上,采用双向绑定的方式,目的是通过Edit1,能编辑字段,如同VCL下的DBEdit的一样工作。

但实际的运行情况,与预期不符,当绑定后,SmartBinding将Edit1.Text写到dataset的f1字段中,正好写反了!见下图:

初始情况下,控件Edit1的属性Text值为“Edit1",f1字段值为0,现在”Edit1"正好写入dataset的f1字段中,然后ListView也显示了字段的值为"Edit1"。

向作者反应了这个问题,但作者并没有确认这是一个bug,只好自己动手,通过读SmartBinding的代码,找到一个解决方法,按下面代码修改,所有TkbmMWBinding.Create重载的版本都要改。

constructor TkbmMWBinding.Create(const ABindings:TkbmMWBindings;
const ASource:TValue; const ASourceMember:string;
const ADestination:TValue; const ADestinationMember:string;
const AOptions:TkbmMWBindingOptions = []);
var
v:TValue;
b:boolean;
begin
inherited Create;
....
UpdateInfo; FDestinationProxy.SetValue(FSourceProxy.Value,true); //增加这一行. end;

改后,我们再看看实际运行情况:

上面两个Edit控件及下面的ListView控件终于都显示数据集的内容了!

原理分析:

SmartBinding绑定,就是用TkbmMWBindings来管理TkbmMWBinding对象,即调用TkbmMWBindings.bind增加一个绑定时,会建立一个TkbmMWBinding对象,并将这个对象加到TkbmMWBindings内部的列表中。问题就出在建立TkbmMWBinding对象过程中,没有将数据源的值赋值给目标源,然后,当SmartBind做数据同步时,错误的将目标源的值回写给了数据源,造成逻辑上的错误。我这里的修改,就是增加了这一步:将数据源的值赋值给目标源。

2019-11-26

kbmMW 5.10.10没有按我的意思改,作者认为这不是问题?

2019-11-27

Aone提出这样改,可以避免问题。

procedure TForm1.Button9Click(Sender: TObject);
begin bnd:=nil;
Binding.Clear;
//ListView1.Items.Clear; dataset:=mt; dataset.DisableControls; bnd:=Binding.Bind(dataset,'f1',Edit1,'Text',[mwboTwoWay]);
Binding.Bind(dataset,'f2',Edit2,'Text',[mwboTwoWay]);
Binding.Bind(dataset,'f3',DateEdit1,'Date',[mwboTwoWay]); bnd:= Binding.Bind(dataset,'f1',ListView1,'#Text1');
Binding.Bind(dataset,'f2',ListView1,'#Text2');
Binding.Bind(dataset,'f3',ListView1,'#Text3'); Binding.Bind(dataset,'@',ListView1,'@',[mwboTwoWay]); dataset.EnableControls; end;

kbmMW 5.10.10新问题:(5.10.20还存在这个问题)

procedure TForm1.Button11Click(Sender: TObject);
begin bnd.Navigator.Append;
bnd.Navigator.Value['f1']:='';
bnd.Navigator.Value['f2']:=; end;

上面代码产生错误:dataset not in edit mode.

修正代码:

procedure TkbmMWBindingDatasetNavigator.SetValue(const AName:string; const AValue:TValue);
var
fld:TField;
begin
if IsValid then
begin
fld:=FDataset.FindField(AName);
if fld<>nil then
begin
if not (FDataset.State in [dsInsert,dsEdit]) then//+++
FDataSet.Edit;//+++ fld.AsVariant:=TkbmMWRTTI.ConvertValue2Variant(AValue,nil);
end;
end;
end;

发给作者,等修正!

kbmMW 5.10.10 SmartBinding问题修正的更多相关文章

  1. KBMMW 4.93.10 win64 一个BUG 修正

    经常有人提到kbmmw 4.93.10 的64 位版本没有32位版本稳定. 经过官方确认,是delphi 编译器生成64 位代码内存偏移地址的错误. 在kbmMWGlobal.pas 中 有一个函数k ...

  2. Mac OS X Yosemite 10.10 配置 Apache+PHP 教程注意事项

    刚更新到了 Mac OS X Yosemite 10.10,发现运行Apache出现了一些问题,修正一下! 教程基于 Mac OS X Mavericks 10.9.X,移步:Mac OS X Mav ...

  3. 【转】windows环境下安装win8.1+Mac OS X 10.10双系统教程

    先要感谢远景论坛里的各位大神们的帖子  没有他们的分享我也不能顺利的装上Mac OS X 10.10! 写这篇随笔主要是为了防止自己遗忘,同时给大家分享下我的经验. 本教程适用于BIOS+MBR分区的 ...

  4. XCode6.3上使用opencv教程(MacOSX 10.10)

    OpenCV 是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Pyth ...

  5. 多位数每一位个系数:个位num%10;十位num/10%10.......

    请输出满足这样条件的五位数. 个位=万位 十位=千位 个位+十位+千位+万位=百位 思路: 1.定义一个要操作的五位数变量num 2.求出每一位个系数 个:num%10 十:num/10%10 百:n ...

  6. 在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目

    终于有时间在 Mac 上安装一下 ASP.NET 5,网上有许多教程,但是多数的时间比较早了,版本不是最新,搭着 Build 2015 的春风,我也实践一下 Mac OS X 上的 ASP.NET 5 ...

  7. 虚拟机(VMware12 pro)安装Mac OS 10.10

    下载VMware12pro,Mac OS 10.10.ios,虚拟机破解: 在虚拟机中创建新虚拟机://http://cdnnn.07net01.com/linux/2016/01/1130384.h ...

  8. [MAC]用beamoff给VMware的Mac OS X 10.10.x加速

    MAC OS X 10.10.x Yosemite在VMWare中实在是太慢了,卡出翔!好在高人多,请装beamoff!详见:https://github.com/JasF/beamoff.git C ...

  9. [MAC]OS X Mavericks 10.9.5 / 10.10.2 VMWare vmdk镜像,解压就能用!

    用起来是比VirtualBox好使很多: 1.鼠标很灵敏,不像Vbox那么飘 2.显卡有驱动,VM可以配置显示器尺寸,完美支持网络.语音.视频,直接搞全屏,还能看电影 3.USB设备支持热插拔 4.支 ...

随机推荐

  1. Rust基础笔记:闭包

    语法 Closure看上去是这样的: let plus_one = |x: i32| x + 1; assert_eq!(2, plus_one(1)); 首先创建一个绑定plus_one,然后将它分 ...

  2. LeetCode_112. Path Sum

    112. Path Sum Easy Given a binary tree and a sum, determine if the tree has a root-to-leaf path such ...

  3. python介绍,计算机组成。内存分布,进制,操作系统介绍

    学习小方法 ​三个W一个Hwwwh:what(是什么) why(为什么) where(怎么用) how(如何用) 来思考知识点多练,多写,多敲代码增加熟练度与代码量​ Python 是一门面向后台的编 ...

  4. MySQL 全局锁和表锁

    根据加锁的范围,MySQL 里面的锁大致可以分成全局锁,表级锁,行锁. 行锁已经在前面几篇文章说过 1. 全局锁 全局锁就是对整个数据库实例加锁.MySQL 提供了一个加全局读锁的方法,命令是Flus ...

  5. 最新 百度java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.百度等10家互联网公司的校招Offer,因为某些自身原因最终选择了百度.6.7月主要是做系统复习.项目复盘.LeetCode ...

  6. php 将图片文件转成base64编码的方法

    php 将图片文件转成base64编码的方法<pre><?php /** 文件转base64输出 * @param String $file 文件路径 * @return Strin ...

  7. pytest使用总结笔记

    简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.并且pytest兼容unittest的用例,支 ...

  8. 【leetcode算法-简单】35. 搜索插入位置

    [题目描述] 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5, ...

  9. 乐字节Java循环:循环控制和嵌套循环

    乐字节小乐上次讲完了Java反射,接下来小乐给大家讲述Java循环. 循环有以下四部分: 一.循环控制 1. do..while 直到型 ( 先执行后判断) ,结构为: 先执行循环体,后判断布尔表达式 ...

  10. Python--yaml文件写入

    原文地址:https://www.cnblogs.com/yoyoketang/p/9255109.html yaml作为配置文件是非常友好的一种格式,前面一篇讲了yaml的一些基础语法和读取方法,本 ...