[comp.sys.apple] Help with TML PASCAL

shatara@univse.dec.com (09/08/88)

I have been having a problem with TML PASCAL and have not had much luck
getting any answers from TML directly.  Can someone out there help?

I'm having a problem generating a Stop alert by following the TML Pascal 
examples given in the "Programmer's Introduction to the IIgs", pp 429-431. I 
have followed the examples very closely, but the "TYPE" definition of the 
Alert Template was not shown.   I am therfore not sure whether or not the 
problem is with TML Pascal or with my implementation. I suspect the latter 
at this time.

I have attached the code I have written.  I'm sure the problem is a trivial 
one but I can't seem to locate it.

The code compiles ok but when I run it I get 

         The Alert Box with the "STOP ICON"

         NO message and NO Cancel Button.

         System hung....can't move on but can get to conrtol panel.


The source code follows.

Thanks in advance for any help you can shed on my problem.

Chris Shatara



type
	ItemTempPtr = ^ItemTemplate;
	ItemTemplate = record
		ItemId : integer;
		ItemRect : Rect;
		ItemType : integer;
		ItemDesc : ptr;
		ItemValue : integer;
		ItemFlag : integer;
		ItemColor : ptr;
		end;

	AlertTempPtr = ^AlertTemplate;
	AlertTemplate = record
		AtRect : rect;
		AtAlertId : integer;
		AtStage1 : byte;
		AtStage2 : byte;
		AtStage3 : byte;
		AtStage4 : byte;
		AtItem1 : ItemTempPtr;
		AtItem2 : ItemTempPtr;
		AtItem3 : ptr;
		end;



{********************************************************************}
{ 		Procedure: MakeATemplate                             }
{********************************************************************}

Procedure MakeATemplate(TheTemplate : AlertTempPtr; TheStr : StringPtr)
var
	CurrentItem1 : ItemTemplate;
	CurrentItem2 : ItemTemplate;
begin
	With TheTemplate^ do begin
	    SetRect(AtRect,120,30,520,80);
	    AtAlertId := 1500;
	    AtStage1 := $80;
	    AtStage2 := $80;
	    AtStage3 := $80;
	    AtStage4 := $80;
	    AtItem1 := @CurrentItem1;
	    AtItem2 := @CurrentItem2;
	    AtItem3 := nil;
	    end;

	With CurrentItem1 do begin
	    ItemId := 1;
	    SetRect(ItemRect,320,25,0,0);
	    ItemType := ButtonType;
	    ItemDesc := @'Cancel';
	    ItemValue := 0;
	    ItemFlag := 0;
	    ItemColor := nil;
	    end;

	With CurrentItem2 do begin
	    ItemId := 2;
	    SetRect(ItemRect,71,11,400,21);
	    ItemType := StatTextItem;
	    ItemDesc := @TheStr;
	    ItemValue := 0;
	    ItemFlag := 0;
	    ItemColor := nil;
	    end;
end;

{********************************************************************}
{	Procedure: FileNotOpen                                       }
{********************************************************************}

Procedure FileNotOpen;
Var
	NoFileOpen  : AlertTemplate;
	DescString  : str255;
	ItenClicked : integer
begin
	DescString := 'You have not OPENED a file yet!';
	MakeATemplate(@NoFileOpen,@DescString);
	ItemClicked := StopAlert(@NoFileOpen,nil);
end;

keith@Apple.COM (Keith Rollin) (09/08/88)

In article <8809081422.AA20731@decwrl.dec.com> shatara@univse.dec.com writes:
>I have been having a problem with TML PASCAL and have not had much luck
>getting any answers from TML directly.  Can someone out there help?
>
>I'm having a problem generating a Stop alert by following the TML Pascal 
>examples given in the "Programmer's Introduction to the IIgs", pp 429-431. I 
>have followed the examples very closely, but the "TYPE" definition of the 
>Alert Template was not shown.   I am therfore not sure whether or not the 
>problem is with TML Pascal or with my implementation. I suspect the latter 
>at this time.
>

I think I see the problem. You are creating an Alert Template that uses Alert
items that you defined locally in a procedure. Pascal creates it's local
variable storage space on the stack. When the procedure is done, the stack
is cleaned up, and the variables go away. This means that your Alert Items
are no longer in the stack proper. However, the Alert Template still points to
the location on the stack where they were. When you call StopAlert, a lot of
other stuff gets put on the stack (return addresses, parameters to tools, etc.)
which overwrites your Alert Items. Since there is now garbage on the stack
where the Dialog Manager thinks there is a valid Alert Item, the Dialog
Manager chokes and hangs (wow! I mixed my metaphors, but still made sense!).


Keith Rollin                                               amdahl\
Developer Technical Support                           pyramid!sun !apple!keith
Apple Computer                                             decwrl/
"You can do what you want to me, but leave my computer alone!"