- è¡-åãŸãã¯è¡ã®ã»ãããè¡šããŸãã
- ç¯å²-ã»ã«ã®ã³ã¬ã¯ã·ã§ã³ãèšè¿°ããŸãã
- ã¬ã€ã¢ãŠã-ã»ã«å ã«ããŒã¿ãé 眮ã§ããŸãã
- ã¢ãã«-ãã¥ãŒãšã³ã³ãããŒã©ãŒã®ããŒã¿ã¢ã¯ã»ã¹ã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããŸãã
- 衚瀺-ã»ã«å ã®æ å ±ã衚瀺ããŸãã
- ã³ã³ãããŒã©ãŒ-ãŠãŒã¶ãŒã¯ããŒã¿ãå€æŽã§ããŸãã
- CacheCell-衚瀺ãããŠããã»ã«ã®ããŒã¿ããã£ãã·ã¥ããŸãã
- CacheGrid-ã°ãªããã®è¡šç€ºéšåã®ããŒã¿ããã£ãã·ã¥ããŸãã
- GridWindow-ç¹å¥ãªã³ã³ãããŒã«ã
ãŸããããã¹ãããŒã¿ïŒModelTextãModelTextCallbackãViewTextïŒã®ã¢ãã«ãšãã¥ãŒã«ã€ããŠã説æããŸããã ã°ãªãããäœæããŠãããã¹ãããŒã¿ããã€ã³ãããŠã¿ãŸãããã æšæºã°ãªãããç¹å¥ãªã¢ãã«/ãã¥ãŒ/ã³ã³ãããŒã©ãŒã®åœ¢åŒã§åäœããããã«å¿ èŠãªæ°ããæ©èœãè¿œå ããŸãã
ç°¡æœã«ããããã«ãã³ãŒãå ã®ãã€ã³ã¿ãŒãshared_ptrãªã©ã¯çç¥ããŸãã ããè¡ãã...
int main() { Application app; // GridWindow grid_window("Demo"); // ModelTextCallback m; m.getCallback = [](CellID cell)->String { return String.Format("Item[%d, %d]", cell.row, cell.column); }; // , grid_window.AddData(RangeAll(), ViewText(m), LayoutAll()); // grid_window.SetRows(10); grid_window.SetColumns(10); // grid_window.Show(100, 100, 300, 300); app.run(); }
æªãã¯ãããŸããããã»ã«ãäœãšãåé¢ãããã ãã§ãïŒã¹ã«ãŒã¹ããªãããŸãã¯ã¡ãã·ã¥ã®ãããããæç»ããŸãã 1ã€å®è£ ããŠãããå¥ã®ãªãã·ã§ã³ãå®è£ ããŸãããã ã³ãŒããããèªäœãç©èªã£ãŠãããšæããŸãã
class ViewOddRowBackground: public View { public: void Draw(DrawContext& dc, Rect rect, CellID cell) const override { // , if (cell.row%2 == 0) dc.FillRect(rect, ColorRGB(200, 200, 255)); } }; void plugOddRowBackgroud(Grid& grid) { grid.AddData(RangeAll(), ViewOddRowBackground(), LayoutAll(Transparent)); }
Transparentãã©ã¡ãŒã¿ãŒãLayoutAllã«æž¡ããããšã«æ³šæããŠãã ããããã®ã¬ã€ã¢ãŠãã¯ã»ã«ã®åè§åœ¢ãå€æŽããŸããã ããã©ã«ãã§ã¯ãLayoutAllã¯ã»ã«ã®ç©ºãé åå
šäœããããã¯ã¢ãããããŠãŒãã«ããŸãã ééã¢ãŒãã§ã¯ãããã¯è¡ãããã次ã®ViewTextã¯åãå
ã®é·æ¹åœ¢ãååŸããŸãã
mainã«æ°ããé¢æ°åŒã³åºããè¿œå ããŸã
GridWindow grid_window("Demo"); plugOddRowBackgroud(grid_window.GetGrid());
次ã«ãã°ãªãããå®è£ ããŸãã
class ViewCellBounds: public View { public: void Draw(DrawContext& dc, Rect rect, CellID cell) const override { // dc.Line(rect.BottomLeft(), rect.BottomRight()); // dc.Line(rect.TopRight(), rect.BottomRight()); } }; void plugCellBounds(Grid& grid) { grid.AddData(RangeAll(), ViewCellBounds(), LayoutAll(Transparent)); } ... GridWindow grid_window("Demo"); plugCellBounds(grid_window.GetGrid());
ãã¹ãŠã®ã°ãªããã®æ¬¡ã®å ±éã®å Žæã¯ãéžæãããã»ã«ã®æŠå¿µ-éžæã§ãã 以åã®ãã¥ãŒã¯ããŒã¿ãä¿åããªãã£ãããããããã®ã¢ãã«ãäœæããŸããã§ããã ããã§ã¯ãç¶æ³ã¯ããå°ãè€éã§ãã ModelSelectionã«ã¯äœãå«ããå¿ èŠããããŸããïŒ ãŸããéžæãããã»ã«ã®ã»ããã次ã«ã¢ã¯ãã£ããªã»ã«ã®åº§æšïŒããã¯éåžžããã¬ãŒã ã§åŒ·èª¿è¡šç€ºãããŠããã»ã«ã§ãããããŒããŒãã䜿çšããŠãã®ã»ã«ãæäœããŸãïŒã ã³ãŒããæžããŸãïŒ
class ModelSelection: public Model { public: Range GetSelectedRange() const { return m_selected_range; } void SetSelectedRange(Range new_selected_range) { m_selected_range = new_selected_range; changed.invoke(*this); } CellID GetActiveCell() const { return m_active_cell; } void SetActiveCell(CellID new_active_cell) { m_active_cell = new_active_cell; changed.invoke(*this); } private: Range m_selected_range; CellID m_active_cell; }; class ViewSelection: public View { public: ViewSelection(ModelSelection selection) : m_selection(selection) {} void Draw(DrawContext& dc, Rect rect, CellID cell) const override { // -> if (m_selection.GetActiveCell() == cell) dc.DrawFrame(rect); // -> // if (m_selection.GetSelectedRange().HasCell(cell)) { dc.FillRect(rect, ColorSelectedBackground); dc.SetTextColor(ColorSelectedText); } } private: ModelSelection m_selection; }; ModelSelection plugSelection(Grid& grid) { ModelSelection selection; grid.AddData(RangeAll(), ViewSelection(selection), LayoutAll(Transparent)); return selection; } ... GridWindow grid_window("Demo"); plugCellBounds(grid_window.GetGrid()); plugSelection(grid_window.GetGrid());
ã³ã³ãããŒã©ãŒã®å®è£ ãçããŠã¹ããŒã¹ãç¯çŽããŸãã ç§ãä¿¡ããŠããã¹ãŠãããã§ãç°¡åã§ãïŒããŠã¹ã®å·Šãã¿ã³ãæŒãããšã«ãããã¢ã¯ãã£ããªã»ã«ãããŠã¹ã®äžã®ã»ã«ã«å€æŽããŸãã ããŠã¹ã移åããŠå·ŠããŒãé¢ããšãã¢ã¯ãã£ããªãã¿ã³ïŒãã¿ã³ãæŒããå ŽæïŒããçŸåšã®ã»ã«ãŸã§ã®ã»ã«ã®é·æ¹åœ¢ãããã¯ãè¡šãç¹å¥ãªRangeãäœæããŸãã ãã®ç¯å²ãéžæã«èšå®ããŸãã ShiftããŒãšCtrlããŒã®ç¶æ ãèæ ®ããå¿ èŠããããŸããããããã¯è©³çŽ°ã§ãã ãã®çµæã次ã®å³ãåŸãããŸãã
ãŠãŒã¶ãŒãè¡ãšåã®ãµã€ãºãå€æŽã§ããããã«ããã«ã¯ãã»ã«ã®ç«¯è¿ãã§ããŠã¹ãã¿ã³ãæŒãããšã§ããŠã¹ã®äœçœ®ãèšæ¶ããããŠã¹ãæŒããšåå¹ ãæåã®æ£ç¢ºãªå€ãšçŸåšã®å€ã®å·®ã«å€æŽããç¹å¥ãªã³ã³ãããŒã©ãŒãå®è£ ããå¿ èŠããããŸãã ã¢ã€ãã¢ãæ確ã§ããããšãé¡ã£ãŠããŸãã ã³ã³ãããŒã©ãŒããã¥ãŒå ã§ãã©ã€ããã§ããããšã«æ³šæããŠãã ããããããã£ãŠãäœãæç»ãããã³ã³ãããŒã©ãŒãã¢ã¯ãã£ãã«ããé·æ¹åœ¢ãå®çŸ©ããã ãã®æ¶ç©ºã®ãã¥ãŒãäœæããå¿ èŠããããŸãã
å€ãã®å Žåãã°ãªããã«ã¯ã¿ã€ãã«ããããŸããããã¯ãåžžã«ãŠã£ã³ããŠã®äžéšã«æ®ãã°ãªããã®äžéšã§ãã å·ŠåŽã«ãåæ§ã®æ§é ãããå ŽåããããŸãïŒéåžžãããã«è¡çªå·ãèšè¿°ããŸãïŒã ã¹ã¯ããŒã«ãããšããããã®é åã¯ãã®ãŸãŸæ®ããŸãã ã¿ã€ãã«ãã©ã®ããã«èŠããããèŠãŠã¿ãŸãããã
å ã®ã°ãªãããšåãè¡æ°ãšåæ°ã§æ§æãããã°ãªããã«éåžžã«äŒŒãŠããŸãã 次ã«ãããããŒã¯ã°ãªããã§ããããã®åã¯å ã®ã°ãªããã®åãšåæããŠãããšèšããŸãïŒå®éã2ã€ã®ã°ãªããã¯åã«Linesã®åãã³ããŒã䜿çšããŸãïŒã ãã®ã°ãªããã¯ãŠã£ã³ããŠã®äžéšã«ãããæ°Žå¹³æ¹åã«ã®ã¿ã¹ã¯ããŒã«ããŸãã å·ŠåŽã®åºå®éšåã«ã€ããŠãåæ§ã®å£°æãçºããããšãã§ããŸãããããã§ã¯è¡ãåæãããŸãã ãããã£ãŠãGridWindowã¯ã©ã¹ã§ã¯ã1ã€ã§ã¯ãªã4ã€ã®CacheGridãã©ã€ãã«ãªããŸãã
ããã«é²ãã§ãåºå®é åã¯ã©ã®åŽã«ã§ãããããšãã§ãããšèšããŸãããã
ãã®ãããGridWindowã¯ã©ã¹ã¯ããè€éã«ãªããŸããã1ã€ã®CacheGridã§ã¯ãªãã9ã€ã®CacheGridããããŸãã ã¬ã³ããªã³ã°ãã¹ã¯ããŒã«ãããŠã¹ã€ãã³ãã®åŠçã®æ©èœãè€éã«ãªããŸãã ããã§ãæåŸã®å³é¢ãåæ¢ããŠæ éã«æ€èšããããšããå§ãããŸãã é ãããã¯ã3è¡3åã®9ã€ã®ãµããšãªã¢ã«åå²ããããšãªã¢ã®ããã«èŠããŸãã ããã¯ã3ã€ã®è¡ãšåãæã€ã°ãªããã®ããã«èŠãããã®ã»ã«ã«ã¯ä»ã®ã°ãªããã衚瀺ãããŸãã å®çŸ©äžãViewã¯éåžžã«æ®éçã§ãããããä»»æã®ãšã³ãã£ãã£ã衚瀺ã§ããŸãã ããã§ã¯ãã»ã«ã«ã°ãªããã衚瀺ãããã¥ãŒãäœæããŸãããã 9ã€ã®ã°ãªããã䜿çšããå Žåããããã次ã®ã¯ã©ã¹ãååŸããŸãã
class ModelGrid: public Model { public: ModelGrid(); CacheGrid GetGrid(CellID cell) const { return m_grids[cell.row][cell.column]; } private: CacheGrid m_grids[3][3]; }; class ViewGrid: public View { public: ViewGrid(ModelGrid model) :m_model(model) {} void Draw(DrawContext& dc, Rect rect, CellID cell) const override { CacheGrid cacheGrid = m_model.GetGrid(cell); cacheGrid.Draw(dc); } };
9ã€ã®CacheGridãªããžã§ã¯ããModelGridã³ã³ã¹ãã©ã¯ã¿ãŒã§äœæãããè¡ãšåãåæãããŸãã ã³ã³ãããŒã©ãå®è£
ããããšãé£ãããããŸããã CacheGridãªããžã§ã¯ãã1ã€ãããªãå€ãGridWindowã¯ã©ã¹ã«ViewGridãè¿œå ããå Žåãæ°ããGridWindowã¿ã€ããäœæããå¿
èŠã¯ãããŸããã å¯äžã®éãã¯ãã¹ã¯ããŒã«ããŒã®äœçœ®ããµãã°ãªããã«è»¢éããå¿
èŠãããããšã§ãïŒã¹ã¯ããŒã«ããŒã®äœçœ®ãç¡èŠãããšãã³ãŒããŒã°ãªããïŒäž/å·Šãäž/å³ããã¿ã³/å³ãäž/å·ŠïŒãäžãšäžã®ã°ãªãããæ°Žå¹³ã«ã¹ã¯ããŒã«ãåçŽ-å·Šå³ã ããŠãäžå€®ã®ã¯ã©ã€ã¢ã³ãã°ãªããã¯ãã¹ãŠã®é¢ã§ã¹ã¯ããŒã«ãããŸãã ãã®å Žåãã¬ã³ããªã³ã°ãšããŠã¹ãšã®å¯Ÿè©±ã®ã³ãŒãã¯åããŸãŸã§ãã
ããã§ããäžåºŠç«ã¡æ¢ãŸã£ãŠãã©ã®ãããªæäœãè¡ã£ãã®ãã確èªããŸããïŒ åãã«ãã¹ããŒãã¡ã³ãããããŸãã-ã°ãªããã¯ã»ã«ã®ã»ããã§ãããã»ã«ã¯äœãã衚瀺ãããå Žæã§ãã ããã§ãã»ã«ãã°ãªãããå«ããã¹ãŠã衚瀺ã§ããããšãããããŸããã ãã§ãŒã³ã¯éããŠããŸã-ã°ãªããã¯ã»ã«ãæç»ããã»ã«ã¯ã°ãªãããæç»ããŸãã ããã¯ãé¶ãšåµã®å²åŠçåé¡ãæèµ·ããŸãã ãã©ã€ããªãšã¯äœã§ããïŒ ã»ã«ã§æ§æãããã°ãªããããŸãã¯ã°ãªãããå«ããããããã®ãè¡šãããšãã§ããã»ã«ã ã»ã«ã®æŠå¿µã¯ããæ®éçã§ããããã§ãã æåã®èšäºã®CellCacheã¯ã©ã¹ãèŠããŠãããŠãã ãã-æåã«ããªãã«<RangeãViewãLayout>ãRangeã«ãã£ãŠãã£ã«ã¿ãŒãããŸãããã€ãŸããå®éã«ã¯ã»ã«ã¯ããªãã«ãä¿åããã¹ãã§ã¯ãããŸãããã<ViewãLayout> deuces-ã»ã«ã®å 容ãšå Žæã説æããŸãæç»ããŸãã CellCacheã¯ããŠã¹ã€ãã³ããæç»ããã³åŠçïŒç®çã®ã³ã³ãããŒã©ãŒã«æž¡ãïŒã§ããŸãããã°ãªããã¯ã©ãã«ãèšåãããŠããŸããã
ããããCacheGridã§ã¯ãªãCacheCellãæç»ãããŠã£ã³ããŠã¯ã©ã¹ãäœæãããšã©ããªããŸããïŒ æ¬¡ã«ãã°ãªãããŠã£ã³ããŠã¯ã©ã¹ã§ã¯ãªããããæ®éçãªã³ã³ãããŒã«ãååŸããŸãã2ã€ã®<ViewãLayout>ã®åœ¢åŒã§ãäœã«ãã©ãã«æç»ããããèšå®ããŸãã ããšãã°ã{<ViewCheckãLayoutLeft>ã<ViewTextãLayoutAll>}ã®çµã¿åããã¯ããã§ãã¯ããã¯ã¹ã³ã³ãããŒã«ã®æšæºã³ã³ãããŒã«ãæäŸããŸãã ä»ã®çµã¿åããã¯ä»ã®ã¿ã€ãã®ã³ã³ãããŒã«ãæäŸããç°ãªãã¬ã€ã¢ãŠãã¯ä»»æã®æ§æã§ãã¥ãŒãé 眮ããæ©èœãæäŸããŸãã ããšãã°ãããã¹ãã®å³ãäžãäžãªã©ã®ãã§ãã¯ããã¯ã¹ã
ãã®ãŠã£ã³ããŠãItemWindowãšåŒã³ãŸãããïŒã»ã«ã¯ã°ãªããã«å¯æ¥ã«é¢é£ããæŠå¿µã§ãããã¢ã€ãã ã¯ããäžç«ã§ãïŒã ç§ã¯3ã€ã®ã¯ã©ã¹ã®éå±€ãåŸãŸããïŒ
- ItemWindow-ãŠãããŒãµã«ã³ã³ãããŒã«ãCacheCellã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãå«ãŸããŸãã å®éããŠã£ã³ããŠå šäœã¯åäžã®ã»ã«ã§ãã
- ListWindowã¯ItemWindowã®åå«ã§ãã CacheCellã¯ViewGridãã€ã³ã¹ã¿ã³ã¹ã«è¿œå ããã»ã«ã«åäžã®ã°ãªãããæç»ããŸãã ãã®ãªãã·ã§ã³ã¯ãåºå®é åïŒã¿ã€ãã«ãªã©ïŒã®ãªãåçŽãªãªã¹ãã«é©ããŠããŸã
- GridWindowã¯ListWindowã®åå«ã§ãã ListWindowã§3ã€ã®è¡ãšåãæã€ã°ãªããã宣èšããŸãã ãã®ã°ãªããã§å¥ã®ViewGridãå®çŸ©ãã9ã€ã®ãµãã°ãªãããæç»ããŸãã ããã¯ãèŠåºããå¿ èŠãªäººã®ããã®ã³ã³ãããŒã«ã§ãã
ååãšããŠãããžã¥ã¢ã«ã³ã³ããŒãã³ãã®ã©ã€ãã©ãªãéçºããå Žåãæåã«åçŽãªã¿ã€ãã®ãŠã£ã³ããŠã決å®ãã次ã«ããè€éãªãŠã£ã³ããŠïŒã¢ã€ãã ããŒã¹ïŒã«é²ã¿ãŸãã ãã®æç¹ã§ããŠã£ã³ããŠã®åºæ¬æŠå¿µã¯æ¢ã«ä¿®æ£ãããŠãããã¢ã€ãã ããŒã¹ã®ãŠã£ã³ããŠã®è©³çŽ°ã¯èæ ®ãããŠããŸããã ãã®ããããŠã£ã³ããŠã®åºæ¬æŠå¿µãšã¯ãŸã£ããé¢ä¿ã®ãªãä»ã®æœè±¡åãããã€ãèãåºããŸãã ãã®çµæãåçŽãªã³ã³ãããŒã«ãšè€éãªã³ã³ãããŒã«ãææ©çã«äžç·ã«äœ¿çšããããšã¯ã§ããŸããã è€éãªã³ã³ãããŒã«ããæãåºããã·ã³ãã«ãªãŠã£ã³ããŠã«ãªããŸããã ãããããããã®æ§é ã¯ãåŸæ¥ã®ãŠã£ã³ããŠãã¬ãŒã ã¯ãŒã¯ãããå°ãè€éã§ãã ããããæ®éæ§ãåŸãããŸã-ãã¥ãŒãšã¬ã€ã¢ãŠãã¯ãåçŽãªã³ã³ãããŒã«ïŒItemWindowïŒãšããè€éãªã³ã³ãããŒã«ã®äž¡æ¹ã§äœ¿çšãããŸãã ViewCheckãå®è£ ãããšãåçŽãªã³ã³ãããŒã«ãšããŠããŸãã°ãªããã®ãµãèŠçŽ ãšããŠäœ¿çšã§ããããã«ãªããŸãã
èšäºã¯éåžžã«é·ãè€éã§ããããšãå€æãããããä»ã®ãšããã¯çµäºããŸãã ããªãã«ãšã£ãŠäœããç解ã§ããªããééã£ãŠãããšæãããå Žåã¯ãã³ã¡ã³ããæžããŠãã ãããç§ã¯èšäºãç·šéããŸãã ãããã£ãŠããã®èšäºã¯èª°ã«ãšã£ãŠãç°¡åã§æ確ã«ãªããŸãã
次ã®èšäºã§ã¯ããŠã£ã³ããŠã®ã€ã³ããã¹ãã¯ã·ã§ã³ãè¡ãæ¹æ³ã«ã€ããŠèª¬æããŸãã ãŠã£ã³ããŠã«ã¡ãã»ãŒãžãéä¿¡ãããã€ãã·ãŒã±ã³ã¹ã解éã§ããããŒã«ã¯ãã°ãªãããšãéä¿¡ãã§ããŸãã ããã«ãããPythonã§ã°ãªããã«ãã€ã³ãããã³ã³ãããŒã«ã®èªåãã¹ããå®è¡ã§ããŸãã ãŸããdevexpressã®ããããçš®é¡ã®ããããããã®ããç§ã®ã¹ããŒã ã§ã©ã®ããã«å®è£ ãããŠãããã説æããŸãã å ã»ã©èšã£ãããã«ããã®ã¢ãŒããã¯ãã£ã®å®éã®ãããã¿ã€ãã¯ãã§ã«ååšããŠããããããªãŒãã³ãœãŒã¹ã§å®è£ ããããšã¯é£ãããããŸããã