TweetFollow Us on Twitter

November 93 - TDialogBehaviors

TDialogBehaviors

Bob Hablutzel

This article is the first article in what I hope will be a regular series of technical questions and answers on object oriented programming. The intent of this column is to go beyond simple answers. I intend to take a question, answer it, and then use that question as a springboard to a more general discussion on programming. I hope you find the results interesting.

The first articles will be culled from frequently asked questions on MacApp3Tech$, but I need your questions! I can be reached electronically at AppleLink: B.HABLUTZEL; by telephone at 708.328.0130; or by post at Bob Hablutzel, Hablutzel Consulting, 606 Asbury, Evanston, IL, USA 60202.

Q: I need to create a modal dialog using MacApp 3.0. I create the dialog using ViewEdit, but when I attempt to pose the dialog it opens briefly and immediately closes. How can I create a modal dialog?

A: Modal dialogs in MacApp 3.0 are handled with a TDialogBehavior, which is attached to the dialog window. This behavior is responsible for receiving and handling keystrokes, looking for keystrokes that dismiss the dialog, and sending events off to the appropriate control.

The problem with ViewEdit (in this case) is that it does not attach a TDialogBehavior to the dialog when it is created. When TWindow::PoseModally() is called, the first thing it does is attempt to locate the dialog behavior; if this lookup fails it closes the window and returns immediately (returning kNoIdentifier as the dismisser).

There are a few work-arounds for this. In ViewEdit, you can add a TDialogView to the window. TDialogView is really not required in MacApp 3.0; it is a holdover from the old mechanisms in MacApp 2.0. However, if there is one in the window, it will cause the TDialogBehavior to be added when the window is opened.

Alternatively, you can create the TDialogBehavior yourself, and attach it to the window before the TWindow::PoseModally() method is called. When you create the dialog behavior, you have to supply the identifiers for the default and cancel items (in the call to IDialogBehavior()). Once this behavior is added to the window, TWindow::PoseModally() can be called.

You can also call TWindow::SetModality() before calling TWindow::PoseModally(). This method will create the dialog behavior if none exists. However, this routine may not properly set up the default and cancel identifiers; you would then have to call TWindow::GetDialogBehavior() to retrieve the dialog, and stuff the identifiers into its fCancelItem and fDefaultItem fields.

Even if you do all of this, the dialog will still not dismiss properly unless you change the default event for the dismissing control to mDismiss (==34). So if you use ViewEdit to create the dialog, you need to change the event number for the control by hand. If you leave the control at its default event number (mButton for TButtons), the control will activate, but the dialog will not dismiss.

Finally, the best solution is to avoid using ViewEdit. Either AdLib or IcePick (3.0) will add the dialog behavior to the window when you use them to create the dialog. Using either of these products will ensure that the dialog has the appropriate behavior. These programs will also take care of changing the event number for the dismissing controls to mDismiss for you. (Both these applications are available from MADA).

More About TDialogBehavior

It is somewhat interesting to notice the actual mechanism used to handle the dismissing of the modal dialogs. The TDialogBehavior does not in itself dismiss the dialog, which as we will see in a second has some interesting implications. The TDialogBehavior simply activates the control that is designated as the default (or cancel) item. It does this by sending the control its default event number. The control then accepts the event, reacts appropriately (in the case of a TButton, it flashes), and sends the event up the event chain.

The event eventually reaches the TDialogBehavior attached to the window, which checks the see if the event is mDismiss. Notice that this is the first time that the behavior checks the event type. If the event is mDismiss, the behavior records the identifier of the source of the event in the fDismisser field, and ends the modal posing. TWindow::PoseModally(), which started the modal posing in the first place, retrieves the value of the TDialogBehavior::fDismisser field, and returns that as the result of the modal posing.

What is interesting about all this is that TDialogBehavior does not necessarily have to be used with modal dialogs; it can be used with modeless dialogs just as easily. When the return key is struck, for example, the default item will be invoked. If you attach a behavior to the default control that intercepts that control's default event number, you can quickly and easily create modeless dialogs that contain default (and closing) items.

Take, for example, a drawing application that supports 1° rotations. A modeless dialog could be created that presents the user with the number of degrees of rotation, and a default Rotate button. Every time the user strikes the return key, the Rotate button would be activated. You could attach a behavior to the Rotate button that checks for events where (a) the source of the event is the owner of the behavior, and (b) the event number matches the default event number (fEventNumber) of the owner. When it receives an event that matches this criteria, it would create whatever command was responsible for the rotation of the object, and post it to the application.

The question of where to attach the behavior is an interesting one. The behavior can be attached anywhere in the event chain and still function properly. It is mostly a question of style to decide where the behavior best fits.

For example, if the behavior is attached to the button itself, it will clearly get the event that the button generates. However, if the button does not handle the event, it will pass the event up the event chain; for views this means that the superview will receive the event. This passing along continues through each respective superview until someone handles the event, the TWindow used to draw the dialog will get the event eventually, provided no-one else has handled it.

In the example above, there are two ways of designing the interface. If the TNumberText used to hold the rotation amount is just a generic TNumberText, then it would make sense to have the behavior attached to the dialog. This would allow the dialog access to a child view to retrieve the rotation amount. (If the behavior were attached to the button, it would have to access a sibling view to retrieve the rotation amount; there is nothing actually wrong with this but it forces the dialog to have additional information about its environment, which will limit its overall reusability).

However, if the TNumberText holding the rotation amount where overridden to set a value in the application (fRotationAmount, e.g.) when stopping editing, then the behavior could be attached to the button. In this case, the button would be set to want to become the target of the view. When the user clicks this button, the TNumberText would resign its target, which would cause it to stop editing, which in turn would cause it to update the application value. The button would then be free to post a command using this value.

Finally, we can take this one step further, and change the default event number of the button from mButtonHit to some application defined event (mRotate, e.g. ). We could then attach a behavior to the application that looks for the mRotate event and creates the appropriate command. This would allow us the flexibility of generating the mRotate command in multiple places in our interface, and handling them all identically. (Remember that the dialog we are discussing is modeless; this would not work in a modal dialog as it requires the event number of the default button to be mDismiss).

Once you understand how they function, TDialogBehaviors provide a simple, generic means of handling a common user interface problem. By carefully using them in cooperation with other built-in mechanisms, powerful interfaces can be designed with a minimum of coding. They can be used with modeless as well as modal dialogs, giving you complete freedom in designing your interface.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

iExplorer 4.1.10 - View and transfer fil...
iExplorer is an iPhone browser for Mac lets you view the files on your iOS device. By using a drag and drop interface, you can quickly copy files and folders between your Mac and your iPhone or... Read more
iExplorer 4.1.10 - View and transfer fil...
iExplorer is an iPhone browser for Mac lets you view the files on your iOS device. By using a drag and drop interface, you can quickly copy files and folders between your Mac and your iPhone or... Read more
Adobe InCopy CC 2018 13.0.1.207 - Create...
InCopy CC 2018 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous InCopy customer). Adobe InCopy CC 2018, ideal for large team projects... Read more
Microsoft Office 2016 15.40 - Popular pr...
Microsoft Office 2016 - Unmistakably Office, designed for Mac. The new versions of Word, Excel, PowerPoint, Outlook and OneNote provide the best of both worlds for Mac users - the familiar Office... Read more
Adobe InDesign CC 2018 13.0.1.207 - Prof...
InDesign CC 2018 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous InDesign customer). Adobe InDesign CC 2018 is part of Creative Cloud.... Read more
Apple iOS 11.1.2 - The latest version of...
iOS 11 sets a new standard for what is already the world’s most advanced mobile operating system. It makes iPhone better than before. It makes iPad more capable than ever. And now it opens up both to... Read more
Slack 2.9.0 - Collaborative communicatio...
Slack is a collaborative communication app that simplifies real-time messaging, archiving, and search for modern working teams. Version 2.9.0: Slack now officially, and fully, supports Japanese.... Read more
iExplorer 4.1.9 - View and transfer file...
iExplorer is an iPhone browser for Mac lets you view the files on your iOS device. By using a drag and drop interface, you can quickly copy files and folders between your Mac and your iPhone or... Read more
PCalc 4.5.3 - Full-featured scientific c...
PCalc is a full-featured, scriptable scientific calculator with support for hexadecimal, octal, and binary calculations, as well as an RPN mode, programmable functions, and an extensive set of unit... Read more
iExplorer 4.1.9 - View and transfer file...
iExplorer is an iPhone browser for Mac lets you view the files on your iOS device. By using a drag and drop interface, you can quickly copy files and folders between your Mac and your iPhone or... Read more

Latest Forum Discussions

See All

Mighty Battles guide - how to build a so...
Mighty Battles, the latest title from Hothead Games, is set to take the App Store by storm. The game puts a welcome twist on lane battlers, adding FPS elements to spice things up a bit. You'll collect cards to put your own military unit to gether,... | Read more »
Rules of Survival guide - how to be the...
The PUBG craze makes its way to mobile, with more and more battle royale games debuting on iOS and Android. Rules of Survival joins the ranks of mobile PUBG-likes, offering a classic battle royale experiences that doesn't vary too much from its... | Read more »
The best new games we played this week -...
The weekend is upon us friends, and it's time to take a look back and reflect on all of the wonderful games we've played over the past few days. This week was jam packed with new releases. There were some big, long awaited launches, some fun... | Read more »
Lineage II: Revolution guide - tips and...
At long last, Lineage II: Revolution has now come to western shores, bring Netmarble's sweeping MMORPG to mobile devices. It's an addictive, epic experience, but some of the systems in the game can be a bit overwhelming. Here are a few tips to help... | Read more »
A Boy and His Blob (Games)
A Boy and His Blob 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: | Read more »
Fight terrible monsters and collect epic...
Released on Western markets early last month, Dragon Project, created by Japanese developer COLOPL, brings epic monster hunting action to mobile for the very first time. Collect a huge array of weapons and armor, and join up with friends to fight... | Read more »
I Am The Hero (Games)
I Am The Hero 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: I Am The Hero is a pixel art, beat 'em up, fighting game that tells the story of a "Hero" with a glorious but mysterious past.... | Read more »
Kauldron (Music)
Kauldron 1.0 Device: iOS Universal Category: Music Price: $3.99, Version: 1.0 (iTunes) Description: Kauldron is our warmest sounding, punchiest synth yet! A completely new modeling technology, combined with carefully designed... | Read more »
Lineage II: Revolution is mobile’s bigge...
NCSoft’s hit fantasy MMORPG series has just made the leap to mobile with the help of Netmarble in Lineage II: Revolution. With over 1.5 million players having already pre-registered ahead of the game’s launch, Revolution hit the app stores... | Read more »
Swing skilfully in new physics-based pla...
Sometimes it’s the most difficult of obstacles that can be the most rewarding. One game hoping to prove this is OCMO, the new tough but fair platformer from developers Team Ocmo. Primed to set every speedrunner’s pulse racing, as an otherworldly... | Read more »

Price Scanner via MacPrices.net

Black Friday pricing on Macs and iPads now av...
B&H Photo has lowered prices on many Macs, iPads, and iPad Pros as part of their Black Friday week sale. Save up to $200 on MacBooks and iMacs and up to $150 on iPads. B&H charges sales tax... Read more
Best Apple iPad deals this weekend, up to $80...
Apple resellers are offering 9.7″ iPads and 10.5″ iPad Pros for up to $80 off MSRP this weekend as part of their early Holiday and Black Friday sales: Adorama is offering new 2017 9.7″ 32GB WiFi... Read more
Early Black Friday sale: Apple iMacs for up t...
B&H Photo has 27-inch iMacs in stock and on sale for up $130-$150 off MSRP including free shipping. B&H charges sales tax in NY & NJ only: – 27″ 3.8GHz iMac (MNED2LL/A): $2149 $150 off... Read more
Apple restocks refurbished Mac minis starting...
Apple has restocked Certified Refurbished Mac minis starting at $419. Apple’s one-year warranty is included with each mini, and shipping is free: – 1.4GHz Mac mini: $419 $80 off MSRP – 2.6GHz Mac... Read more
Save on 12″ MacBooks, Apple refurbished model...
Apple has Certified Refurbished 2017 12″ Retina MacBooks available for $200-$240 off the cost of new models. Apple will include a standard one-year warranty with each MacBook, and shipping is free.... Read more
Early Holiday sale: 12″ iPad Pros for up to $...
B&H Photo has 12″ iPad Pros on sale today for up to $130 off MSRP. Shipping is free, and B&H collects no sales tax outside NY & NJ: – 12″ 64GB WiFi iPad Pro: $749, save $50 – 12″ 256GB... Read more
Holiday sale prices on Apple 13″ MacBook Pros...
B&H Photo has 2017 13″ MacBook Pros in stock today and on sale for $100-$150 off MSRP, each including free shipping plus NY & NJ sales tax only: – 13-inch 2.3GHz/128GB Space Gray MacBook Pro... Read more
Sale: 13″ MacBook Airs starting at $899, $100...
B&H Photo has 2017 13″ MacBook Airs on sale today for $100 off MSRP including free shipping. B&H charges NY & NJ sales tax only: – 13″ 1.8GHz/128GB MacBook Air (MQD32LL/A): $899, $100 off... Read more
Week’s Best Deal on 13″ MacBook Pros: Apple r...
Apple has a full line of Apple Certified Refurbished 2017 13″ MacBook Pros available for $200-$300 off MSRP. A standard Apple one-year warranty is included with each MacBook, and shipping is free.... Read more
Deal: 15″ 2.6GHz MacBook Pro for $1799 w/free...
B&H Photo has clearance 2016 15″ 2.6GHz Touch Bar MacBook Pros in stock today and available for $600 off original MSRP. Shipping is free, and B&H charges NY & NJ sales tax only: – 15″ 2.... Read more

Jobs Board

Product Manager - *Apple* Pay on the *Appl...
Job Summary Apple is looking for a talented product manager to drive the expansion of Apple Pay on the Apple Online Store. This position includes a unique Read more
*Apple* Pro/Consumer Apps Support Engineer -...
…exemplify AppleCare's expert technical support paired with exceptional customer service for Apple 's software apps. This person is a problem solver, who understands Read more
Partner Marketing Manager, *Apple* Pay - Ap...
Job Summary The Apple Pay partner marketing team is looking for a Marketing Manager to develop and drive US programs. The right candidate will be passionate about Read more
*Apple* Solution Consultant - Apple (United...
# Apple Solution Consultant - Rochester, MN Job Number: 113037950 Rochester, MN, Minnesota, United States Posted: 19-Sep-2017 Weekly Hours: 40.00 **Job Summary** Are Read more
Sr. Experience Producer, Today at *Apple* -...
# Sr. Experience Producer, Today at Apple Job Number: 56495251 Santa Clara Valley, California, United States Posted: 23-Jun-2017 Weekly Hours: 40.00 **Job Summary** Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.