[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]