Ještě lepší Grid

Jak by se vám líbil Grid, který by toho umožňoval víc než normální Grid? Co kdyby vypadal třeba tak jako na obrázku

a uměl: Tohle vše umí MS Hierarchical FlexGrid, který je obsažen ve Visual Studiu 6.0. Nejprve bych vás ale chtěl předem varovat, co MSHFlexGrid neumí: Ukažme si co nejjednodušší postup pro vytvoření formuláře s tímto MSHFlexGridem :
CLOSE TABLES ALL
USE _samples+"data\orders" ORDER cust_id IN 0
USE _samples+"data\orditems" ORDER order_id IN 0
CLOSE TABLES ALL
WITH THIS
 .CLEAR
 * Zadáme hlavičku : všimněte si, že "Firma" a "Kč" se zadávají 2×!
 .ADDITEM(""+CHR(9)+'Firma'+CHR(9)+'Zboží'+CHR(9)+'Množství'+CHR(9)+'Kč',0)
 .ADDITEM(""+CHR(9)+'Firma'+CHR(9)+'Objednávka'+CHR(9)+'Datum'+CHR(9)+'Kč',0)
 i = 1
 SELECT orders
 * Vybereme všechny velké objednávky
 SCAN FOR order_amt > $6000
      i = i+1
      * Generujeme řádky za objednávky
      .ADDITEM("(+)"+CHR(9)+to_name+CHR(9)+"Obj. "+TRAN(order_id)+CHR(9)+;
                TRAN(order_date)+CHR(9)+ALLTRIM(STR(order_net,10,2)),i)
      .ROW = i
      .COL = 0
      .CellBackColor =RGB(197,243,245)
      SELECT orditems
      SCAN FOR order_id+STR(line_no,5,0)= orders.order_id
           i = i+1
           * Generujeme detailní řádky za položky objednávek
           .ADDITEM(""+CHR(9)+TRAN(orders.to_name)+CHR(9)+"  Zboží "+;
               ALLTRIM(TRAN(product_id))+CHR(9)+TRAN(quantity)+ ;
               CHR(9)+ALLTRIM(STR(unit_price,10,2)),i)
           .ROW = i
           * druhý sloupec položky odlišíme barvou a nastavíme zarovnání zprava
           .COL = 2
           .CellAlignment = 7
           .CellBackColor = RGB(127,127,127)
           * a tyto detailí řádky ihned schováme !!!
      .ROWHEIGHT(i) = 0
      ENDSCAN
      SELECT orders
 ENDSCAN
 * Nastavíme spojování buněk
 .MergeCells  = 3
 .MergeCol(0) = .T.
 .MergeCol(1) = .T.
 .MergeCol(4) = .T.
 * Nastavíme pevné řádky a sloupce
 .FixedRows = 2
 .FixedCols = 2
 * Nastavíme šířku sloupců
 .ColWidth(0) =  350
 .ColWidth(1) = 3500
 .ColWidth(2) = 1500
 .ColWidth(3) = 1500
 .ColWidth(4) = 1500
 * Dovolíme měnit šířku sloupců
 .AllowUserResizing = 3
ENDWITH
LOCAL lnRows, llExpand
WITH THIS
* Zjistíme, na jakém řádku jsme
lnRows = .mouserow
* Ignorujeme hlavičku
IF lnRows < 2
     RETURN
ENDIF
* Hledáme objednávku: vracíme se nahoru tak dlouho, pokud jsme na položce
DO WHILE lnRows > 0.AND.EMPTY(.textarray(lnRows * .cols))
     lnRows=lnRows-1
ENDDO
* Rozhodneme se podle +/-
llExpand = (.textarray(lnRows*.cols) = '(+)')
.textarray(lnRows * .cols) = IIF(llExpand, '(-)', '(+)')
* Zobrazíme/schováme příslušné položky
lnRows = lnRows + 1
DO WHILE EMPTY(.textarray(lnRows * .cols))
     .ROWHEIGHT(lnRows) = IIF(llExpand, -1, 0)
     lnRows = lnRows + 1
     IF lnRows >= .ROWS
          EXIT
     ENDIF
ENDDO
ENDWITH

A to je vše. Mějte se krásně
Milan Kosina, kosina@vol.cz