Rapid-Q Documentation by William Yu (c)1999-2000 | Appendix A: QLISTVIEW

# QLISTVIEW Component

  QListView provides 3 different ways of displaying items on a form. Items can be displayed in columns with column headers and sub-items, or individually with large/small icons.
  QListView Internal Types

         TYPE ItemType            '' ie. ListView.Item(0).Caption
           Caption AS STRING
           Checked AS INTEGER     '' If CheckBoxes is enabled and item is checked
           Handle AS INTEGER      '' Read-only
           ImageIndex AS INTEGER
           Index AS INTEGER       '' Read-only
           Selected AS INTEGER
           StateIndex AS INTEGER
         END TYPE

         TYPE ColumnType          '' ie. ListView.Column(0).Width
           Caption AS STRING
           Width AS INTEGER
         END TYPE

  QListView Properties

  Field | Type | R/W | Default

  Align | INTEGER | RW | alNone
  | Align determines how the control aligns within its parent control.
  BorderStyle | INTEGER | RW | bsSingle
  CheckBoxes | INTEGER | RW | False
  | CheckBoxes specifies whether checkboxes appear next to the items in the listview.
  Color | INTEGER | RW |
  Column | ARRAY of ColumnType | RW |
  ColumnClick | INTEGER | RW | True
  | ColumnClick determines whether the column header behaves like a button.
  ColumnsCount | INTEGER | RW |
  Cursor | INTEGER | RW | crDefault
  Enabled | INTEGER | RW | True
  Font | QFONT | W |
  GridLines | INTEGER | RW | False
  | GridLines determines whether lines are drawn separating items in the list.
  Handle | INTEGER | R |
  Height | INTEGER | RW |
  HideSelection | INTEGER | RW | False
  | HideSelection determines whether the listview gives a visual indication of which item is selected when focus shifts to another control.
  Hint | STRING | RW |
  HotTrack | INTEGER | RW | False
  | HotTrack specifies whether list items are highlighted when the mouse passes over them.
  Item | ARRAY of ItemType | RW |
  ItemCount | INTEGER | RW |
  ItemIndex | INTEGER | RW |
  LargeImages | QIMAGELIST | W |
  Left | INTEGER | RW | 0
  MultiSelect | INTEGER | RW | False
  Parent | QFORM/QPANEL/QTABCONTROL | W |
  PopupMenu | QPOPUPMENU | W |
  ReadOnly | INTEGER | RW | False
  RowSelect | INTEGER | RW | False
  | RowSelect determines whether an entire row in the listview can be selected.
  SelCount | INTEGER | RW |
  Selected | ARRAY of INTEGER | RW |
  ShowColumnHeaders | INTEGER | RW | True
  ShowHint | INTEGER | RW | False
  SmallImages | QIMAGELIST | W |
  SortType | INTEGER | RW | stNone
  | SortType determines if and how the items in the list are automatically sorted. 0 = stNone -- No sorting is done. 2 = stText -- Items are sorted according to their caption property.
  StateImages | QIMAGELIST | W |
  SubItem | 2D ARRAY of STRING | RW |
  TabOrder | INTEGER | RW |
  Tag | INTEGER | RW |
  Top | INTEGER | RW | 0
  Width | INTEGER | RW |
  ViewStyle | INTEGER | RW | vsIcon
  Visible | INTEGER | RW | True

  QListView Methods

  Method | Type | Description | Params

  AddColumns | SUBI | Add column headers to listview | STRING, Infinite
  AddItems | SUBI | Add items to listview | STRING, Infinite
  AddSubItem | SUB (Index%, String$) | Add sub item to Index% | 2
  Clear | SUB | Clear all items in listview | 0
  ClearColumns | SUB | Clear all columns in listview | 0
  DelItems | SUBI | Delete items from listview | INTEGER, Infinite
  DelSubItem | SUB (Index%, SubIndex%) | Delete subitem from listview | 2
  InsertItem | SUB (Index%, String$) | Insert item at Index% | 2
  InsertSubItem | SUB (Index%, SubIndex%, String$) | Insert subitem | 3
  SwapItem | SUB (Index1%, Index2%) | Swap items | 2

  QListView Events

  Event | Type | Occurs when... | Params

  OnClick | VOID | Item was clicked on | 0
  OnChange | SUB (Index%, Change AS BYTE) | Item changed (text, image, or state) | 2
  OnColumnClick | SUB (Column%) | Column header was clicked | 1
  OnDblClick | VOID | Selection was double clicked on | 0
  OnKeyPressed | SUB (Key AS BYTE) | Key was pressed | 1

  QListView Examples

      ' Simple .ZIP viewer (doesn't extract or anything useful like that).
      ' You're free to modify and distribute the code without restrictions.
      ' Written in Rapid-Q by William Yu
      ' Demonstrates QOpenDialog, QFileStream, QListView, QMainMenu, QMenuItem
      '              and QImageList.

      $APPTYPE GUI
      $TYPECHECK ON
      $INCLUDE "RAPIDQ.INC"

      $RESOURCE ICO_ZIP AS "ZIP.ICO"
      $RESOURCE ICO_APP AS "APP.ICO"

      DECLARE SUB ZipView (ZIPFile AS STRING)
      DECLARE SUB FormResize
      DECLARE SUB OpenClick
      DECLARE SUB ExitClick
      DECLARE SUB IconClick
      DECLARE SUB SmallIconClick
      DECLARE SUB ReportClick
      DECLARE SUB ItemDblClick

      CONST SIG = &H04034B50         ' ZIP Signature/ID

      TYPE ZFHeader
        Signature AS LONG
        Version AS WORD
        GPBFlag AS WORD              ' ?
        Compress AS WORD             ' Compression types
        DateTime AS LONG             ' Packed format
        CRC32 AS LONG
        CSize AS LONG                ' Compressed size
        USize AS LONG                ' Uncompressed size
        FileNameLen AS LONG
      END TYPE

      TYPE PackedDateType            ' I think this is it:
        Year AS SHORT                ' 7 bits
        Month AS BYTE                ' 4 bits
        Day AS BYTE                  ' 5 bits
        Hour AS BYTE                 ' 5 bits
        Minute AS BYTE               ' 6 bits
        Secs AS BYTE                 ' 5 bits
      END TYPE                       ' Total = 32 bits

      DIM CompType(0 TO 9) AS STRING
          CompType(0) = "Stored"
          CompType(1) = "Shrunk"
          CompType(2) = "Reduced1"
          CompType(3) = "Reduced2"
          CompType(4) = "Reduced3"
          CompType(5) = "Reduced4"
          CompType(6) = "Imploded"
          CompType(7) = "Defalted"
          CompType(8) = "DeflatN"      '' Could be DeflatX as well...
          CompType(9) = "DeflatX"

      DIM OpenItem AS QMenuItem
          OpenItem.Caption = "&Open"
          OpenItem.OnClick = OpenClick
      DIM BreakItem AS QMenuItem
          BreakItem.Caption = "-"
      DIM ExitItem AS QMenuItem
          ExitItem.Caption = "E&xit"
          ExitItem.OnClick = ExitClick
      DIM IconItem AS QMenuItem
          IconItem.Caption = "vs&Icon"
          IconItem.RadioItem = True
          IconItem.OnClick = IconClick
      DIM SmallIconItem AS QMenuItem
          SmallIconItem.Caption = "vs&SmallIcon"
          SmallIconItem.RadioItem = True
          SmallIconItem.OnClick = SmallIconClick
      DIM ReportItem AS QMenuItem
          ReportItem.Caption = "vs&Report"
          ReportItem.RadioItem = True
          ReportItem.Checked = True
          ReportItem.OnClick = ReportClick

      DIM FileMenu AS QMenuItem
          FileMenu.Caption = "&File"
          FileMenu.AddItems OpenItem, BreakItem, ExitItem
      DIM ViewMenu AS QMenuItem
          ViewMenu.Caption = "&View"
          ViewMenu.AddItems IconItem, SmallIconItem, ReportItem

      DIM ImageList1 AS QImageList
          ImageList1.Height = 32
          ImageList1.Width = 32
          ImageList1.AddICOHandle ICO_APP
          ImageList1.AddICOHandle ICO_ZIP
      DIM ImageList2 AS QImageList            ' Scale 16x16
          ImageList2.Height = 16
          ImageList2.Width = 16
          ImageList2.AddICOHandle ICO_APP
          ImageList2.AddICOHandle ICO_ZIP

      CREATE Form AS QForm
        ICOHandle = ICO_ZIP
        Center
        OnResize = FormResize
        Height = 330
        Width = 525
        Caption = "Simple .ZIP Viewer for Rapid-Q"
        CREATE MainMenu AS QMainMenu
          AddItems FileMenu, ViewMenu
        END CREATE
        CREATE ListView AS QListView
          Width = Form.ClientWidth
          Height = Form.ClientHeight
          SmallImages = ImageList2
          LargeImages = ImageList1
          ViewStyle = vsReport
          AddColumns "FileName","Length","Method","Size","Rate","Date","Time","CRC-32"
          Column(0).Width = 200
          Column(4).Width = 40
          Column(5).Width = 70
          Column(7).Width = 70
          OnDblClick = ItemDblClick
        END CREATE
        ShowModal
      END CREATE

      '------------------------------------------------------------------

      SUB ZipView (ZIPFile AS STRING)
        DIM Hdr      AS ZFHeader
        DIM ZF       AS QFileStream
        DIM PD       AS PackedDateType
        DIM FileName AS STRING
        DIM Index    AS INTEGER

        IF ZF.Open(ZIPFile, fmOpenRead) = False THEN
          ShowMessage("Problem with reading "+ZIPFile)
          EXIT SUB
        END IF

        ListView.Clear
        Hdr.Signature = ZF.ReadNum(4)

        Index = 0
        WHILE Hdr.Signature = SIG
          Hdr.Version  = ZF.ReadNum(2)
          Hdr.GPBFlag  = ZF.ReadNum(2)
          Hdr.Compress = ZF.ReadNum(2)
          Hdr.DateTime = ZF.ReadNum(4)
          Hdr.CRC32 = ZF.ReadNum(4)
          Hdr.CSize = ZF.ReadNum(4)
          Hdr.USize = ZF.ReadNum(4)
          Hdr.FileNameLen = ZF.ReadNum(4)

          FileName = ZF.ReadStr(Hdr.FileNameLen)

          PD.Year = ((Hdr.DateTime SHR 25) AND &H7F) + 1980
          PD.Month = (Hdr.DateTime SHR 21) AND &H0F
          PD.Day = (Hdr.DateTime SHR 16) AND &H1F
          PD.Hour = (Hdr.DateTime SHR 11) AND &H1F
          PD.Minute = (Hdr.DateTime SHR 5) AND &H3F
          PD.Secs = Hdr.DateTime AND &H1F
          ListView.AddItems FileName
          IF INSTR(UCASE$(FileName), ".ZIP") THEN
            ListView.Item(Index).ImageIndex = 1
          END IF
          ListView.AddSubItem Index, STR$(Hdr.USize)
          ListView.AddSubItem Index, CompType(Hdr.Compress)
          ListView.AddSubItem Index, STR$(Hdr.CSize)
          IF Hdr.USize = 0 THEN
            ListView.AddSubItem Index, "----"
          ELSE
            ListView.AddSubItem Index, STR$(INT((Hdr.USize - Hdr.CSize) / Hdr.USize * 100))+"%"
          END IF
          ListView.AddSubItem Index, STR$(PD.Month)+"-"+STR$(PD.Day)+"-"+STR$(PD.Year)
          ListView.AddSubItem Index, STR$(PD.Hour)+":"+STR$(PD.Minute)
          ListView.AddSubItem Index, LCASE$(HEX$(Hdr.CRC32))
          ZF.Seek(Hdr.CSize, soFromCurrent)
          Hdr.Signature = ZF.ReadNum(4)
          Index = Index + 1
        WEND

        IF Index = 0 THEN
           '-- Likely not a .ZIP file
           ShowMessage(ZIPFile+" is not a valid ZIP file!")
        END IF
      END SUB

      SUB OpenClick
        DIM OpenDialog AS QOpenDialog

        OpenDialog.InitialDir = CurDir$
        OpenDialog.Filter = "ZIP Files (*.zip)|*.zip|All Files (*.*)|*.*"

        IF OpenDialog.Execute THEN
          ZipView(OpenDialog.FileName)
        END IF
      END SUB

      SUB ExitClick
        Form.Close
      END SUB

      SUB FormResize
        ListView.Height = Form.ClientHeight
        ListView.Width = Form.ClientWidth
      END SUB

      SUB IconClick
        IconItem.Checked = True
        ListView.ViewStyle = vsIcon
      END SUB

      SUB SmallIconClick
        SmallIconItem.Checked = True
        ListView.ViewStyle = vsSmallIcon
      END SUB

      SUB ReportClick
        ReportItem.Checked = True
        ListView.ViewStyle = vsReport
      END SUB

      SUB ItemDblClick
        IF ListView.ItemIndex >= 0 THEN
          ShowMessage("Can't extract "+ListView.Item(ListView.ItemIndex).Caption);
        END IF
      END SUB

  Prev Component | Contents | Next Component