TweetFollow Us on Twitter

June 94 - Newton Q & A: Ask the Llama

Newton Q & A: Ask the Llama

Newton Developer Techical Support

Q Here's something that's been puzzling me a bit: I want to pop up something like a copyright message for ten seconds when my application starts up. So I drew up a layout called Presents with a protoFloater containing all the necessary text. In my main layout is a link to Presents called presentsLink. The following is the viewShowScript for the topmost view in my application:

func()
begin
	presentsLink:open();
	AddDelayedAction(presentsLink:close(), nil, 10000)
end

This says to me: open the linked view, wait ten seconds, and close it. And that's exactly what it does, except that after the view is closed, there's an exception. What am I doing wrong and how do I fix it? 

The short answer is that the second argument to the AddDelayedAction function is of the wrong type. This argument is supposed to be an array of parameters to be passed to the delayed function, and nil is not an array. The proper syntax for no arguments is [] instead of nil.

But there's more: Although the closure you supplied in the first argument works in this case, you should get out of the habit of using that type of function call for delayed or deferred actions. You're better off providing a full closure and sending in the view you want closed, as in this:

func()
begin
	// Define a closure to use in the delayed action.
	local myClose := func(whichView)
		whichView:Close();

	presentsLink:Open();
	AddDelayedAction(myClose, [presentsLink], 10000);
end

Unfortunately, things do not end there. You also need to make sure that the myClose function is in internal RAM. The best way to do this is to use DefConst to define the function:

// In your ProjectData file:
DefConst('kDelayedClose, func(whichView) whichView:Close());

// This changes the function above:
func()
begin
	presentsLink:Open();
	AddDelayedAction(EnsureInternal(kDelayedClose),
		[presentsLink], 10000);
end

However, there is an easier solution. Instead of doing a delayed action you can use the view idle mechanism to do what you want. All you need to do is add a viewIdleScript and viewIdleFrequency to the presentsLink top-level view. The viewIdleScript simply sends a Close message. The viewIdleFrequency is set to the desired delay (10000 in this case).

The really short answer is that you can just use protoGlance. This proto has the show-and- disappear behavior built in. You can set the viewIdleFrequency to 10000 to get the behavior you want.

Q I have an alphabetically sorted list of items in a protoTable and I want to use protoa2z to quickly move through the table (like the cardfile overview). How do I do it? 

The first thing you need to do is find the index in the protoTable of the correct item (that is, find the right item in the def.tabValues array of the protoTable). How you do this will depend on what type of data you're representing. Then you can figure out how high each item in the protoTable is, set the VOrg slot of the table to the correct line, and force the protoTable to redraw. You probably want to make sure that you don't scroll off the bottom of the table. Below is a method you can add to your protoTable that will do what you want. You can then send the message from your a2zChanged method (make sure you send the message to the protoTable).

func(index)
begin
	// Figure out the height of an item in the table.
	local childHeight := if def.tabProtos.viewFont exists then
		fontHeight(def.tabProtos.viewFont)
	else
		fontHeight(viewFont);
	
	// Make sure that the table will not scroll off the end
	// by calculating the index of the bottommost item that
	// will be displayed.
	local largestIndex := def.tabDown - ((:LocalBox().bottom -
		:LocalBox().top) DIV childHeight) - 1;
	
	// Use the bottommost item (largestIndex) to make sure
	// the table has no empty space on the bottom.
	vOrg := MIN(index, largestIndex);
	
	// Now force the table to redraw.
	:RedoChildren();
end

Q I would like to use the protoa2z sample code in my application, but I can't figure out how to set the highlighted letter when the user scrolls through my data. 

It's easy once you realize that protoa2z is based on a protoPictIndexer. All you have to do is a SetValue of the currIndex slot to the correct index. This will change the highlighting of the protoa2z.

Note that using SetValue will not call the IndexClickScript, but this is probably what you want. If you do want it to be called, you'll have to manually unhighlight the current selection, set the currIndex slot, and then highlight the new item. The appropriate code would be

a2z:Unhilite();
a2z.currIndex := newIndex;
a2z:Hiliter(newIndex);

Q What is your quest? 

To answer the questions of those who develop for Newton.

Q I tried to use a protoPictRadioButton in my application but the highlight rectangle isn't the right size. I know that I need to write some code to draw the correct-sized highlight, but where do I hook it in? 

Minimally you need to override the viewDrawScript of the protoPictRadioButton. You may also want to change the viewFormat since it defaults to a thick rounded-rectangle border. Assuming that you wanted some sort of rectangle highlight around the selected button, you could use the following viewDrawScript:

func()
begin
	// If the button is selected, highlight it.
	if viewValue then
	begin
	// Get the bounds of the protoPictRadioButton.
	local b := :LocalBox();
	
	// Inset the bounds.
	b.top := b.top + 2;
	b.left := b.left + 2;
	b.bottom := b.bottom - 2;
	b.right := b.right - 2;
	
	// Now draw a rectangle.
	:DrawShape(MakeRect(b.left, b.top, b.right, b.bottom), nil);
	end;
end

Q What is the AutoClose checkbox in the Newton Toolkit for? Why should I use it? 

The AutoClose flag causes all other AutoClose applications to be closed when your application is clicked. The effect is that only one "auto-close" application can be open at one time. You should always  make your application auto-close, to help conserve memory and other resources, unless it's providing special functionality to other applications (like the built-in Calculator or Styles application).

Q How do I create my own class of binary object? 

To get a binary object of your own class, you first need to create a binary object, then change its class to your own. The easiest way to do this is to create a string that's the same length as your intended binary object and then change (coerce) the class of this new object to your own class. You can use the string class as your basic binary object.

Suppose you wanted to have a binary class called CharID for an ID consisting of four ASCII characters. You could write a NewID function in your ProjectData file that would create the object and optionally initialize it, like this:

// Define a constant for a default CharID object. This constant
// can be cloned at run time. kDefaultCharIDObj will be a CharID
// object with 4 bytes that are set to 0x00.
DefConst('kDefaultCharIDOBj, SetClass(SetLength("", 4),
         'CharID));

// CharString is a string of 4 characters or nil.
NewCharID := func(CharString)
begin
	// Create a binary object of the correct length.
	local newObj := Clone(kDefaultCharIDObj);
	
	// Optionally initialize it.
	if CharString then
	for i := 0 to 3 do
		StuffChar(newObj, i, CharString[i]);
	
	// Return the new object.
	newObj;
end;

To see this code in action, you can type it into the Inspector window in the Newton Toolkit and evaluate it. Note that you cannot use DefConst in the Inspector since it's a compile-time function. Just substitute the second argument in the DefConst function for kDefaultCharIDObj in the function to evaluate it. Then you can try things like this:
x := :NewCharID(nil);
#440DD01 <CharID, length 4>
ExtractChar(x, 2);
#6 $\00
x := NewCharID("abcd");
#4410FC9 <CharID, length 4>
ExtractChar(x, 2);
#636 $c
ExtractByte(x, 2);
#18C 99

Q What is your favorite color? 

Llama fur beige.

Q In my application I have a clPictureView that can display a variable number of pictures. Right now I create a bunch of picture slots in my application and then make another slot at run time that is an array of those items. There must be an easier way. 

You're right; there is an easier way. You can use the GetPictAsBits function in your ProjectData file to read in the bitmaps. Note that you'll first have to open the resource file that contains the pictures.

// Open the resource file that contains the pictures.
// Assumes the file "Pictures" exists in the project folder.
r := OpenResFileX("Pictures");

// Get an array of pictures.
myPictures := [
	GetPictAsBits("TARDIS", nil),
	GetPictAsBits("Planet", nil)
];

// Now close the resource file.
CloseResFileX(r);

Once you have the myPictures array, you can create a slot of type Evaluate and just type "myPictures" in the editor for the slot. Then you can use SetValue to set the icon slot of the clPicture view to one of the elements of the array.

Q How do I put my own default person in the fax information slip? 

You can set up a default person in your SetupRoutingSlip method, which is called before the fax slip is shown. The argument to that method is used to set up the particular routing slip. In the case of a fax slip, there's a slot called "alternatives" which is an array of cardfile entries for the possible people to fax to. If there's just one entry, that's the person. The fax number will be set from the cardfile entry. So your SetupRoutingSlip method would look like this:

func(fields)
begin
	// Check for a fax.
	if fields.category = 'faxSlip then
	fields.alternatives := SmartCFQuery("Llama");
	// Do other stuff here, like put a title for the out box.
end

Note that the fields.category is set to the same value you set in the routeSlip slot of a frame in your application's entry in the global routing frame. The SmartCFQuery function returns an array of cardfile entries that have strings starting with the string passed in.

Q I noticed that every soup entry has a _uniqueID slot. Just how unique is it? 

The _uniqueID slot is only unique within that soup on that particular store. The ID will never be reused in that soup on that store. However, it's not necessarily unique across stores (say, RAM and a PCMCIA card).

Q What is the ground velocity of an unladen llama climbing a 5% grade? 

What do you mean -- Mexican or Venezuelan?


The llama is Thanks Have more questions?

 
AAPL
$103.30
Apple Inc.
+0.80
MSFT
$45.09
Microsoft Corpora
-0.34
GOOG
$577.33
Google Inc.
+5.73

MacTech Search:
Community Search:

Software Updates via MacUpdate

TextSoap 7.4.0 - Flexible text editing u...
TextSoap is for people who work with text. TextSoap effortlessly cleans up text from endlessly different formats. Wash away unwanted characters, spaces, tabs. Fix paragraphs with hard returns at the... Read more
NetShade 6.0.2 - Browse privately using...
NetShade is an Internet security tool that conceals your IP address on the web. NetShade routes your Web connection through either a public anonymous proxy server, or one of NetShade's own dedicated... Read more
Mac DVDRipper Pro 5.0 - Copy, backup, an...
Mac DVDRipper Pro is the DVD backup solution that lets you protect your DVDs from scratches, save your batteries by reading your movies from your hard disk, manage your collection with just a few... Read more
pwSafe 3.1 - Secure password management...
pwSafe provides simple and secure password management across devices and computers. pwSafe uses iCloud to keep your password databases backed-up and synced between Macs and iOS devices. It is... Read more
StatsBar 1.8 - Monitor system processes...
StatsBar gives you a comprehensive and detailed analysis of the following areas of your Mac: CPU usage Memory usage Disk usage Network and bandwidth usage Battery power and health (MacBooks only)... Read more
Path Finder 6.5.5 - Powerful, award-winn...
Path Finder is a file browser that combines the familiar Finder interface with the powerful utilities and innovative features. Just a small selection of the Path Finder 6 feature set: Dual pane... Read more
QuarkXPress 10.2.1 - Desktop publishing...
With QuarkXPress, you can communicate in all the ways you need to -- and always look professional -- in print and digital media, all in a single tool. Features include: Easy to Use -- QuarkXPress is... Read more
Skype 6.19.0.450 - Voice-over-internet p...
Skype allows you to talk to friends, family and co-workers across the Internet without the inconvenience of long distance telephone charges. Using peer-to-peer data transmission technology, Skype... Read more
VueScan 9.4.41 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Cloud 3.0.0 - File sharing from your men...
Cloud is simple file sharing for the Mac. Drag a file from your Mac to the CloudApp icon in the menubar and we take care of the rest. A link to the file will automatically be copied to your clipboard... Read more

Latest Forum Discussions

See All

Modern Combat 5 Gets a Major Multiplayer...
Modern Combat 5 Gets a Major Multiplayer Update Posted by Jessica Fisher on September 2nd, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Alien Creeps TD Review
Alien Creeps TD Review By Jennifer Allen on September 2nd, 2014 Our Rating: :: EXPENSIVE DEFENSESUniversal App - Designed for iPhone and iPad Alien Creeps TD would be a fun if unremarkable Tower Defense game, but its heavy focus on... | Read more »
The Journey Down: Chapter Two Review
The Journey Down: Chapter Two Review By Jennifer Allen on September 2nd, 2014 Our Rating: :: DARK YET ENTICINGUniversal App - Designed for iPhone and iPad It’s a little dark, in every sense of the word, but The Journey Down:... | Read more »
Function Space, a Social Network App for...
Function Space, a Social Network App for Science, Launches on iOS Posted by Ellis Spice on September 2nd, 2014 [ permalink ] | Read more »
Stupidfast – How Taylor Martinez Switche...
How do you make an Endless Running game more than just another Endless Running game? By adding real life prizes to it, of course! That’s the thinking behind StupidFast: a game designed for football enthusiasts, and the brainchild of former college... | Read more »
Little Raiders: Robin’s Revenge Review
Little Raiders: Robin’s Revenge Review By Jennifer Allen on September 2nd, 2014 Our Rating: :: CASUAL RAIDINGUniversal App - Designed for iPhone and iPad Combining simple combat with village building is a potent combination for... | Read more »
Treasure Tombs: Ra Deal Coming from Bulk...
Treasure Tombs: Ra Deal Coming from Bulkypix and Dark Tonic This Fall Posted by Jessica Fisher on September 2nd, 2014 [ permalink ] Dark Tonic and | Read more »
Pirate Bash Review
Pirate Bash Review By Nadia Oxford on September 2nd, 2014 Our Rating: :: BAD PIRATES, GOOD TIMESUniversal App - Designed for iPhone and iPad Pirate Bash’s turn-based battles add an intriguing twist to a typical physics game.   | Read more »
Tiny Tower Vegas Review
Tiny Tower Vegas Review By Jennifer Allen on September 2nd, 2014 Our Rating: :: STEADY DEVELOPMENTUniversal App - Designed for iPhone and iPad Build a huge tower again but Vegas-style in Tiny Tower Vegas.   | Read more »
The Manhattan Project Review
The Manhattan Project Review By Andrew Fisher on September 2nd, 2014 Our Rating: :: ROCKET SCIENCEUniversal App - Designed for iPhone and iPad The Manhattan Project offers a great Euro-style gameplay experience, but it is totally... | Read more »

Price Scanner via MacPrices.net

Apple refurbished iPads available for up to $...
Apple is offering Certified Refurbished iPad Airs for up to $140 off MSRP. Apple’s one-year warranty is included with each model, and shipping is free. Stock tends to come and go with some of these... Read more
Are We Now In The Post-Post-PC Era?
A longtime and thoroughgoing laptop aficionado, I was more than a little dismayed by Steve Jobs’s declaration back in 2010 when he sprang the iPad on an unsuspecting world. that we’d entered a “post-... Read more
PC Outlook Improves, But 2014 Shipments Still...
According to the International Data Corporation (IDC) Worldwide Quarterly PC Tracker, worldwide PC shipments are expected to fall by -3.7 percent in 2014. To hat’s actually an improvement from the... Read more
IDC Lowers Tablet Sales Projections for 2014...
Following a second consecutive quarter of softer than expected demand, International Data Corporation (IDC) has lowered its worldwide tablet plus 2-in-1 forecast for 2014 to 233.1 million units. The... Read more
Apple now offering refurbished 21-inch 1.4GHz...
The Apple Store is now offering Apple Certified Refurbished 21″ 1.4GHz iMacs for $929 including free shipping plus Apple’s standard one-year warranty. Their price is $170 off the cost of new models,... Read more
Save $50 on the 2.5GHz Mac mini, on sale for...
B&H Photo has the 2.5GHz Mac mini on sale for $549.99 including free shipping. That’s $50 off MSRP, and B&H will also include a free copy of Parallels Desktop software. NY sales tax only. Read more
Save up to $300 on an iMac with Apple refurbi...
The Apple Store has Apple Certified Refurbished iMacs available for up to $300 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free. These are the best prices on... Read more
The Rise of Phablets
Carlisle & Gallagher Consulting Group, a businesses and technology consulting firm focused solely on the financial services industry, has released an infographic depicting the convergence of... Read more
Bad Driver Database App Allows Good Drivers t...
Bad Driver Database 1.4 by Facile Group is a new iOS and Android app that lets users instantly input and see how many times a careless, reckless or just plain stupid driver has been added to the... Read more
Eddy – Cloud Music Player for iPhone/iPad Fre...
Ukraine based CapableBits announces the release of Eddy, its tiny, but smart and powerful cloud music player for iPhone and iPad that allows users to stream or download music directly from cloud... Read more

Jobs Board

*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
Senior Event Manager, *Apple* Retail Market...
…This senior level position is responsible for leading and imagining the Apple Retail Team's global event strategy. Delivering an overarching brand story; in-store, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.