TweetFollow Us on Twitter

January 93 - Customizing Views

Customizing Views

Angelika Peter

If you want to have subclasses of TView with additional fields, you face the problem that you can't initialize them from a 'View' resource if you want to use ViewEdit (or AdLib). With MacApp 2 style views it was relatively easy to derez the view resources, once the hierarchy was stable, and to maintain them as Rez sources.

With MacApp 3 style views, this becomes substantially more difficult. Not really impossible, but awkward enough to make me look for a workaround. Here it is:

THE SOLUTION

One of the (many) really good things about the new view format is the field fUserArea.

I am using it as a resource ID. The view subclass then reads a resource of a certain type with this ID and initializes its additional fields from this resource. Each subclass knows which resource type it has to use. Of course it is possible to have several levels of subclassing too. In this case every subclass would need it's own resource type.

All this happens in DoPostCreate, but one could probably do it in ReadFields if it is important that the fields are initialized before the DoPostCreate phase.

It is easy to maintain these resources either with ResEdit using own templates or with Rez, whichever is more convenient. And you have the additional advantage that the resources can be shared among several views.

AN EXAMPLE

My example is a TEditText subclass, used to enter numeric values. It is very much based on the old TExtendedText class from one of the MacApp 2 Goodies disks.

I want to initialize not only minimum and maximum from the resource but also the initial value, the precision and how it should behave when dimmed and whether to use scientific format.

The Pascal type template for the resource looks like this:

ExtTextDescribitor = RECORD
    minimum:                LongInt;
    maximum:                LongInt;
    divisor:                Integer;    
    precision:              Integer;
    maxMagnitude:           Integer;
    hideTextWhenDimmed:     Integer;  { 0 for false, <> 0 for true }
    initialValue:           Str255
    END; 
ExtTextDescribitorPtr       = ^ExtTextDescribitor;
ExtTextDescribitorHandle    = ^ExtTextDescribitorPtr;

The corresponding Rez template is:

type 'ExTx' {
    longint;    /* minimum value */ 
    longint;    /* maximum value */ 
    integer;    /* divisor (for minimum and maximum) */
    integer;    /* precision */ 
    integer     kNeverScientific=32000, kForceScientific=-1;
    integer     kShowTextWhenDimmed=0, kHideTextWhenDimmed =1;
    pstring;    /* initial value */
};

DoPostCreate would always look something like this:

PROCEDURE TExtendedText.DoPostCreate(itsDocument: TDocument);
OVERRIDE;

VAR
    itsDescribitor: Handle;
    fi: FailInfo;

    PROCEDURE HdlDoPostCreate(error: OSErr; message: LongInt);
    
    BEGIN
    SELF.Free
    END;

BEGIN { DoPostCreate }
INHERITED DoPostCreate(itsDocument);

IF fUserArea <> 0 THEN
    BEGIN
    CatchFailures(fi, HdlDoPostCreate);
    { !!! use your resource type here !!! }
    itsDescribitor := GetResource('foo ', fUserArea));
    FailNILResource(itsDescribitor);
    HLock(Handle(itsDescribitor));  { to make WITH safe }
    Success(fi);
    
    WITH MyDescribitorTypeHandle(itsDescribitor)^^ DO
        BEGIN
        { initialize your fields }
        END;    { with }
    
    ReleaseResource(itsDescribitor)
    END { if fUserArea… }
END; { DoPostCreate }

Initializing the fields is straightforward:

WITH itsDescribitor^^ DO
BEGIN
fPrecision := precision;        { digits after decimal point }
fMaxMagnitude := maxMagnitude;  { when to use scientific                                                                format }
fHideTextWhenDimmed := hideTextWhenDimmed <> 0;

IF minimum = - maxLongInt THEN  {to be able to express ±∞}
    fMinimum := - inf
ELSE
    fMinimum := minimum / divisor;  {for fractional minimum}
IF maximum = maxLongInt THEN
    fMaximum := + inf
ELSE
    fMaximum := maximum / divisor;  {for fractional maximum}

    fValue := initialValue;
SELF.SetModifiedText(initialValue, kRedraw)
END;    { with }
 
AAPL
$561.28
Apple Inc.
+0.00
GOOG
$614.11
Google Inc.
+0.00
MSFT
$29.75
Microsoft Corpora
+0.00
MacNews Search:
Community Search:
view counter

view counter
view counter
view counter
view counter
view counter
view counter
view counter
view counter

Domino! Review
Domino! Review By Jason Wadsworth on May 21st, 2012 Our Rating: :: CLASSIC WITH FRIENDSiPhone App - Designed for the iPhone, compatible with the iPad Play dominoes with friends online in this social gaming title.   Developer: Flyclops | Read more »
Juggernaut: Revenge of Sovering Review
Juggernaut: Revenge of Sovering Review By Kevin Stout on May 21st, 2012 Our Rating: :: MINI-GAME-FULUniversal App - Designed for iPhone and iPad Juggernaut: Revenge of Sovering is an RPG with great graphics and Infinity Blade-like combat.   | Read more »
Sheep Up! Review
Sheep Up! Review By Rob Rich on May 21st, 2012 Our Rating: :: BAA-BAA-BOUNCEUniversal App - Designed for iPhone and iPad Who knew something as simple as a change in perspective could make such a big difference?   | Read more »
Uncover the Lost Levels in Where’s My Wa...
Fans of Disney Mobile’s hit game Where’s My Water - both the free and paid version – have a lot to be happy about. Disney just added iCloud support for cross-device game synching, and lots of new levels. | Read more »
Scotland Yard Review
Scotland Yard Review By Rob Rich on May 21st, 2012 Our Rating: :: A RELENTLESS PURSUITUniversal App - Designed for iPhone and iPad Whether avoiding detectives or tracking a master criminal, Scotland Yard makes for a good time.   | Read more »
iHeartRadio Hits Major Subscriber Milest...
It seems like just yesterday that radio giant Clear Channel announced the launch of their new music streaming app iHeartRadio.  A few months later the company announced the first annual iHeartRadio Music Festival, bringing in big name acts like Jay-Z, Coldplay and Lady Gaga to perform.  Talk about a way to get your app out there! | Read more »
Bug Assault Review
Bug Assault Review By Lisa Caplan on May 21st, 2012 Our Rating: :: GREAT FOR KIDSUniversal App - Designed for iPhone and iPad Bug Assault brings a fun new control mechanic to this Bug Zapper sequel.   | Read more »
King Pong Takes Crowdsourcing To The Nex...
It seems like every developer nowadays is using Kickstarter as an excuse to work on that pet project they have been kicking around for the last decade.  However, every once in a while someone wants to try something very different, to work towards the betterment of the medium.  Developer App-Different is looking to do just that with the launch of... | Read more »
Jake Escapes HD Review
Jake Escapes HD Review By Kevin Stout on May 21st, 2012 Our Rating: :: SHORT GAMEiPad Only App - Designed for the iPad Jake Escapes HD is a window-jumping action game with humorous thief, Jake.   | Read more »
Put Your Child In The Story With It’s Me...
Parents know that the iPad is a fantastic resource of storybook style apps, ideal for young children. They’ve probably already read the tale of Peter Pan to their kids, either through an app or through a traditonal book. So what makes It’s Me! Peter Pan stand out? It allows kids to get right inside the action. Parents are able to customize the app... | Read more »
All contents are Copyright 1984-2010 by Xplain Corporation. All rights reserved. Theme designed by Icreon.