home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ctcoll95.zip / UNIVERSE / CONTAINE.CPP next >
C/C++ Source or Header  |  1995-03-09  |  18KB  |  463 lines

  1.  
  2. #include <containe.h>
  3.  
  4. // KLEINES HELFERLEIN...
  5. TContainer *pICNR;
  6.  
  7. DEFINE_RESPONSE_TABLE1 (TContainer,TControl)
  8.   EV_WM_HSCROLL,
  9.   EV_WM_VSCROLL,
  10. END_RESPONSE_TABLE;
  11.  
  12.  
  13. void TContainer::EvHScroll (UINT scrollCode, UINT thumbPos, HWND hWndCtl)
  14. {
  15.   EvCommand (GetId(),hWndCtl,MAKELONG(thumbPos,scrollCode));
  16. }
  17.  
  18. void TContainer::EvVScroll (UINT scrollCode, UINT thumbPos, HWND hWndCtl)
  19. {
  20.   EvCommand (GetId(),hWndCtl,MAKELONG(thumbPos,scrollCode));
  21. }
  22.  
  23. static BOOL CALLBACK pfnFilterRecord (RECORDCNR *pRC, void *pStorage)
  24. {
  25.   return (pICNR->FilterRecord(pRC,pStorage));
  26. }
  27.  
  28. BOOL TContainer::Filter (void *pStorage)
  29. {
  30.   pICNR = this;
  31.   return (BOOL)WinSendMsg(HWindow,CM_FILTER,pfnFilterRecord,pStorage);
  32. }
  33.  
  34. SHORT TContainer::CompareRecord (RECORDCNR *pRC1, RECORDCNR *pRC2, void *pStorage)
  35. {
  36.   return (strcmp(pRC1->RecordCore.pszText,pRC2->RecordCore.pszText) * GetSortMode());
  37. }
  38.  
  39. static SHORT CALLBACK pfnCompareRecord (RECORDCNR *pRC1, RECORDCNR *pRC2, void *pStorage)
  40. {
  41.   return (pICNR->CompareRecord(pRC1,pRC2,pStorage));
  42. }
  43.  
  44. BOOL TContainer::Sort (void *pStorage)
  45. {
  46.   pICNR = this;
  47.   return (BOOL)WinSendMsg (HWindow,CM_SORTRECORD,pfnCompareRecord,pStorage);
  48. }
  49.  
  50. BOOL TContainer::CloseEdit()
  51. {
  52.   return (BOOL)WinSendMsg (HWindow,CM_CLOSEEDIT,NULL,NULL);
  53. }
  54.  
  55. BOOL TContainer::OpenEdit (RECORDCNR *pRC, FIELDINFO *pFI)
  56. {
  57.   CNREDITDATA   CED;
  58.  
  59.  // SETUP CNREDITDATA STRUCTURE
  60.   CED.cb = sizeof(CNREDITDATA);         // struktur-größe
  61.   CED.hwndCnr = HWindow;                // fenster-handle
  62.   CED.pRecord = (RECORDCORE *)pRC;      // recordcore
  63.   CED.pFieldInfo = pFI;                 // fieldinfo
  64.   CED.ppszText = NULL;                  // immer NULL bei CM_OPENEDIT
  65.   CED.cbText = 0;                       // immer 0 bei CM_OPENEDIT
  66.   CED.id = GetId();                     // ID, spez. Bereiche nicht unterstützt (READONLY !)
  67.  // OPEN EDIT
  68.   return (BOOL)WinSendMsg (HWindow,CM_OPENEDIT,&CED,NULL);
  69. }
  70.  
  71. void TContainer::SetReadOnly (BOOL fRO)
  72. {
  73.   SetStyle (ClearStyle(CCS_READONLY) | (fRO ? CCS_READONLY : 0));
  74. }
  75.  
  76. void TContainer::SetAutoPosition (BOOL fAuto)
  77. {
  78.   SetStyle (ClearStyle(CCS_AUTOPOSITION) | (fAuto ? CCS_AUTOPOSITION : 0));
  79. }
  80.  
  81. void TContainer::SetPointerVerification (BOOL fVerify)
  82. {
  83.   SetStyle (ClearStyle(CCS_VERIFYPOINTERS) | (fVerify ? CCS_VERIFYPOINTERS : 0));
  84. }
  85.  
  86. void TContainer::SetSingleSelection ()
  87. {
  88.   SetStyle (ClearStyle(CCS_SINGLESEL | CCS_EXTENDSEL | CCS_MULTIPLESEL) | CCS_SINGLESEL);
  89. }
  90.  
  91. void TContainer::SetExtendedSelection ()
  92. {
  93.   SetStyle (ClearStyle(CCS_SINGLESEL | CCS_EXTENDSEL | CCS_MULTIPLESEL) | CCS_EXTENDSEL);
  94. }
  95.  
  96. void TContainer::SetMultipleSelection ()
  97. {
  98.   SetStyle (ClearStyle(CCS_SINGLESEL | CCS_EXTENDSEL | CCS_MULTIPLESEL) | CCS_MULTIPLESEL);
  99. }
  100.  
  101. ULONG TContainer::SetEmphasis (RECORDCNR *pRC, BOOL fChange, BOOL fSelected,
  102.                                BOOL fCursored, BOOL fInUse)
  103. {
  104.   USHORT usAttr;
  105.  
  106.   if (pRC == NULL) return(-1);
  107.   usAttr = (fSelected ? CRA_SELECTED : 0) | (fCursored ? CRA_CURSORED : 0) |
  108.            (fInUse ? CRA_INUSE : 0);
  109.   return (ULONG)WinSendMsg (HWindow,CM_SETRECORDEMPHASIS,pRC,MPFROM2SHORT(fChange,usAttr));
  110. }
  111.  
  112. RECORDCNR *TContainer::GetEmphasis (RECORDCNR *pRC, BOOL fSelected, BOOL fCursored, BOOL fInUse)
  113. {
  114.   USHORT usAttr;
  115.  
  116.   if (pRC == NULL) pRC = (RECORDCNR *)CMA_FIRST;
  117.   usAttr = (fSelected ? CRA_SELECTED : 0) | (fCursored ? CRA_CURSORED : 0) |
  118.            (fInUse ? CRA_INUSE : 0);
  119.   return (RECORDCNR *)WinSendMsg (HWindow,CM_QUERYRECORDEMPHASIS,pRC,MPFROMSHORT(usAttr));
  120. }
  121.  
  122. RECORDCNR *TContainer::SearchRecord (PSZ pszText, RECORDCNR *pRC, BOOL fPrefix, BOOL fCase)
  123. {
  124.   SEARCHSTRING          SS;
  125.  
  126.   if (pRC == NULL) pRC = (RECORDCNR *)CMA_FIRST;      // begin search after "pRC"
  127.  // SETUP STRUCTURE
  128.   SS.cb = sizeof(SEARCHSTRING);                         // size of this structure
  129.   SS.pszSearch = pszText;                               // search text
  130.   SS.usView = CV_TEXT;                                  // don't care, all the same
  131.   SS.fsPrefix = (ULONG)fPrefix;                         // leading | substring
  132.   SS.fsCaseSensitive = (ULONG)fCase;                    // case | not case sensitive
  133.  // SEARCH
  134.   return (RECORDCNR *)WinSendMsg (HWindow,CM_SEARCHSTRING,&SS,pRC);
  135. }
  136.  
  137. ULONG TContainer::InsertRecord (RECORDCNR *pRClevel, RECORDCNR *pRCpred,
  138.                                 RECORDEXT *pRE, PSZ pszText,
  139.                                 TPoint *pIconPos,
  140.                                 TIcon *pStdIcon, TIcon *pMiniIcon,
  141.                                 BOOL fHide, BOOL fDrop, BOOL fReadOnly)
  142. {
  143.   ULONG    ul;
  144.  
  145.  // EINIGE HILFSVARIABLEN SETZEN
  146.   pLastRC = NULL; pICNR = this;
  147.  // ALLOC MEMORY FOR ONE RECORD, ADDITIONAL MEMORY !
  148.   ul = sizeof (RECORDEXT);
  149.   pLastRC = (RECORDCNR *)WinSendMsg (HWindow,CM_ALLOCRECORD,MPFROMLONG(ul),MPFROMSHORT(1));
  150.   if (pLastRC == NULL) return (-1);
  151.  // SETUP RECORDCNR STRUCTURE
  152.   ul = (fHide ? CRA_FILTERED : 0);                                  // nicht anzeigen
  153.   ul |= (fDrop ? CRA_DROPONABLE : 0);                               // direkt manipulierbar
  154.   ul |= (fReadOnly ? CRA_RECORDREADONLY : 0);                       // nicht editierbar
  155.   pLastRC->RecordCore.cb = sizeof(RECORDCORE);                      // size of structure
  156.   pLastRC->RecordCore.flRecordAttr = ul;                            // attributes
  157.   pLastRC->RecordCore.preccNextRecord = NULL;                       // no next record
  158.   pLastRC->RecordCore.ptlIcon.x = pIconPos->x;                      // icon-view: x-pos
  159.   pLastRC->RecordCore.ptlIcon.y = pIconPos->y;                      // icon-view: y-pos
  160.   pLastRC->RecordCore.hptrIcon = (HPOINTER)HICON(*pStdIcon);        // standard icon-handle
  161.   pLastRC->RecordCore.hptrMiniIcon = (HPOINTER)HICON(*pMiniIcon);   // mini icon-handle
  162.   pLastRC->RecordCore.hbmBitmap = 0;                                // nicht unterstützt
  163.   pLastRC->RecordCore.hbmMiniBitmap = 0;                            // nicht unterstützt
  164.   pLastRC->RecordCore.pTreeItemDesc = NULL;                         // nicht unterstützt
  165.   pLastRC->RecordCore.pszText = pLastRC->RecordCore.pszIcon =              // gleicher text
  166.   pLastRC->RecordCore.pszName = pLastRC->RecordCore.pszTree = pszText;     // für alle views
  167.  // ERWEITERUNGS-RECORD FÜR DETAILS KOPIEREN
  168.   if (pRE) memmove (&pLastRC->RecordExt,pRE,sizeof(RECORDEXT));
  169.  // SETUP RECORDINSERT STRUCTURE
  170.   if (pRCpred == NULL) pRCpred = (RECORDCNR *)CMA_FIRST;        // 1ter record, kein vorgänger
  171.   RI.cb = sizeof(RECORDINSERT);                                 // struktur-größe
  172.   RI.pRecordOrder = (RECORDCORE *)pRCpred;                      // vorgänger-record
  173.   RI.pRecordParent = (RECORDCORE *)pRClevel;                    // ebene
  174.   RI.fInvalidateRecord = TRUE;                                  // auto. update display
  175.   RI.zOrder = CMA_TOP;                                          // at top of z-order
  176.   RI.cRecordsInsert = 1;                                        // 1 record einfügen
  177.  // INSERT RECORD
  178.   ul = (ULONG)WinSendMsg (HWindow,CM_INSERTRECORD,(PRECORDCORE)pLastRC,&RI);
  179.   if (ul == 0) return (-2);
  180.  // PASSED
  181.   return (0);
  182. }
  183.  
  184. LONG TContainer::RemoveRecord (RECORDCNR *pRC)
  185. {
  186.   USHORT usCnt = 1;
  187.  
  188.  // ALLE RECORDS LÖSCHEN
  189.   if (pRC == NULL) usCnt = 0;
  190.  // LÖSCHEN
  191.   return (LONG)WinSendMsg (HWindow,CM_REMOVERECORD,pRC,MPFROM2SHORT(usCnt,CMA_FREE | CMA_INVALIDATE));
  192. }
  193.  
  194. ULONG TContainer::InsertDetail (FIELDINFO *pFIpred, PSZ pszTitle,
  195.                                 ULONG ulOfs, char chType, ULONG ulColWidth,
  196.                                 char chAlignData, char chAlignTitle, BOOL fReadOnly)
  197. {
  198.   ULONG   ulFlagsData,ulFlagsTitle;
  199.   ULONG   ulAlignData,ulAlignTitle;
  200.   ULONG   ul;
  201.  
  202.  // EINIGE HILFSVARIABLEN SETZEN
  203.   pLastFI = NULL; pICNR = this;
  204.  // SPEICHER FÜR DETAIL-RECORD ANFORDERN
  205.   pLastFI = (FIELDINFO *)WinSendMsg (HWindow,CM_ALLOCDETAILFIELDINFO,MPFROMLONG(1),NULL);
  206.   if (pLastFI == NULL) return (-1);
  207.  // AUSRICHTUNGEN KLARMACHEN, TEXT & TITEL
  208.   ulAlignData = ulAlignTitle = CFA_CENTER;                              // zentriert
  209.   if (chAlignData == 'L') ulAlignData = CFA_LEFT;                       // linksbündig
  210.   if (chAlignData == 'R') ulAlignData = CFA_RIGHT;                      // rechtsbündig
  211.   if (chAlignTitle == 'L') ulAlignTitle = CFA_LEFT;                     // linksbündig
  212.   if (chAlignTitle == 'R') ulAlignTitle = CFA_RIGHT;                    // rechtsbündig
  213.  // FLAGS FÜR DIE DATEN IN DEN SPALTEN
  214.   ulFlagsData = CFA_VCENTER;                              // daten vertikal zentrieren
  215.   ulFlagsData |= CFA_SEPARATOR;                           // vertikale trennlinie
  216.   ulFlagsData |= CFA_HORZSEPARATOR;                       // trennlinie unter spaltentitel
  217.   ulFlagsData |= (fReadOnly ? CFA_FIREADONLY : 0);        // daten editieren ?
  218.   ulFlagsData |= (chType == 'B' ? CFA_BITMAPORICON : 0);  // data ist bitmap/icon
  219.   ulFlagsData |= (chType == 'S' ? CFA_STRING : 0);        // data ist string
  220.   ulFlagsData |= (chType == 'U' ? CFA_ULONG : 0);         // data ist ulong
  221.   ulFlagsData |= (chType == 'D' ? CFA_DATE : 0);          // data ist date
  222.   ulFlagsData |= (chType == 'T' ? CFA_TIME : 0);          // data ist time
  223.  // FLAGS FÜR DEN SPALTENTITEL
  224.   ulFlagsTitle = CFA_VCENTER;                           // titel vertikal zentrieren
  225.   ulFlagsTitle |= CFA_FITITLEREADONLY;                  // title kann nicht editiert werden
  226.  // SETUP FIELDINFO STRUCTURE
  227.   pLastFI->cb = sizeof(FIELDINFO);                      // struktur-größe
  228.   pLastFI->flData = ulFlagsData | ulAlignData;          // daten-atribute
  229.   pLastFI->flTitle = ulFlagsTitle | ulAlignTitle;       // titel-attribute
  230.   pLastFI->pTitleData = pszTitle;                       // spaltentitel
  231.   pLastFI->offStruct = ulOfs;                           // offset zu den daten
  232.   pLastFI->pUserData = NULL;                            // keine user-daten
  233.   pLastFI->pNextFieldInfo = NULL;                       // nur diese spalte
  234.   pLastFI->cxWidth = ulColWidth;                        // spalten-breite
  235.  // SETUP FIELDINFOINSERT STRUCTURE
  236.   if (pFIpred == NULL) pFIpred = (FIELDINFO *)CMA_FIRST;  // erster record
  237.   FII.cb = sizeof(FIELDINFOINSERT);                     // struktur-größe
  238.   FII.pFieldInfoOrder = pFIpred;                        // spalten-reihenfolge oder NULL (ende)
  239.   FII.fInvalidateFieldInfo = TRUE;                      // anzeige updaten
  240.   FII.cFieldInfoInsert = 1;                             // 1 record einfügen
  241.  // INSERT DETAIL RECORD
  242.   ul = (ULONG)WinSendMsg (HWindow,CM_INSERTDETAILFIELDINFO,pLastFI,&FII);
  243.   if (ul == 0) return (-1);
  244.  // PASSED
  245.   return (0);
  246. }
  247.  
  248. LONG TContainer::RemoveDetail (FIELDINFO *pFI)
  249. {
  250.   USHORT usCnt = 1;
  251.  
  252.  // ALLE RECORDS LÖSCHEN
  253.   if (pFI == NULL) usCnt = 0;
  254.  // LÖSCHEN
  255.   return (LONG)WinSendMsg (HWindow,CM_REMOVEDETAILFIELDINFO,pFI,MPFROM2SHORT(usCnt,CMA_FREE | CMA_INVALIDATE));
  256. }
  257.  
  258. BOOL TContainer::SetDetailView (BOOL fTitles)
  259. {
  260.   ULONG   ulCV;
  261.  
  262.  // SET FLAGS & VIEW
  263.   ulCV = CV_DETAIL;
  264.   ulCV |= (fTitles ? CA_DETAILSVIEWTITLES : 0);
  265.   return SetView (ulCV);
  266. }
  267.  
  268. BOOL TContainer::ScrollSplitWindow (BOOL fLeft, LONG lPixel)
  269. {
  270.   return (BOOL)WinSendMsg (HWindow,CM_HORZSCROLLSPLITWINDOW,
  271.                            MPFROMSHORT((fLeft ? CMA_LEFT : CMA_RIGHT)),MPFROMLONG(lPixel));
  272. }
  273.  
  274. BOOL TContainer::SetSplitBar (LONG lSB)
  275. {
  276.  // SETUP CNRINFO STRUCTURE
  277.   CI.cb = sizeof(CNRINFO);                      // struktur-größe
  278.   CI.xVertSplitbar = lSB;                       // balken-position
  279.   return (BOOL)WinSendMsg (HWindow,CM_SETCNRINFO,&CI,MPFROMLONG(CMA_XVERTSPLITBAR));
  280. }
  281.  
  282. BOOL TContainer::SetLastSplitColumn (FIELDINFO *pFI)
  283. {
  284.  // SETUP CNRINFO STRUCTURE
  285.   CI.cb = sizeof(CNRINFO);                      // struktur-größe
  286.   CI.pFieldInfoLast = pFI;                      // neue spalte oder NULL
  287.   return (BOOL)WinSendMsg (HWindow,CM_SETCNRINFO,&CI,MPFROMLONG(CMA_PFIELDINFOLAST));
  288. }
  289.  
  290. BOOL TContainer::SetTextView (BOOL fFlow, BOOL fTree)
  291. {
  292.   ULONG   ulCV;
  293.  
  294.  // CONTAINER CANNOT DISPLAY FLOWED TREE...
  295.   if (fTree) fFlow = FALSE;
  296.  // SET FLAGS & VIEW
  297.   ulCV = CV_TEXT;
  298.   ulCV |= (fFlow ? CV_FLOW : 0);
  299.   ulCV |= (fTree ? CV_TREE : 0);
  300.   return SetView (ulCV);
  301. }
  302.  
  303. BOOL TContainer::SetIconView (BOOL fMini, BOOL fTree)
  304. {
  305.   ULONG   ulCV;
  306.  
  307.  // CONTAINER CANNOT DISPLAY TREE AND MINI-ICONS
  308.   if (fTree) fMini = FALSE;
  309.  // SET FLAGS & VIEW
  310.   ulCV = CV_ICON;
  311.   ulCV |= (fMini ? CV_MINI : 0);
  312.   ulCV |= (fTree ? CV_TREE : 0);
  313.   return SetView (ulCV);
  314. }
  315.  
  316. BOOL TContainer::ArrangeIcons ()
  317. {
  318.   return (BOOL)WinSendMsg (HWindow,CM_ARRANGE,NULL,NULL);
  319. }
  320.  
  321. BOOL TContainer::SetNameView (BOOL fMini, BOOL fFlow)
  322. {
  323.   ULONG   ulCV;
  324.  
  325.  // SET FLAGS & VIEW
  326.   ulCV = CV_NAME;
  327.   ulCV |= (fMini ? CV_MINI : 0);
  328.   ulCV |= (fFlow ? CV_FLOW : 0);
  329.   return SetView (ulCV);
  330. }
  331.  
  332. BOOL TContainer::CollapseTree (RECORDCNR *pRC)
  333. {
  334.   if (pRC == NULL) return (FALSE);
  335.   return (BOOL)WinSendMsg (HWindow,CM_COLLAPSETREE,pRC,NULL);
  336. }
  337.  
  338. BOOL TContainer::ExpandTree (RECORDCNR *pRC)
  339. {
  340.   if (pRC == NULL) return (FALSE);
  341.   return (BOOL)WinSendMsg (HWindow,CM_EXPANDTREE,pRC,NULL);
  342. }
  343.  
  344. BOOL TContainer::SetTreeIndent (LONG lTI)
  345. {
  346.  // SETUP CNRINFO STRUCTURE
  347.   CI.cb = sizeof(CNRINFO);                      // struktur größe
  348.   CI.cxTreeIndent = lTI;                        // neuer indent-wert
  349.   return (BOOL)WinSendMsg (HWindow,CM_SETCNRINFO,&CI,MPFROMLONG(CMA_CXTREEINDENT));
  350. }
  351.  
  352. BOOL TContainer::SetTreeLine (LONG lTL, BOOL fDraw)
  353. {
  354.   ULONG         ul;
  355.  
  356.  // GET CURRENT CONTAINER INFO & CLEAR ALL DRAW FLAG
  357.   WinSendMsg (HWindow,CM_QUERYCNRINFO,&CI,MPFROMSHORT(sizeof(CNRINFO)));
  358.   ul = CI.flWindowAttr & (0xFFFFFFFF - (CA_TREELINE));
  359.  // UPDATES DRAW FLAG
  360.   if (fDraw) ul |= CA_TREELINE;                 // zeichne linie
  361.  // SETUP CNRINFO STRUCTURE
  362.   CI.cb = sizeof(CNRINFO);                      // struktur-größe
  363.   CI.cxTreeLine = lTL;                          // neue strichstärke
  364.   CI.flWindowAttr = ul;                         // zeichenflag !
  365.   return (BOOL)WinSendMsg (HWindow,CM_SETCNRINFO,&CI,MPFROMLONG(CMA_FLWINDOWATTR | CMA_CXTREELINE));
  366. }
  367.  
  368. BOOL TContainer::SetTreeIcons (TIcon *pIcoExp, TIcon *pIcoCol)
  369. {
  370.  // SETUP CNRINFO STRUCTURE
  371.   CI.cb = sizeof(CNRINFO);                              // structure size
  372.   CI.hptrExpanded = (HPOINTER)HICON(*pIcoExp);          // expanded icon
  373.   CI.hptrCollapsed = (HPOINTER)HICON(*pIcoCol);         // collapsed icon
  374.  // SET ICONS
  375.   return (BOOL)WinSendMsg (HWindow,CM_SETCNRINFO,&CI,MPFROMLONG(CMA_TREEICON));
  376. }
  377.  
  378. BOOL TContainer::SetView (ULONG ulFlags)
  379. {
  380.   ULONG ul;
  381.  
  382.  // GET CURRENT CONTAINER INFO & CLEAR ALL VIEW FLAGS
  383.   WinSendMsg (HWindow,CM_QUERYCNRINFO,&CI,MPFROMSHORT(sizeof(CNRINFO)));
  384.   ul = CI.flWindowAttr & (0xFFFFFFFF - (CV_ICON | CV_NAME | CV_TEXT | CV_TREE |
  385.                                         CV_MINI | CV_FLOW |
  386.                                         CV_DETAIL | CA_DETAILSVIEWTITLES));
  387.  // SETUP CNRINFO STRUCTURE
  388.   CI.cb = sizeof(CNRINFO);              // structure size
  389.   CI.flWindowAttr = ul | ulFlags;       // view flags
  390.   return (BOOL)WinSendMsg (HWindow,CM_SETCNRINFO,&CI,MPFROMLONG(CMA_FLWINDOWATTR));
  391. }
  392.  
  393. BOOL TContainer::SetLineSpacing (LONG lLS)
  394. {
  395.  // SETUP CNRINFO STRUCTURE
  396.   CI.cb = sizeof(CNRINFO);                      // structure size
  397.   CI.cyLineSpacing = lLS;                       // new value
  398.   return (BOOL)WinSendMsg (HWindow,CM_SETCNRINFO,&CI,MPFROMLONG(CMA_LINESPACING));
  399. }
  400.  
  401. BOOL TContainer::SetTitle (PSZ pszTitle, char chAlign)
  402. {
  403.   ULONG         ul;
  404.  
  405.  // GET CURRENT CONTAINER INFO & CLEAR ALL TITLE FLAGS
  406.   WinSendMsg (HWindow,CM_QUERYCNRINFO,&CI,MPFROMSHORT(sizeof(CNRINFO)));
  407.   ul = CI.flWindowAttr & (0xFFFFFFFF - (CA_CONTAINERTITLE | CA_TITLEREADONLY |
  408.                                         CA_TITLESEPARATOR | CA_TITLECENTER |
  409.                                         CA_TITLELEFT | CA_TITLERIGHT));
  410.  // UPDATES TITLE FLAGS
  411.   ul |= CA_CONTAINERTITLE | CA_TITLEREADONLY;   // title ist read-only
  412.   ul |= (pszTitle ? CA_TITLESEPARATOR : 0);     // trennlinie, wenn text
  413.   if (chAlign == 'L') ul |= CA_TITLELEFT;       // linksbündig
  414.   if (chAlign == 'C') ul |= CA_TITLECENTER;     // zentriert
  415.   if (chAlign == 'R') ul |= CA_TITLERIGHT;      // rechtsbündig
  416.  // SETUP CNRINFO STRUCTURE
  417.   CI.cb = sizeof(CNRINFO);                      // struktur-größe
  418.   CI.pszCnrTitle = pszTitle;                    // title oder NULL
  419.   CI.flWindowAttr = ul;                         // flags
  420.  // SETZT TITEL
  421.   return (BOOL)WinSendMsg (HWindow,CM_SETCNRINFO,&CI,MPFROMLONG(CMA_FLWINDOWATTR | CMA_CNRTITLE));
  422. }
  423.  
  424. BOOL TContainer::ScrollWindow (BOOL fDir, LONG lPixel)
  425. {
  426.   USHORT  usDir;
  427.  
  428.   usDir = (fDir ? CMA_VERTICAL : CMA_HORIZONTAL);
  429.   return (BOOL)WinSendMsg (HWindow,CM_SCROLLWINDOW,MPFROMSHORT(usDir),MPFROMLONG(lPixel));
  430. }
  431.  
  432. void TContainer::SetupWindow()
  433. {
  434.  // SETUPWINDOW VON TCONTROL AUFRUFEN
  435.   TControl::SetupWindow();
  436.  // EINIGE VARIABLEN INTIALISIEREN
  437.   pLastRC = NULL; pLastFI = NULL;
  438.   lFilterMode = 0;
  439.  // SORTIEREN INITIALISIEREN
  440.   lSortMode = 0; pICNR = this;                          // nicht sortieren
  441.   CI.cb = sizeof(CNRINFO);                              // struktur größe
  442.   CI.pSortRecord = pfnCompareRecord;                    // sortier-funktion
  443.  // "CompareRecord" AUFRUFEN BEIM EINFÜGEN NEUER RECORDS
  444.   WinSendMsg (HWindow,CM_SETCNRINFO,&CI,MPFROMLONG(CMA_PSORTRECORD));
  445. }
  446.  
  447. void TContainer::SetStyle (ULONG ulStyle)
  448. {
  449.   SetWindowLong (QWL_STYLE,ulStyle);
  450.   Invalidate ();
  451. }
  452.  
  453. ULONG TContainer::ClearStyle (ULONG ulStyle)
  454. {
  455.   return (GetWindowLong(GWL_STYLE) & (0xFFFFFFFF - ulStyle));
  456. }
  457.  
  458. char far *TContainer::GetClassName()
  459. {
  460.   return (WC_CONTAINER);
  461. }
  462.  
  463.