home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!stanford.edu!unix!css-mac1.sri.com!user
- From: mxmora@unix.sri.com (Matthew Xavier Mora)
- Newsgroups: comp.sys.mac.programmer
- Subject: PathName from FSSpec (pascal code)
- Message-ID: <mxmora-140992131506@css-mac1.sri.com>
- Date: 14 Sep 92 20:13:59 GMT
- Sender: news@unix.SRI.COM
- Followup-To: comp.sys.mac.programmer
- Organization: SRI International
- Lines: 71
-
- I spent the long weekend cursing at the AppleEventManager
- trying to get the finder to open a control panel. Anyway,
- one of the things I discovered was that the alias manager will
- give you a path name if you ask for it. Since my program needed to
- display the path name, I wrote a function that will return a full
- path name in a handle (not in a str255 so it won't crash with long
- path names) when you give it a fsspec.
-
- I also figured out how to get the finder to open a control panel.
- You need to send an open selection event. I finally found an example that
- worked and ported it to pascal. If you would like to see that code I can
- post it here also. Its a direct copy of C.K Han's C code that is on the
- developers CD.
-
- Here is the code:
-
- {-------------------------------------------------------------------------}
- {Path Name From FSSpec }
- {by Matthew Xavier Mora }
- {9-8-92 }
- {Given a FSSpec this function will return a handle to the full path }
- {name. It creates the handle as it goes. It does not have the limited }
- {string length (255) problem like the ones I have seen. This of course }
- {requires system seven or better because of the use of the alias manager }
- { Don't forget to dispose the handle when you are done with it. }
- {-------------------------------------------------------------------------}
- {$PUSH}
- {$-R}
- function PathNameFromFSSpec (var theFile: FSSpec): Handle;
- var
- i: AliasInfoType;
- theStr: STR63;
- h: Handle;
- oe: OSErr;
- alias: AliasHandle;
- theSize: longint;
- begin
- PathNameFromFSSpec := nil;
- oe := NewAlias(nil, theFile, alias); {create a temporary alias}
- if alias = nil then {if nil exit }
- exit(PathNameFromFSSpec);
-
- h := NewHandle(0);
- if h = nil then {if nil exit. }
- exit(PathNameFromFSSpec);
-
- i := asiAliasName; { set the index to the Parent }
- if GetAliasInfo(alias, i, thestr) = noerr then {get The parentName }
- begin {returns error if bad alias }
- while thestr <> '' do { will be '' when done traversing the path}
- begin
- theSize := longint(thestr[0]) + 1;
- thestr[0] := ':'; { use the size byte to store the colon. aux='/' }
- { Let Munger do the work }
- theSize := Munger(h, 0, nil, 0, @thestr, thesize);
- i := i + asiParentName; {set the index to the next parent}
- oe := GetAliasInfo(alias, i, thestr); {get the parentName }
- end;
- {get the Volume Name }
- oe := GetAliasInfo(alias, asiVolumeName, thestr);
- theSize := longint(thestr[0]);
- theSize := Munger(h, 0, nil, 0, Ptr(ord(@theStr) + 1), theSize);
-
- PathNameFromFSSpec := h; {return the newly created handle}
- end;
- DisposeHandle(Handle(alias));
- end;
- {$POP}
-
-
- Matt
-