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

    {
    From: Ken.Burrows@telos.org (Ken Burrows)

    >I am trying to write a TVision program that displays a list of items in a
    >list box. After highligting the item that the user wants and hitting the OK
    >button, I want to copy the highlighted item into a string variable.
    >I can Display the list of items (A TCollection) in the list box. However,
    >I don't know how to return the highlighted value.

    There are a number of ways of getting the data out of the list box. The easiest
    is to have the list box itself broadcast the data back to the dialog.
    When you call getdata, you are calling the dialogs getdata method. Unless you
    have overidden the method, it's a bit undefined as to what you are getting
    back. Since the list box is inserted into the dialog, to get the item that was
    focused, use TheListBox^.List^.At(TheListBox^.Focused) and typecast it as the
    data type that the list box is listing.

    Here is a working example.
    }

    Program ListBoxDemo;
    Uses App,Menus,Dialogs,Views,Drivers,Objects,Dos,MsgBox;

    Type
       MyListBox = Object(TListBox)
                     procedure HandleEvent(var Event:TEvent); virtual;
                   end;
       MyListBoxPtr = ^MyListBox;

       MyDialog = Object(TDialog)
                    pl:MyListBoxPtr;
                    constructor init;
                    procedure HandleEvent(var Event:Tevent); virtual;
                    Destructor Done; virtual;
                  end;
       MyDialogPtr = ^MyDialog;

      TMyApp = Object(TApplication)
                 procedure initstatusline; virtual;
               end;
    Const
      EnterPressed    = 201;
      DoubleClicked   = 202;
      SpaceBarred     = 203;
      OkButton        = 204;

    Function ListOfStuff:PStringCollection; {generic PStringCollection}
       var p:PStringCollection;
           sr:SearchRec;
       Begin
         p := nil;
         findfirst('*.*',0,sr);
         while doserror = 0 do
         begin
           if p = nil then new(p,init(5,3));
           p^.insert(newstr(sr.name));
           findnext(sr);
         end;
         ListOfStuff := p;
       End;

    Procedure MyListBox.HandleEvent(var Event:TEvent);
       begin
         if  (Event.What = evMouseDown) and (Event.Double)
         then Message(Owner,evBroadCast,DoubleClicked,list^.at(focused))
         else if   (event.what = evkeydown) and (event.KeyCode = KbEnter)
              then Message(Owner,evBroadCast,EnterPressed,list^.at(focused))
              else if   (event.what = evkeydown) and (event.CharCode = ' ')
                   then Message(Owner,evBroadCast,SpaceBarred,list^.at(focused))
                   else inherited HandleEvent(event);
      End;

    Constructor MyDialog.Init;
       var r:trect;
           ps:pscrollbar;
       Begin
         r.assign(0,0,17,16);
         inherited init(r,'Stuff');
         options := options or ofcentered;
         getextent(r); r.grow(-1,-1); dec(r.b.y,3); r.a.x := r.b.x - 1;
         new(ps,init(r));
         insert(ps);
         r.b.x := r.a.x; r.a.x := 1;
         new(pl,init(r,1,ps));
         insert(pl);
         pl^.newlist(ListOfStuff);
         r.assign(size.x div 2 - 4,size.y-3,size.x div 2 + 4,size.y-1);
         insert(new(Pbutton,init(r,'OK',OkButton,BfNormal)));
         selectnext(false);
      End;
    Procedure MyDialog.HandleEvent(var Event:TEvent);
       Procedure ShowMessage(s:String);
          Begin
            MessageBox(#3+s+#13#3+'Item Focused : '+
                       PString(Event.InfoPtr)^,
                       nil,mfokbutton+mfinformation);
          End;
       Begin
         inherited HandleEvent(Event);
         if   (event.what = evBroadcast) or (event.what = evCommand)
         then case event.command of
               EnterPressed  : ShowMessage('Enter Pressed');
               DoubleClicked : ShowMessage('Double Clicked');
               SpaceBarred   : ShowMessage('Space Barred');
               OkButton      : MessageBox(#3'Ok Button Pressed'#13#3+
                                          'ItemFocused = '+
                                          PString(pl^.list^.at(pl^.focused))^,
                                          nil,mfokbutton+mfinformation);
             end; {case}

      End;
    Destructor MyDialog.Done;
       Begin
         pl^.newlist(nil);   {required to clear the listbox}
         inherited done;
       End;

    Procedure TMyapp.InitStatusline;
      var
        r : trect;
      begin
        GetExtent(R);
        r.a.y := r.b.y - 1;
         StatusLine := new(pstatusline,init(r,
         newstatusdef(0,$FFFF,
         newstatuskey('List Box Demo by Ken.Burrows@Telos.Org.'+
         '   Press [ESC] to Quit.',
         0,0,nil),nil)));
      end;

    var
      a:TMyApp;
      m:longint;
    Begin
      m := memavail;
      with a do
      begin
        init;
        executedialog(new(MyDialogPtr,init),nil);
        done;
      end;
      if m <> memavail then writeln('heap ''a trouble');
    End.

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