[Back to OOP SWAG index] [Back to Main SWAG index] [Original]

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

     Program Name : ListBox2.Pas
     Written By   : Brad Prendergast
     E-Mail       : mrealm@ici.net
     Web Page     : http://www.ici.net/cust_pages/mrealm/BANDP.HTM
     Program
     Compilation  : Borland Turbo Pascal 7.0

     Program Description :
      This demonstration is of a ListBox that allows the jumping through the
      list by pressing an alphabetic character and then proceding to the first
      item in the list that begins with that character.  This demonstation is
      very basic, simple and non-complex.  It is meant to be built upon and the
      reenforcement of the ideas. Any questions or comments feel free to email
      me.

     =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

    Program ListBoxDemo2;

    {$DEFINE DEBUG}
    {$DEFINE Error_Checking}
      {$IFDEF Error_Checking}
        {$I+}  {L I/O Checking            }
        {$Q+}  {L Overflow Checking       }
        {$R+}  {L Range Checking          }
        {$S+}  {L Stack Overflow Checking }
      {$ELSE}
        {$I-}  {L I/O Checking            }
        {$Q-}  {L Overflow Checking       }
        {$R-}  {L Range Checking          }
        {$S-}  {L Stack Overflow Checking }
      {$ENDIF}
    {$UNDEF Error_Checking}

      {$IFDEF DEBUG}
        {$D+}  {G Debug Information              }
        {$L+}  {G Local Symbol Information       }
        {$Y+}  {G Symbolic Reference Information }
      {$ELSE}
        {$D-}  {G Debug Information              }
        {$L-}  {G Local Symbol Information       }
        {$Y-}  {G Symbolic Reference Information }
      {$ENDIF}

    {$A+}  {G Align Data}
    {$B-}  {L Short Circuit Boolean Evaluation   }
    {$E-}  {G Disable Emulation                  }
    {$F+}  {L Allow Far Calls                    }
    {$G+}  {G Generate 80286 Code                }
    {$N-}  {G Disable Numeric Processing         }
    {$P+}  {G Enable Open Parameters             }
    {$O+}  {G Overlay                            }
    {$T-}  {G Type @ Operator                    }
    {$V+}  {L Var String Checking                }
    {$X+}  {G Extended Syntax Enabled            }

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      uses
        app, objects, dialogs, views, drivers, menus;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      const
        cmList = 101;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      type
        PListWindow = ^TListWindow;
        TListWindow = object (tdialog)
                    Constructor Init;
                      end;

        PKeyListBox = ^TKeyListBox;
        TKeyListBox = object (TListBox)
                    searchcharacter: char;
                    Constructor Init(var bounds : TRect; anumcols : word;
                                     ascrollbar : PScrollBar);
                    Procedure HandleEvent(var event: TEvent); Virtual;
                      end;

        PDemoApp = ^TDemoApp;
        TDemoApp = object (TApplication)
                 Constructor Init;
                 Procedure InitMenuBar;Virtual;
                 Procedure HandleEvent ( var event : TEvent); Virtual;
                 Procedure List_It;
                 Destructor Done;Virtual;
                   end;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      var
      {$IFDEF DEBUG}
        the : longint;
      {$ENDIF}
         DemoApp : TDemoApp;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      Constructor TListWindow.Init;
        Var
          r       : Trect;
          list    : PListBox;
          scrol   : PScrollBar;
        Begin
          r.Assign ( 0, 0, 37, 14 );
          Inherited Init ( r, 'List Box Demo');
          options := options or ofcentered;
          r.Assign ( 32, 3, 33, 10 );
          scrol := New(PScrollBar,Init(r));
          Insert(scrol);
          r.assign( 4,3,32,10);
          list := New ( PKeyListBox, Init ( r, 1, scrol));
          Insert (List);
          r.Assign( 4, 2, 33, 3);
          Insert (New(Plabel,  init (r, '~S~elect from List : ', list)));
          r.Assign( 8, 11, 18, 13);
          insert (New(PButton, init (r, '~O~k', cmOk, bfDefault)));
          r.Move (11, 0);
          insert (new(PButton, init (r, '~C~ancel', cmCancel, bfNormal)));
          selectnext(false);
        End;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      Constructor TKeyListBox.Init(var bounds : TRect; anumcols : word;
                                   ascrollbar : PScrollBar);
        Begin
        Inherited Init(bounds, anumcols, ascrollbar);
        searchcharacter := #0;

        End;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      Procedure TKeyListBox.HandleEvent ( var event : TEvent);
        var
          thechar : char;
          thestr  : pstring;

          function StartWithCharacter(item: PString): boolean; far;
            begin
              StartWithCharacter := (item <> nil) and (item^ <> '') and
                                    ((item^[1] = searchcharacter) or
                                    (item^[1] = char(ord(searchcharacter) + 32)));
             end;

        Begin
          if (event.what = evkeydown) then
            begin
              if (event.charcode <> #0) and not (event.charcode in [#13, #27, #32]) then
                begin
                  thechar := event.charcode;
                  if (thechar >= 'a') and (thechar <= 'z') then
                    thechar := char(ord(thechar) - 32);
                  searchcharacter := thechar;
                end
              else
                begin
                  inherited handleevent(event);
                  exit;
                end;
              clearevent(event);
              thestr := list^.firstthat(@startwithcharacter);
              if (thestr <> nil) then
                begin
                  focusitem(list^.indexof(thestr));
                  drawview;
                end;
            end
          else
            inherited handleevent(event);
        End;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      Constructor TDemoApp.Init;
        Begin
          Inherited Init;
        End;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      Procedure TDemoApp.InitMenuBar;
        var
          r : Trect;
        Begin
          GetExtent(r);
          r.b.y := r.a.y + 1;
          menubar := New (PMenuBar, Init (r, NewMenu(
                     newsubmenu ('~D~emo', hcNoContext, newmenu(
                       newitem  ('~L~istbox', '', kbNoKey, cmList, hcNoContext,
                                 nil)), nil))));
        End;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      Procedure TDemoApp.HandleEvent (var event : TEvent);
        Begin
          if (Event.What = evCommand) then
            Begin
              case ( event.command ) of
                cmList    : List_It;
              end;
            End;
          Inherited HandleEvent(event);
          ClearEvent(event);
        End;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      Procedure TDemoApp.List_It;
        type
          TListBoxRec = record
                      list      : PCollection;
                      Selection : word;
                        end;
        var
          data   : TListBoxRec;
          name   : string;
          result : integer;
          bounds : TRect;
        Begin
          data.list := new(PStringCollection, Init(20, 10));
          data.list^.Insert(NewStr('Anchorage'));
          data.list^.Insert(NewStr('Atlanta'));
          data.list^.Insert(NewStr('Baltimore'));
          data.list^.Insert(NewStr('Boston'));
          data.list^.Insert(NewStr('New York'));
          data.list^.Insert(NewStr('New Mexico'));
          data.list^.Insert(NewStr('Nevada'));
          data.list^.Insert(NewStr('Chugiak'));
          data.list^.Insert(NewStr('Detroit'));
          data.list^.Insert(NewStr('Dallas'));
          data.list^.Insert(NewStr('Lowell'));
          data.list^.Insert(NewStr('Ketchican'));
          data.list^.Insert(NewStr('Haines'));
          data.list^.Insert(NewStr('Juneau'));

          data.selection := 0;
          result := ExecuteDialog(New(PListWindow, Init), @data);
          name := PString(data.List^.At(data.Selection))^;
          Dispose(data.List, Done);
          if (result = cmOK) then
            begin
              bounds.Assign(15, 5, 65, 12);
              InsertWindow(New(PWindow,
              Init(bounds, Concat('Chosen One: ', name), wnNoNumber)));
            end;
        End;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

      Destructor TDemoApp.Done;
        Begin
          Inherited Done;
        End;

    {=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=}

    Begin
    {$IFDEF DEBUG}
      the := memavail;
    {$ENDIF}
      DemoApp.Init;
      DemoApp.Run;
      DemoApp.Done;
    {$IFDEF DEBUG}
      Writeln ( 'Memory -   Before : ', the:6, ' After : ', memavail:6);
    {$ENDIF}

    End.

[Back to OOP SWAG index] [Back to Main SWAG index] [Original]