青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

依舊的博客

技術學習

C++博客 首頁 新隨筆 聯系 聚合 管理
  17 Posts :: 1 Stories :: 2 Comments :: 0 Trackbacks
 

視圖用來表現數據,也是用戶接口。當數據更新時,視圖應該隨之改變,在交互過程中,視圖需要響應用戶,這些情況下都會引起視圖的繪制。 cxGrid可以用多種視圖表現關系型數據,最常用的是表格視圖,我們以表格視圖作為默認的對象,分析cxGrid用以實現視圖繪制的基本結構。

 

表格視圖按行,列布局,行優先順序繪制,繪制的基本元素是行和單元(cell)。由于數據內容的動態性,行是動態生成的。表格視圖提供了各種可定制性,包括可選的分組行風格和若干自定義風格,這些復雜特性背后有很好的設計。

 

視圖繪制相關的幾組類:

 

ViewInfo類族:

描述視圖元素的繪制信息,視圖元素要繪制成什么樣子,完全由其ViewInfo確定。祖先類是TcxCustomGridCellViewInfo,數據行,數據單元,分組行等視圖元素以及視圖本身都有相應的派生類。

 

Painter類族:

按照ViewInfo,在畫布上繪制視圖元素。祖先類是TcxCustomGridCellPainter TcxCustomGridCellPainter = class

 private

    FCanvas: TcxCanvas;

FViewInfo: TcxCustomGridCellViewInfo;

 

View類族:

整個視圖的描述,包括了各種設置信息。祖先是TcxCustomGridView

ViewViewInfo的不同在ViewInfo描述繪制信息,而View描述設置信息,ViewInfo是動態構造的,當Grid創建時,如果有一個分組多條記錄,那么每條記錄會生成一個ViewInfo實例,如果收起分組,這些實例將被銷毀,展開分組,會再次生成每條記錄的ViewInfo實例,而一個表格視圖始終只有一個實例。

 

LookAndFeelPainter類族:

用于進行有關分組行風格的繪制。祖先是TcxCustomLookAndFeelPainter

繪制視圖元素時,涉及到分組行風格(GroupRowStyle)的繪制任務,都被委托給LookAndFeelPainter類的實例,由此實現多態的風格。

 

StyleStyles類族:

Style類的祖先是TcxCustomStyleStyles類的祖先是TcxCustomStylesTcxCustomStyle類表示一種自定義風格,TcxCustomStyles類表示一組風格。TcxCustomStyles內部用一個map保存這些風格,給出鍵,可通過Values屬性取出指定的風格。

TcxCustomStyles = class(TcxInterfacedPersistent, IcxStyleChangeListener)

public

property Values[Index: Integer]: TcxCustomStyle read GetValue write SetValue;

鍵的取值范圍如下:

 vsCustomTableFirst = vsCustomLast + 1;

 vsContent = vsCustomTableFirst;

 vsContentEven = vsCustomTableFirst + 1;

 vsContentOdd = vsCustomTableFirst + 2;

 vsFilterBox = vsCustomTableFirst + 3;

 vsInactive = vsCustomTableFirst + 4;

 vsIncSearch = vsCustomTableFirst + 5;

 vsSelection = vsCustomTableFirst + 6;

// vsCustomTableLast = vsSelection;

 vsHotTrack = vsCustomTableFirst + 7;

 vsCustomTableLast = vsHotTrack;

 

考查以上幾組類的關系:

 

PainterViewInfo

 

Painter類和ViewInfo類具有對應關系,在視圖元素繪制時創建出Painter類的實例,其中有多態機制的作用,下面具體了解一下這個創建過程。

 

TcxCustomGridCellPainter派生的一組類中,只有它自己有構造函數:

constructor TcxCustomGridCellPainter.Create(ACanvas: TcxCanvas;

 AViewInfo: TcxCustomGridCellViewInfo);

begin

 inherited Create;

 FCanvas := ACanvas;

 FViewInfo := AViewInfo;

end;

那么當需要調用其派生類方法時,是如何構造出派生類實例的?Painter類實例都是在ViewInfo類的方法中創建出來的,代碼如下:

GetPainterClass.Create()

 

TcxGridDataRowViewInfo = class(TcxCustomGridRowViewInfo)

protected:

function GetPainterClass: TcxCustomGridCellPainterClass; override;

 

 

function TcxGridDataRowViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;

begin

 Result := TcxGridDataRowPainter;

end;

 

這樣,創建哪個Painter類的實例決定于ViewInfo類的實例,通過某個ViewInfo實例調用GetPainterClass.Create(),就返回對應Painter類的實例。

 

ViewInfo類進行繪制時,會調用Painter類的繪制方法;Painter類進行繪制時,也會調用ViewInfo類的繪制方法,比如:

procedure TcxCustomGridRecordsPainter.Paint;

var

 I: Integer;

begin

 with FViewInfo do

    for I := 0 to Count - 1 do

      with Items[I] do

        if Calculated then Paint;

end;

跟蹤繪制過程可以看到,正是在兩種調用的交替中繪出了視圖的每個元素,最終在顯示設備上的繪制是由Painter類實現的,而ViewInfo的繪制方法會起到調度的作用,比如把數據行的繪制分解成各數據單元的繪制。

我們已經了解到,前一種調用是通過構造局部實例,那么后一種呢?

TcxCustomGridCellPainter中定義了FViewInfo私有成員,并將其定義為保護屬性

 TcxCustomGridCellPainter = class

 private

    FCanvas: TcxCanvas;

FViewInfo: TcxCustomGridCellViewInfo;

 protected

property ViewInfo: TcxCustomGridCellViewInfo read FViewInfo;

其派生類繼承了該屬性,并將其重新定義

 TcxGridDataRowPainter = class(TcxCustomGridRowPainter)

 private

    function GetViewInfo: TcxGridDataRowViewInfo;

 protected

    property ViewInfo: TcxGridDataRowViewInfo read GetViewInfo;

 

function TcxGridDataRowPainter.GetViewInfo: TcxGridDataRowViewInfo;

begin

 Result := TcxGridDataRowViewInfo(inherited ViewInfo);

end;

 

ViewStyles

 

視圖風格是視圖的屬性:

 TcxCustomGridView = class(TcxControlChildComponent, IcxStoredObject, IcxStoredParent,

    IcxGridViewLayoutEditorSupport, IcxGridViewDesignerMenu)

 private

FStyles: TcxCustomGridStyles;

 Protected:

property Styles: TcxCustomGridStyles read FStyles write SetStyles;

 

procedure TcxCustomGridView.SetStyles(Value: TcxCustomGridStyles);

begin

 FStyles.Assign(Value);

end;

 

特定的視圖使用特定的視圖風格,以表視圖為例,可以看到兩者是如何對應的。

TcxGridTableView = class(TcxCustomGridTableView)

Published:

property Styles: TcxGridTableViewStyles read GetStyles write SetStyles;

 

function TcxGridTableView.GetStyles: TcxGridTableViewStyles;

begin

 Result := TcxGridTableViewStyles(inherited Styles);

end;

 

procedure TcxGridTableView.SetStyles(Value: TcxGridTableViewStyles);

begin

 inherited Styles := Value;

end;

 

ViewLookAndFeelPainter

 

ViewInfoGridStylesGridView類都有LookAndFeelPainter屬性,因為分組行風格設置是作用于整個視圖的,所以該屬性真正定義是在GridView中,GridStylesViewInfo只是返回一個引用,提供該屬性是為了方便,比如ViewInfo進行繪制時,要用到風格的設置。

function TcxCustomGridView.GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;

begin

 if Control = nil then

    Result := TcxStandardLookAndFeelPainter

 else

    Result := TcxCustomGrid(Control).LookAndFeelPainter;

end;

 

function TcxCustomGridStyles.GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;

begin

 Result := GridView.LookAndFeelPainter;

end;

 

/* TcxGridViewHandler是視圖ViewInfo的祖先類。*/

function TcxGridViewHandler.GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;

begin

 Result := FGridView.LookAndFeelPainter;

end;

 

/* TcxCustomGridViewCellViewInfo是視圖元素ViewInfo的祖先類,FGridViewInfoGridViewInfo屬性的成員變量。*/

function TcxCustomGridViewCellViewInfo.GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;

begin

 Result := FGridViewInfo.LookAndFeelPainter;

end;

posted on 2007-05-15 18:05 依舊的博客 閱讀(1371) 評論(0)  編輯 收藏 引用 所屬分類: 編程

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲午夜激情| 宅男噜噜噜66一区二区| 欧美日精品一区视频| 99精品欧美| 亚洲成人在线网站| 久久精品91久久久久久再现| 久久国产手机看片| 久久久蜜桃精品| 久久精品视频免费| 久久久久久久久久久成人| 欧美伊久线香蕉线新在线| 久久er精品视频| 欧美国产第一页| 亚洲一区二区三区久久| 久久国产精品久久国产精品 | 鲁大师成人一区二区三区| 久热精品视频在线免费观看| 欧美成人国产一区二区| 欧美区在线播放| 国产日韩欧美三区| 在线电影一区| 一区二区三区四区精品| 欧美一区二区成人6969| 久久综合中文| 99天天综合性| 欧美综合国产精品久久丁香| 欧美激情精品久久久久久大尺度 | 亚洲视频成人| 久久性天堂网| 久久精品国产视频| 久久电影一区| 欧美国产日本| 亚洲一区影音先锋| 麻豆精品在线视频| 国产视频在线观看一区二区| 狠狠噜噜久久| 午夜在线观看欧美| 亚洲国产一区二区三区高清| aa成人免费视频| 国产日韩欧美精品一区| 亚洲视频成人| 亚洲毛片视频| 午夜国产精品视频| 另类天堂视频在线观看| 欧美日韩高清区| 亚洲精品一区二区三区99| 久久伊伊香蕉| 亚洲欧美日韩一区二区三区在线观看 | 欧美国产视频在线| 老牛影视一区二区三区| 久久久另类综合| 国产精品久久九九| 欧美福利视频一区| 国产视频自拍一区| 午夜欧美大片免费观看| 亚洲国产成人久久综合| 亚洲免费视频在线观看| 国产精品久久久久久久免费软件 | 国产精品免费网站在线观看| 91久久在线观看| 男女精品网站| 免费视频亚洲| 亚洲理论在线| 日韩视频免费看| 国产精品久久久久影院色老大 | 亚洲专区在线| 国产日韩成人精品| 久久久精品日韩欧美| 欧美影院久久久| 亚洲第一黄网| 亚洲国产美女久久久久| 欧美日韩一区不卡| 亚洲欧美一区二区原创| 午夜天堂精品久久久久| 激情成人综合| 亚洲国产精品va在看黑人| 欧美精品亚洲二区| 亚洲永久免费精品| 亚洲欧美www| 狠狠综合久久av一区二区小说 | 亚洲第一页中文字幕| 欧美一区二区三区在| 在线看日韩欧美| 亚洲人体影院| 国产精品初高中精品久久| 欧美一区二区三区另类| 亚洲一区二区三区在线| 国产精品videosex极品| 午夜精品亚洲| 欧美一区成人| 国产精品日韩在线| 欧美女主播在线| 狠狠88综合久久久久综合网| 西西裸体人体做爰大胆久久久| 亚洲国产天堂久久综合网| 国产精品va在线播放我和闺蜜| 亚洲国产欧美日韩精品| 亚洲一区二区精品视频| 欧美视频一区二区三区| 麻豆精品在线观看| 久久精品一本| 亚洲欧美日韩第一区| 亚洲一区bb| 亚洲精品1区2区| 亚洲激情国产| 黄色一区二区在线| 欧美成人精品在线| 亚洲人成7777| 午夜电影亚洲| 欧美性大战久久久久久久| 夜色激情一区二区| 亚洲黄一区二区| 亚洲欧美日韩国产精品| 国产精品久久久久久久久搜平片 | 一区二区三区色| 亚洲欧美制服中文字幕| 欧美精品www| 亚洲国产精品一区| 免费毛片一区二区三区久久久| 久久精品人人爽| 欧美激情一区二区三区 | 亚洲欧美精品在线观看| 久久久国产亚洲精品| 91久久中文| 欧美日韩亚洲三区| 亚洲视频在线观看免费| 久久久久久9| 午夜精品一区二区三区四区| 黄色另类av| 蜜臀久久久99精品久久久久久| 欧美承认网站| 亚洲国产欧美日韩另类综合| 亚洲午夜精品福利| 欧美激情精品久久久久久大尺度 | 亚洲小视频在线观看| 一区二区三区四区在线| 国产精品黄页免费高清在线观看| 久久久久一区二区三区四区| 亚洲一区日韩| 欧美在线视频观看| 久久精品国产99国产精品| 久久综合五月| 久久精品成人欧美大片古装| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美福利电影网| 99re6这里只有精品| 欧美成人免费一级人片100| 18成人免费观看视频| 久久久久一区| 亚洲欧洲一区二区在线播放| 亚洲国产精品ⅴa在线观看| 日韩一二在线观看| 久久精品国产99精品国产亚洲性色| 欧美国产日韩视频| 韩国精品主播一区二区在线观看| 狂野欧美激情性xxxx欧美| 伊人久久亚洲影院| 久久精品夜夜夜夜久久| 噜噜噜91成人网| 亚洲性人人天天夜夜摸| 久久米奇亚洲| 久久久综合视频| 亚洲国产一二三| 国产精品呻吟| 久久五月天婷婷| 亚洲国内精品| 国产精品久久久久久妇女6080 | 乱人伦精品视频在线观看| 亚洲欧美日韩系列| 伊人久久亚洲影院| 久久精品123| 一本大道久久a久久精二百| 夜夜爽www精品| 国模精品一区二区三区色天香| 亚洲欧美韩国| 亚洲激情小视频| 亚洲欧洲一区二区在线播放| 国产精品乱码一区二三区小蝌蚪| 中国成人黄色视屏| 欧美激情成人在线视频| 亚洲人午夜精品| 韩国精品一区二区三区| 久久久久高清| 午夜日本精品| 看片网站欧美日韩| 欧美一区二区三区四区视频| 国产精品免费观看视频| 久久精品欧美日韩| 欧美激情在线狂野欧美精品| 噜噜噜在线观看免费视频日韩| 久久国产精品一区二区三区四区| 亚洲电影在线看| 亚洲理论在线| 亚洲一区二区免费在线| 欧美在线关看| 在线午夜精品自拍| 一级日韩一区在线观看| 精品电影一区| 欧美影院一区| 欧美在线视频观看免费网站|