SmartBinding with kbmMW #4


前言

在前面寫過的文章中,詳細介紹過如何將各種的控件與數據源進行綁定(Bind)。在這篇文章中,將重點討論如何綁定TImage和TListView。(同時支持VCL與Firemonkey)。

將圖形數據源綁定到TImage和捕獲綁定

在VCL和FMX模式下,使用kbmMW都可以很容易地將數據集中的圖形字段綁定到TImage。讓我們舉一個簡單的例子:

 下面是Prepare dataset按鈕的Click事件代碼:

procedure TForm1.Button8Click(Sender: TObject);
var
   mt:TkbmMemTable;
   csv:TkbmCSVStreamFormat;
begin
     bnd:=nil;
     Binding.Clear;
     if dataset<>nil then
        FreeAndNil(dataset);

     csv:=TkbmCSVStreamFormat.Create(nil);
     try
        mt:=TkbmMemTable.Create(nil);
        mt.LoadFromFileViaFormat('biolife.csv',csv);
     finally
        csv.Free;
     end;
     dataset:=mt;

     bnd:=Binding.Bind(dataset,'Category',Edit5,'Text',[mwboTwoWay]);
     Binding.Bind(dataset,'Species Name',Edit6,'Text',[mwboTwoWay]);

     Binding.Bind(dataset,'Graphic',Image1,'Picture');

     if bnd.Navigator<>nil then
        bnd.Navigator.First;
end;

上面的代碼,建一個內存表,並從文件中加載記錄,內存表中有一個是圖型字段,字段名為“Graphic”。然后,將這些字段與對應的Edit進行綁定,將Graphic字段與Image1.Picture屬性綁定。運行就會得到如下結果:

當按下Prepare dataset按鈕,在綁定的控件中,立即顯示數據集當前記錄的內容!

如果換成Firemonkey,除了綁定到TImage.Bitmap屬性外,其他都一樣。

如果我們想更新TImage時,能同步到TDataSet的Graphic字段中,該怎么辦呢?

首先,我們用雙向綁定:

Binding.Bind(dataset,'Graphic',Image1,'Picture',[mwboTwoWay]);

然后,用下面的代碼修改TImage中的圖片,並更新到Graphic字段中。

procedure TForm1.btnLoadBitmapClick(Sender: TObject);
begin
     Image1.Picture.LoadFromFile('.\samplebitmap.png');
     Binding.Changed(Image1,'Picture');
end;

第一行代碼容易理解,將一個Png圖片加載到TImage中。第二行則需要說明一下。

通常情況下,SmartBinding會自動判斷控件的內容是否發生了變化,變會了就會同步到對應的數據源中,在這里對TImage實例進行操作時也可以這樣做,但這樣做,會因為比較TImage當前位圖與以前的位圖,效率太慢了,所以取而代之,用Binding.Changed發出通知。

在這里,我們通知SmartBinding,實例Image1的屬性Picture的內容已更改,所有訂閱該屬性的數據源都需要更新,本例的結果就是將圖片保存到數據集的Graphic字段中。

( 2020.4.3:kbmMW 10.20中發現一個字段綁定一個TEdit,然后給TEdit賦值,再調用Binding.Changed無效,給TEdit的值沒有傳遞給字段。)

智能綁定一個TListView

TListView在VCL版本中與Firemonkey版本中的操作稍有不同,Firemonkey版本在顯示內容和顯示方式上更加靈活。

但是,綁定到它們非常相似。列表視圖與大多數其他視覺控件的不同之處在於,它們顯示子項(列表項),每個子項都有自己的一組屬性,這些屬性會影響它們表示的數據。

kbmMW SmartBinding通過進一步擴展綁定Grid時使用的#語法,使綁定這些屬性變得容易。

讓我們更改上面的例子,實現數據集綁定到ListView。

首先,我們添加一個標准的TListView,然后將數據集中的Category字段綁定到列表項的Caption屬性,再綁定數據集與ListView的位置,讓我們可以使用ListView時,同時導航TDataSet的位置。

     bnd:=Binding.Bind(dataset,'Category',ListView2,'#caption');
     Binding.Bind(dataset,'@',ListView2,'@',[mwboTwoWay]);

使用默認的ViewStyle(vsIcon),應用程序在運行時將如下所示。

單擊ListView中的任意位置,將自動同步數據集的當前記錄,Edit控件也會自動顯示所綁定字段的當前記錄的內容。

注意到特殊的#caption語法嗎?它是可以使用的許多綁定屬性名稱之一,下表顯示了當前支持的可以綁定的屬性:

 

 此外,在將VCL TListView的屬性ViewStyle設置為vsReport模式時,可以通過使用綁定成員#0 ..#999來引用列號。

以下顯示。將TListView的ViewStyle屬性設置為vsReport並設置其列:

 

 現在綁定到列號0和1。

     Binding.Bind(dataset,'Species Name',ListView2,'#0');
     Binding.Bind(dataset,'Common_Name',ListView2,'#1');

Firemonkey的TListView沒有vsReport視圖樣式,但是可以通過將TListView的ItemAppearence設置為DynamicAppearence來添加任意數量的顯示控件,具體操作方法:在設計器中,在ListView上單擊右鍵,然后選擇“Toggle DesignMode”模式。如下圖,我添加了兩個Text和一個Image,可以看到ListView中的Text1,Image2和Text3。

下面的代碼,將字段綁定到填加的Item上:

     bnd:=Binding.Bind(dataset,'Common_Name',ListView2,'#Text1');
     Binding.Bind(dataset,'Graphic',ListView2,'#Image2');
     Binding.Bind(dataset,'Species Name',ListView2,'#Text3');

運行結果如下圖:

原文地址: https://components4developers.blog/2019/10/18/smartbinding-with-kbmmw-4/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM