TweetFollow Us on Twitter

TML Pascal Tricks
Volume Number:6
Issue Number:3
Column Tag:Pascal Procedures

TML Pascal Tricks

By Paul Diegenbach, Amsterdam, the Netherlands

XCMD - drawing in a Hypercard stack

The attractiveness of Hypercard is for a large part due to it graphical possibilities. Nice cards always mean nice graphics. The Hypertalk language allows drawing on the screen under program control. When we tear the tools menu off the menubar, we can actually see the actions as the tools flop from pen to brush to marquee and so on. Nice to watch, but oh so slow. Ever tried to draw a complicated graph in Hypercard? I tried it in an attempt to simulate the differentiation of an egg to all the different cells an embryo consists of. One of the theories implies the evaluation of some differential equations and then drawing a thousand points on the screen.

The idea was to let students be able to change the parameters in the equations and see the results in a user-friendly environment. The first step was to implement the equation solving in Hypertalk. Too slow, so an XCMD was quickly written. Drawing the results by Hypertalk: still to slow, so why not do the drawing in the XCMD as well? In a first result the drawing looks nice, but as soon as Hypercard updates the screen from its offscreen bitmap, the drawing disappears. The solution to this problem is to copy the drawing in the paste buffer (scrap) and paste it into Hypercard using the paste command from the menu. This combination works fine and quick. The skeleton for the XCMD is given below, in TML-Pascal, with a Fourier-demo in the drawing part to make it less dumb. In this demo we use parameters from Hypercard for the size of the rectangle and for the Fourier coefficients. Although not necessary, it is often handy to give the rectangle parameters. They can easily be estimated by having a temporary field of the same size and asking in the message window ‘put the size of card field tmp into msg’. The Hypercard stack with this demo implemented is on the source disk for this month.

To avoid flicker between the copy and paste, it is convenient to lock the screen before the XCMD is used. Users of other Pascals sometimes need to remove the ParamPtr parameter, that is the first parameter in every call to the glue routines:

{1}

UNIT PictToScrp;
(******************************************************      
This XCMD demodnstrates a method to plot and calculate in Pascal (perhaps 
with floating point processor enabled) and then copy and paste the picture 
in the card compile and link as follows (assuming Fourier is an existing 
stack):
  
  TMLPascal Fourier.p
or:  ( really fast on a mac II)
  TMLPascal Fourier.p  -MC68020 -MC68881 -d Elems881=true

  Link -w -t ‘STAK’ -c ‘WILD’ 
  -m FOURIER -rt XCMD=1282 -sg Fourier 
   Fourier.p.o 
   “{Libraries}”Runtime.o 
   “{Libraries}”Interface.o 
   “{TMLPLibraries}”TMLPasLib.o 
   “{Libraries}”HyperXLib.o 
   -o “Fourier”

 Hypercard call :
  set the lockscreen to true
  -- prevents flicker
  Fourier  330,14,480,319,10,7,5,3,4
  -- 330,14,480 is the area to draw into
  -- 10,7,5,3,4  are the fourier factors times 10
  set the lockscreen to false
 ******************************************************)

INTERFACE

  USES MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, PasLibIntf, HyperXCMD;

  PROCEDURE Fourier(ParamPtr: XCMDPtr);

IMPLEMENTATION

  PROCEDURE PictScrap(ParamPtr: XCMDPtr); FORWARD;

  PROCEDURE Fourier(ParamPtr: XCMDPtr);
    BEGIN
      PictScrap(ParamPtr);
    END;

  PROCEDURE PictScrap(ParamPtr: XCMDPtr);
    VAR
      thePoint     : Point;
      hPicture     : PicHandle;
      rg           : rect;
      Piclength    : LONGINT;
      xoffset, yoffset: integer;
      str          : str255;
      xLeft, bot, top, xRight: LONGINT;
      one, two, three, four, five: LONGINT;
      x, y         : extended;
      z1, z2, z3, z4, z5: extended;

PROCEDURE MyDrawing;
 { all your drawing stuff goes here }
      VAR
        i            : integer;
        maxim, offset: extended;

      FUNCTION Sinus(x: extended): extended;
        BEGIN
          Sinus := sin(x) * z1 + sin(2 * x) * z2 + sin(3 * x) * z3 + 
sin(4 * x)  * z4 + sin(5 * x) * z5
 { the more, the better }
        END;

      BEGIN
        eraserect(rg);
        Framerect(rg); { optional }
        offset := top + (bot - top) / 2.0;
        z1 := one / 10.0;
        z2 := two / 10.0;
        z3 := three / 10.0;
        z4 := four / 10.0;
        z5 := five / 10.0;
        x := 0.02 {1 / 50} ;
        maxim := Sinus(x);
        FOR i := 2 TO 314 DO
          BEGIN
          IF i MOD 10 = 0 THEN
SendCardMessage(ParamPtr, ‘set cursor to busy’);
          x := i / 50;
          y := Sinus(x);
          IF maxim < y THEN
            maxim := y;
          END;

        x := 1 / 50;
        y := Sinus(x);
        maxim := 100 / maxim;
SendCardMessage(ParamPtr, ‘set cursor to busy’);
        moveto(xLeft + 1, round(y * maxim + offset));
        FOR i := 2 TO 314 DO
          BEGIN { for two pi }
          x := i / 50;
          y := Sinus(x);
lineto(i + xLeft + 1, round(y * maxim + offset))
          END;
SendCardMessage(ParamPtr, ‘set cursor to busy’);
        penpat(ltgray);
        moveto(xLeft + 1, round(offset));
        lineto(xRight - 2, round(offset));
        pennormal
      END;

    FUNCTION GetParameter(n: integer): LONGINT;
      VAR
        tmp          : LONGINT;
      BEGIN
        ZeroToPas(ParamPtr, ParamPtr^.params[n]^, str);
        stringToNum(str, tmp);
        GetParameter := tmp
      END;

    BEGIN
      IF ParamPtr^.paramCount <> 9 THEN
        SendCardMessage(ParamPtr, ‘put “wrong number of parameters” into 
msg’)
{ I think a more convenient way of error report than by ParamPtr^.ReturnValue 
}
      ELSE
        BEGIN
{get the drawing rectangle coordinates from hypercard }
        xLeft := GetParameter(1);
        top := GetParameter(2);
        xRight := GetParameter(3);
        bot := GetParameter(4);

{ In this example : get Fourier coëfficients from hypercard }
        one := GetParameter(5);
        two := GetParameter(6);
        three := GetParameter(7);
        four := GetParameter(8);
        five := GetParameter(9);
        setrect(rg, xLeft, top, xRight, bot);
        xoffset := xLeft + 5;
        yoffset := top + 5;
        cliprect(rg);
        hPicture := OpenPicture(rg);
        Showpen;
        MyDrawing; { here all your drawing }
        closepicture;
        Piclength := GethandleSize(handle(hPicture));
        IF ZeroScrap + putscrap(Piclength, ‘PICT’, ptr(hPicture^)) = 
NoErr THEN
     ParamPtr^.ReturnValue := PasToZero(ParamPtr, ‘’)
        ELSE
          ParamPtr^.ReturnValue := PasToZero(ParamPtr, ‘something wrong’);
SendCardMessage(ParamPtr, ‘choose select tool’);
SendCardMessage(ParamPtr, ‘domenu “Paste Picture”’);
SendCardMessage(ParamPtr, ‘choose browse tool’);
        END
    END;
END.

Small and Dirty “Write Always”

In the debugging of large programs we were accustomed to put a lot of ‘writeln’s’ in the source text to show what was happening. Although a workable solution on mainframes and mini’s, that’s not so easy in the Macintosh environment, there is not always a window available to write in. The following small subroutine (TML Pascal version) does the trick with some disadvantage: it overwrite all its lines on top of each other at the bottom of the screen in some kind of status line (bit like Online companion), but, sorry, the line is not automatically removed after leaving the program. Dirty isn’t it, so surely for debugging only. An ‘invalrect’ after each multifinder event and at the end of the program is sometimes a solution.

In the program source you write something like :

--2

 if dbg then DQText(‘now in procedure blahblah’)

(The clever one’s can write a MPW-script to put it after the first begin in every procedure or function) Dbg is used as a constant (or in a compiler directive).

The procedure (as a Pascal unit) looks like :

{3}

UNIT DQTextProcedure;
  INTERFACE
    USES
MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, QDaccess;
 
{ Tml pascals QDaccess defines:
 TYPE  QDGlobalsPtr = ^QDGlobalsRec;
    QDGlobalsRec =
      record
        randSeed   :  LongInt;
        screenBits :  BitMap;
        arrow      :  Cursor;
        dkGray     :  Pattern;
        ltGray     :  Pattern;
        gray       :  Pattern;
        black      :  Pattern;
        white      :  Pattern;
        ThePort    :  GrafPtr;
      end;
function QDGlobals: QDGlobalsPtr;external;}

PROCEDURE DQText(Message: Str255);
  IMPLEMENTATION
PROCEDURE DQText(Message: Str255);
VAR
  SavedPort    : GrafPtr;
  LocalPort    : GrafPort;
  TheRect      : Rect;
BEGIN
  WITH QDGlobals^ DO
    BEGIN
      GetPort(SavedPort);
      OpenPort(@LocalPort);
      SetPort(@LocalPort);
      WITH ScreenBits.Bounds DO
 { this is QDGlobals^ s ScreenBits ! }
SetRect(TheRect, Left, Bottom-20, Right, Bottom);
      FillRect(TheRect, White);
      MoveTo(TheRect.Left, TheRect.Top);
      LineTo(TheRect.Right, TheRect.Top);
      MoveTo(TheRect.Left+7, TheRect.Bottom-7);
      DrawString(Message);
      ClosePort(@LocalPort);
      SetPort(SavedPort);
   END;
END;
END.

PROGRAM tstDQtext;
  { test the dqtext procedure : }
  USES MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf,
    PaslibIntf, QDaccess, DQtext;
  (*
  link as :
    Link  -t ‘APPL’ -c ‘????’ 
      DQtext.p.o 
      tstDQtext.p.o 
      “{Libraries}”Runtime.o 
      “{Libraries}”Interface.o 
      “{TMLPLibraries}”TMLPasLib.o 
      -o tstDQtext
  *)
  BEGIN
    textbook(NIL); { TML pascal simple window }
    writeln(‘ see bottom line’);
    writeln(‘ click mouse button’);
    PLFlush(output);
    DQtext(‘before’);
    REPEAT
    UNTIL button;
    DQtext(‘after mouse button’);
    writeln(‘ type return to end program’);
    readln
  END.

 
AAPL
$100.96
Apple Inc.
-0.83
MSFT
$47.52
Microsoft Corpora
+0.84
GOOG
$596.08
Google Inc.
+6.81

MacTech Search:
Community Search:

Software Updates via MacUpdate

Audio Hijack Pro 2.11.3 - Record and enh...
Audio Hijack Pro drastically changes the way you use audio on your computer, giving you the freedom to listen to audio when you want and how you want. Record and enhance any audio with Audio Hijack... Read more
Airfoil 4.8.9 - Send audio from any app...
Airfoil allows you to send any audio to AirPort Express units, Apple TVs, and even other Macs and PCs, all in sync! It's your audio - everywhere. With Airfoil you can take audio from any... Read more
WhatRoute 1.13.0 - Geographically trace...
WhatRoute is designed to find the names of all the routers an IP packet passes through on its way from your Mac to a destination host. It also measures the round-trip time from your Mac to the... Read more
Chromium 37.0.2062.122 - Fast and stable...
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all Internet users to experience the web. FreeSMUG-Free OpenSource Mac User Group build is... Read more
Attachment Tamer 3.1.14b9 - Take control...
Attachment Tamer gives you control over attachment handling in Apple Mail. It fixes the most annoying Apple Mail flaws, ensures compatibility with other email software, and allows you to set up how... Read more
Duplicate Annihilator 5.0 - Find and del...
Duplicate Annihilator takes on the time-consuming task of comparing the images in your iPhoto library using effective algorithms to make sure that no duplicate escapes. Duplicate Annihilator detects... Read more
jAlbum Pro 12.2 - Organize your digital...
jAlbum Pro has all the features you love in jAlbum, but comes with a commercial license. With jAlbum, you can create gorgeous custom photo galleries for the Web without writing a line of code!... Read more
jAlbum 12.2 - Create custom photo galler...
With jAlbum, you can create gorgeous custom photo galleries for the Web without writing a line of code! Beginner-friendly, with pro results Simply drag and drop photos into groups, choose a design... Read more
Quicken 2015 2.0.4 - Complete personal f...
Quicken 2015 helps you manage all your personal finances in one place, so you can see where you're spending and where you can save. Quicken automatically categorizes your financial transactions,... Read more
iMazing 1.0 - Complete iOS device manage...
iMazing (formerly DiskAid) is the ultimate iOS device manager with capabilities far beyond what iTunes offers. With iMazing and your iOS device (iPhone, iPad, or iPod), you can: Copy music to and... Read more

Latest Forum Discussions

See All

View Source – HTML, JavaScript and CSS...
View Source – HTML, JavaScript and CSS 1.0 Device: iOS Universal Category: Utilities Price: $.99, Version: 1.0 (iTunes) Description: View Source is an app plus an iOS 8 Safari extension that makes it easy to do one key web developer... | Read more »
Avenged Sevenfold’s Hail To The King: De...
Avenged Sevenfold’s Hail To The King: Deathbat is Coming to iOS on October 16th Posted by Jessica Fisher on September 19th, 2014 [ permalink ] Just in time for Halloween, on October 16 Avenged Sevenfold will be launching | Read more »
Talisman Has Gone Universal – Can Now be...
Talisman Has Gone Universal – Can Now be Played on the iPhone Posted by Jessica Fisher on September 19th, 2014 [ permalink ] | Read more »
Tap Army Review
Tap Army Review By Jennifer Allen on September 19th, 2014 Our Rating: :: SHOOT EM ALLUniversal App - Designed for iPhone and iPad Mindless but fun, Tap Army is a lane-based shooter that should help you relieve some stress.   | Read more »
Monsters! Volcanoes! Loot! Epic Island f...
Monsters! Volcanoes! Loot! | Read more »
Plunder Pirates: Tips, Tricks, Strategie...
Ahoy There, Seadogs: Interested in knowing our thoughts on all this plundering and pirating? Check out our Plunder Pirates Review! Have you just downloaded the rather enjoyable pirate-em-up Plunder Pirates and are in need of some assistance? Never... | Read more »
Goat Simulator Review
Goat Simulator Review By Lee Hamlet on September 19th, 2014 Our Rating: :: THE GRUFFEST OF BILLY GOATSUniversal App - Designed for iPhone and iPad Unleash chaos as a grumpy goat in this humorous but short-lived casual game.   | Read more »
A New and Improved Wunderlist is Here fo...
A New and Improved Wunderlist is Here for iOS 8 Posted by Jessica Fisher on September 19th, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Evernote Update for iOS 8 Adds Web Clipp...
Evernote Update for iOS 8 Adds Web Clipping, Quick Notes, and More Posted by Ellis Spice on September 19th, 2014 [ permalink ] | Read more »
Apple Names Ultimate Productivity Bundl...
Apple Names Ultimate Productivity Bundle by Readdle as the Essential Bundle on the App Store Posted by Jessica Fisher on September 19th, 2014 [ permalink | Read more »

Price Scanner via MacPrices.net

iFixIt Tears Down iPhone 6; Awards Respectabl...
iFixit notes that even the smaller 4.7″ iPhone 6 is a giant among iPhones; so big that Apple couldn’t fit it into the familiar iPhone form factor. In a welcome reversal of a recent trend to more or... Read more
Phone 6 Guide – Tips Book For Both iPhone 6...
iOS Guides has announced its latest eBook: iPhone 6 Guide. Brought to you by the expert team at iOS Guides, and written by best-selling technology author Tom Rudderham, iPhone 6 Guide is packed with... Read more
How to Upgrade iPhone iPad to iOS 8 without D...
PhoneClean, a iPhone cleaner utility offered by iMobie Inc., reveals a solution for upgrading iPhone and iPad to iOS 8 without deleting photos, apps, the new U2 album or anything. Thanks to more than... Read more
Inpaint 6 – Photo Retouching Tool Gets Faster...
TeoreX has announced Inpaint 6, a simple retouching tool for end users that helps remove scratches, watermarks, and timestamps as well as more complex objects like strangers, unwanted elements and... Read more
Worldwide PC Monitor Market Sees Growth in To...
Worldwide PC monitor shipments totaled 32.5 million units in the second quarter of 2014 (2Q14), a year-over-year decline of -2.9%, according to the International Data Corporation (IDC) Worldwide... Read more
Updated Price Trackers
We’ve updated our Mac Price Trackers with the latest information on prices, bundles, and availability on systems from Apple’s authorized internet/catalog resellers: - 15″ MacBook Pros - 13″ MacBook... Read more
Mac Pros available for up to $260 off MSRP
Adorama has Mac Pros on sale for up to $260 off MSRP. Shipping is free, and Adorama charges sales tax in NY & NJ only: - 4-core Mac Pro: $2839.99, $160 off MSRP - 6-core Mac Pro: $3739.99, $260... Read more
13-inch 2.6GHz/256GB Retina MacBook Pros avai...
B&H Photo has the 13″ 2.6GHz/256GB Retina MacBook Pro on sale for $1379 including free shipping plus NY sales tax only. Their price is $120 off MSRP. Read more
Previous-generation 15-inch 2.0GHz Retina Mac...
B&H Photo has leftover previous-generation 15″ 2.0GHz Retina MacBook Pros now available for $1599 including free shipping plus NY sales tax only. Their price is $400 off original MSRP. B&H... Read more
21″ 2.7GHz iMac available for $1179, save $12...
Adorama has 21″ 2.7GHz Hawell iMacs on sale for $1179.99 including free shipping. Their price is $120 off MSRP. NY and NJ sales tax only. 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
Position Opening at *Apple* - Apple (United...
**Job Summary** At the Apple Store, you connect business professionals and entrepreneurs with the tools they need in order to put Apple solutions to work in their Read more
Position Opening at *Apple* - Apple (United...
**Job Summary** The Apple Store is a retail environment like no other - uniquely focused on delivering amazing customer experiences. As an Expert, you introduce people Read more
Position Opening at *Apple* - Apple (United...
**Job Summary** As businesses discover the power of Apple computers and mobile devices, it's your job - as a Solutions Engineer - to show them how to introduce these Read more
Position Opening at *Apple* - Apple (United...
…Summary** As a Specialist, you help create the energy and excitement around Apple products, providing the right solutions and getting products into customers' hands. You Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.