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

    {
    >>> In a Turbo Vision DIALOG form, how do you (re)select the FIRST editable
    >>> data field FROM ANYWHERES IN the DIALOG?

    >> You don't select it. You let IT select itself. Since all the views
    >> inserted into the dialog are descendents of TView, then they all
    >> have a select method.

    > Nice Idea, too bad it's not that simple 8-(

    It rarely is with TV.
    }
    Program SelectAView_2; {tested. The only thing this does, is work}

       { If you want to have an object select itself, without haveing
         to explicitly define itself first, you must begin with an
         object that KNOWS how to select itself.
         Since Select is a method of the TView object, any descendent
         will know how.

         A method is then needed by the object,
         that contains the object that must select itself,
         to get its, request that it select itself
         to the object that must select itself.

         Use the evBroadcast event.

         The object, that contain the object that must select itself,
         generates a broadcast event onto it's event tree. (random shot
         in the dark) This broadcast, requests that any object that
         is set to select itself on the events command, should accept the
         broadcast.... , and then select itself.

         This is accomplished by taking your last instance definition
         of a object that you are inserting into your event queue and
         descending it once more to overide its HandleEvent method.

         In my example, I've used a simple TDialog and inserted a
         bunch of of TInputLine's and a TButton that generates an
         EvCommand of 'SelectFirst', and descended the HandleEvent
         to generate a evBroadCast event, to broadcast the SelectFirst
         Command.

         The TinputLine descendent, TMyLine, is directly descended
         from the type of object that I am linking into this TDialog
         objects event queue.

         Within a 'For i = 1 to 4' Loop, the TDialogs constructor
         will insert a TMyLine type, that will select itself whenever
         an evBroadCast event, broadcasts a SelectFirst command.

         As long as this object is a descendent of a TView, the
         TDialog will accept it, and treat like any other object.

         A TButton is installed to provide a method of generating
         an evBroadCast event that broadcasts a SelectFirst command.
       }

    uses Objects,App,Dialogs,Views,Drivers;

    type
      MyDlg = object(TDialog)
                constructor init;
                procedure HandleEvent(var Event:TEvent); virtual;
              end;

      MyLine = Object(TInputLine)
                 Selector : Word;
                 Constructor Init(var bounds:Trect;AMaxLen:Integer;
                                  SelectKey:Word);
                 Procedure HandleEvent(Var Event:TEvent); virtual;
               end;
      PMyLine = ^MyLine;

    const
      SelectFirst = 1000;

    Constructor MyLine.Init(var bounds:Trect;AMaxLen:Integer;
                            SelectKey:Word);
       Begin
         Inherited Init(Bounds,AMaxLen);
         EventMask := EventMask or evBroadcast;
         Selector := SelectKey;
       End;

    Procedure MyLine.HandleEvent(Var Event:TEvent);
       Begin
         inherited HandleEvent(Event);
         if   (Event.What = EvBroadcast) and
              (Event.Command = Selector)
         then Select;
      End;

    Constructor MyDlg.Init;
       var r:trect;
           i:integer;
       Begin
         r.assign(0,0,50,13);
         inherited init(r,'test dialog');
         options := options or ofcentered;
         getextent(r);
         r.grow(-3,-2);
         r.b.y := r.a.y + 1;
         for i := 1 to 4 do
            begin
              if   i = 2
              then insert(new(PMyLine,init(r,size.x,SelectFirst)))
              else insert(New(PInputLine,init(r,size.x)));
              inc(r.a.y,2); inc(r.b.y,2);
            end;
         inc(r.b.y);
         inc(r.a.x,(size.x div 2) - 14);
         dec(r.b.x,(size.x div 2) - 13);
         insert(new(Pbutton,init(r,'~S~elect FirstLine',
                                 SelectFirst,bfdefault)));
         SelectNext(False);
       end;

    Procedure MyDlg.HandleEvent(Var Event:TEvent);
       Begin
         inherited HandleEvent(Event);
         if   (Event.What = EvCommand) and
              (Event.Command = SelectFirst)
         then Message(owner,evBroadcast,Event.Command,nil);
       end;

    var
      a : TApplication;
      m : longint;
    type
      PMyDlg = ^MyDlg;

    begin
      m := memavail;
      with a do
      begin
        Init;
        ExecuteDialog(new(PMyDlg,init),nil);
        done;
      end;
      if memavail <> m then writeln('memory allocation/deallocation error');
    end.

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