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.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

jAlbum 15.0 - 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
Duet 1.6.9.3 - Use your iPad as an exter...
Duet is the first app that allows you to use your iDevice as an extra display for your Mac using the Lightning or 30-pin cable. Note: This app requires a $14.99 iOS companion app. Version 1.6.9.3:... Read more
Duet 1.6.9.3 - Use your iPad as an exter...
Duet is the first app that allows you to use your iDevice as an extra display for your Mac using the Lightning or 30-pin cable. Note: This app requires a $14.99 iOS companion app. Version 1.6.9.3:... 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
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

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.