The DataCAD Developer Network (DDN) is an online resource for information and support for DCAL® (DataCAD Applications Language) developers as well as anyone interested in creating fonts, toolbars, hatch patterns, or linetypes for use in DataCAD.
#72080 by Jsosnowski
Sun Aug 13, 2017 10:58 am
PART EIGHT - A D4D PRIMER - CONVERTING DCAL to D4D CODE

Converting older DCAL macros into D4D macros is reasonably straight forward,but somewhat tedious process. The first step is to load your old DCAL code inin a simple text editor such as Notepad++ and run several search and replace cycles to convert from DCAL to the Delphi language. Changes include:

IF Then statements.
A Delphi if statement reads:
Code: Select all if condition then
  dosomething;
end; 

while Delphi If statements reads:
Code: Select all if condition then begin
  doSomething;
end; 
Although the the final 'end;' can be dropped if the 'doSomething; code is only one line long, it is simpler to keep the 'end' statement in place both for search and replace and for future additions. Therefore search for 'then' and replace it with "then begin'.

ELSE statements
In Delphi an ELSE statement follows this format:
Code: Select allIf condition then begin
  doSomething;
end
else begin
  doSomethingElse;
end;
Search for 'Else' and replace it with 'end else begin'.

ELSIF statements
The 'elsif' statement does not exist in Delphi. There are two alternatives to correct it.
1. Search for 'elsif' and replace it with 'end else if '.
2. Delphi includes the 'case condition of' statement structure which reads simply in your code. You can easily assemble 'case' statements individually to replace 'elsif' cascades in your code.

The 'RETURN;' keyword alone
The return keyword used alone is used to end processing a method before reaching the method end. Delphi does not recognize the keyword 'return' and uses the keyword 'Exit' instead. Search for 'Return;' and replace with 'Exit' (without a semicolon).

The 'Return value;' keyword
Delphi uses a built in function variable called 'result' for function return values. Replace the term by searching for 'Return' and replacing it with 'result := '.

For/Do and While/Do statements
These multiple line statement structures must be enclosed with 'begin, and 'end;' keywords. For 'For/Do' and 'While/do' statements Search for the word ' do' (include a leading space to avoid 'do' contained in words) and replace with ' do begin'.

End of method code line
Datacad methods conclude with a last line reading 'end <methodname>; while Delphi methods do not include the method name. To correct this manually move to the end of each method and insert '; //' after 'end' converting the method name to a comment.

! Comments
The '!' is not recognized by Delphi for a line comment. Search for '!' and replace it with '//'.

Method argument types
A typical DCAL method declaration might read as 'function doWork (a: IN OUT integer; b: IN Integer; c: OUT integer, d: integer): integer;'. Delphi does not recognizer the key words IN & OUT and instead uses 'const' for IN and 'var' for OUT. The revised method will read 'function doWork (var a: integer; const b: Integer; var c: integer, d: integer): integer;'.

Global Unit Variables
DCAL units include provisions for persistent global variables declared in units outside of methods. Whenever a macro is closed, the current value for these variables is saved in the macro file '*.dcx'. Delphi does not include these persistent variables so another strategy must be used.

Initialization methods
Many DCAL macros include a method such as 'procedure InitData;' to set initial values for a macro. The call for this procedure is usually placed in the DCAL Macro program starting method for the macro and checks a global variable such as 'Used: boolean;' to determine if the macro variables have been given initial values. Boolean variables are initiated as false so 'Used' will equal false on its first use meaning that InitData should be called. 'InitData' will then set 'Used' to true, preventing reinitialization in later macro runs. Unfortunately, Delphi unit variables are not stored between uses so this initiation strategy will not work. Delphi provides a unit section called 'Initialization' that serves the same first time purpose. However, to preserve these variables between uses of the macro they will have to be saved and retrieved using a file. One way of doing so is discussed in PART SIX using 'ini' files.

Accessing Datacad Variables
The DCAL manual lists numerous program variables that are accessible in DCAL. D4D declares these varaibles in a in a packed record called 'savevar' in uvariables.pas,although many have modified names. requiring all variables to be checked and renamed in your revised code. To access these variables you must use the function PGsavevars; to read or write the specific field as in the following code line:.
Code: Select allCurrentSz := PGsavevars.txtsiz;


Method Public Declarations
DCAL requires two files for each unit file used in a macro. 'UnitA.inc' and 'UnitA.dcs'. The '.inc' file contains declarations including a list of all methods which are to be accessible to other units in the program. The '.dcs' file contains the actual methods including a 'PUBLIC;' declaration ending each methods declaration line. Delphi moves all unit declarations into the same unit file under the section heading 'interface'. Copy the contents of your '.inc'. file into the unit under the 'interface' section keyword. Move your '.dcs' functions into the unit file under the 'implementation' section keyword and remove the 'public;' term from methods.

Character Literals
DCAL uses double quotes " to bracket character literals (eg. "c"). Delphi uses single quotes. A simple search and replace should cover all code line occurrences.
#73990 by dhs
Tue May 29, 2018 2:40 pm
Thanks for the advice Joe. I am in the process of converting some code and found your comments most helpful.

I also took it a bit further by automating many of the steps using Notepad++ macros.
So far I have developed 3 Notepad++ macros:

Replaces does pretty much all of the straight text replacements outlined in Joe's post in just one step. My macro is assigned to the Shift/Alt/R key in Notepad++. This macro just needs to be run once to do all the replacements

StrAssign macro automates the process of replacing DCAL StrAssign statements with the string assignement used in Delphi. I have assigned this macro to Shift/Alt/A. This macro searches for and corrects one instance of StrAssign at a time. You can run it multiple times automatically, but if doing so I recommend adding the word 'StrAssign' to a new line at the very end of your file before running (as the macro will corrupt the line the cursor is on if you run it and there are no more instances of 'StrAssign' in your code). I find it easier to just press Shift/Alt/A repeatedly until I hear a warning beep (the beep indicates the macro could not find an instance of StrAssign, so I then need to press Ctrl/Z to undo the last thing that it did)

StrCat macro automates the process of replacing DCAL's StrCat with the correct Delphi syntax of adding strings together. I have assigned it to Shift/Alt/C and run it in a similar way to StrAssign (as it will also corrupt the line the cursor is on if it does not find another instance of 'StrCat').

If you are using Notepad++ then you can add these macros by copying the code below into the <Macros> section of the shortcuts.xml file that is found in your 'C:\Users\<UserName>\AppData\Roaming\Notepad++' folder (replacing '<UserName>' with your user name of course). Ensure that you don't have any existing user-defined macros assigned to the keys that I have assigned before just copying this in:
Code: Select all        <Macro name="StrAssign" Ctrl="no" Alt="yes" Shift="yes" Key="65">
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="strassign" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="(" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="," />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam=":" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="=" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam=")" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
        </Macro>
        <Macro name="StrCat" Ctrl="no" Alt="yes" Shift="yes" Key="67">
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="strcat" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2306" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2454" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2454" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2454" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="(" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="," />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2306" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2454" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2469" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="," />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="+" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam=")" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2453" wParam="0" lParam="0" sParam="" />
            <Action type="2" message="0" wParam="44035" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="," />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam=":" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="=" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
        </Macro>
        <Macro name="Replaces" Ctrl="no" Alt="yes" Shift="yes" Key="82">
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="\r\nEND " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="\r\nEND; //" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="\r\nEND; //\r\n" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="\r\nEND;" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="PUBLIC;" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="EXTERNAL;" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="then" />
            <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="then begin" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="elsif" />
            <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="end else if" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="else" />
            <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="else begin" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="do" />
            <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="do begin" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="return;" />
            <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="exit;" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="return " />
            <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="{todo: is exit required?} result := " />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="\r\n" />
            <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos; + sLineBreak + &apos;" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="\r" />
            <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos; + sLineBreak + &apos;" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
        </Macro>
#73997 by dhs
Tue May 29, 2018 3:59 pm
Here are a couple more useful Notepad++ macros:

InOut fixes IN OUT parameters. Invoked by Shift/Alt/I and fIxes one at a time and same comments apply to automatically running it multiple times as the the macros in my previous post.

In fixes IN parameters. Must be run after the InOut macro above (otherwise it will corrupt all your IN OUT parameters). I found I use the word 'IN' in comments quite a bit, so you need to watch and undo when it modifies a comment (and make sure the cursor is on the following line before you invoke the macro again). Same comments regarding multiple runs as for above macro.

Here is the xml code for the macros (insert into the <Macros> section of the same file as specified in my previous post)
Code: Select all        <Macro name="InOut" Ctrl="no" Alt="yes" Shift="yes" Key="73">
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="IN OUT" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2302" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2451" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2306" wParam="0" lParam="0" sParam="" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
            <Action type="0" message="2452" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="(" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" (" />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam=":" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" : " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam=":" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" : " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam=":" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" : " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="0" message="2453" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="IN OUT" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="256" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2306" wParam="0" lParam="0" sParam="" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="v" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="a" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="r" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
            <Action type="0" message="2453" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2452" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="var (" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="(var " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="0" message="2302" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2301" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2307" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="\r\n " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="\r\n" />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="0" message="2302" wParam="0" lParam="0" sParam="" />
        </Macro>
        <Macro name="In" Ctrl="no" Alt="yes" Shift="yes" Key="74">
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="IN" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2302" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2301" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="\r\n" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="\r\n " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="IN" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2453" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2452" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="\t" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam=":" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" : " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="(" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" (" />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="  " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="0" message="2453" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="IN" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="769" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2180" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam=" " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="256" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1" sParam="" />
            <Action type="0" message="2306" wParam="0" lParam="0" sParam="" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="c" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="o" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="n" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="s" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam="t" />
            <Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
            <Action type="0" message="2453" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2452" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="const (" />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="(const " />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="0" message="2302" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2301" wParam="0" lParam="0" sParam="" />
            <Action type="0" message="2305" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="\r\n " />
            <Action type="3" message="1625" wParam="0" lParam="1" sParam="" />
            <Action type="3" message="1602" wParam="0" lParam="0" sParam="\r\n" />
            <Action type="3" message="1702" wParam="0" lParam="896" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
            <Action type="0" message="2453" wParam="0" lParam="0" sParam="" />
        </Macro>
#74000 by dhs
Wed May 30, 2018 12:28 am
There was an error in the Replace macro code I posted earlier. You can download the correct version in my Shortcuts.xml file from my web site at http://www.dhsoftware.com.au/downloads/shortcuts.xml. There are brief instructions and description of each macro on the page at http://www.dhsoftware.com.au/dcalconvert.htm

I may update this file or add new macros from time to time, so it is easier to provide the above link than to keep posting the source here!

Best Regards,
David H
#76102 by dhs
Mon Mar 25, 2019 2:15 pm
I would also suggest getting rid of any of the DCAL routines that concert numbers to/from strings. They are replicated in D4D, but the D4D versions still appear to use single precision arithmetic (e.g. cvrllst (9.123456789, s) will result in s being '9.1234570').

Delphi provides its own methods for converting between numbers and strings, so use these instead (you will need to change your code slightly to catch exceptions when a string is not a valid number (instead of checking the true/false result of the DCAL string to number functions) .
#76426 by Mark F. Madura
Fri May 24, 2019 11:30 am
Here's the UltraEdit macro I've been using to convert DCAL for DOS dcs to DCAL for Delphi pas files. I'm sure it can be improved upon, but it does the bulk of the work leaving a reasonable amount of cleanup to do. I take care of IN and OUT conversions to const and var separately because these individual words can occur in many places outside of procedures and functions.
Code: Select allInsertMode
ColumnModeOff
HexOff
TabsToSpaces
TrimTrailingSpaces
UltraEditReOn
Find MatchWord "IN OUT"
Replace All "{ var }"
UltraEditReOn
Find MatchWord "THEN"
Replace All "THEN BEGIN"
UltraEditReOn
Find MatchWord "ELSE"
Replace All "END ELSE BEGIN"
UltraEditReOn
Find MatchWord "ELSIF"
Replace All "END ELSE IF"
UltraEditReOn
Find MatchWord "DO"
Replace All "DO BEGIN"
UltraEditReOn
Find MatchWord "RETURN"
Replace All "RETURN :="
UltraEditReOn
Find MatchWord "rubln"
Replace All "rubln^"
UltraEditReOn
Find MatchWord "PUBLIC;"
Replace All "{ PUBLIC; }"
UltraEditReOn
Find MatchWord "MODULE"
Replace All "//MODULE"
UltraEditReOn
Find MatchWord "#include"
Replace All "//#include"
UltraEditReOn
Find RegExp MatchWord "END ^(*^);"
Replace All "END; { ^1 }"
UltraEditReOn
Find RegExp MatchWord "END ^(*^)."
Replace All "{ END ^1 }"
UltraEditReOn
Find MatchWord "EXTERNAL;"
Replace All "{ EXTERNAL; }"
UltraEditReOn
Find RegExp MatchWord "program ^(*^);"
Replace All "{ program ^1 }"

Here are some other necessary conversions I have come across recently:

Comments: ! --> //!
I keep the exclamation in the comment for reference to indicate the line was commented out in the original code.

Quotes: " " --> ' '

Escape Sequence for Apostrophe: \' --> ''

Short-String Types: str8 --> string[8] or str80 --> string[80] etc.

For Loops:
- BY -1 --> DOWNTO
- BY 2 --> Delphi's For loop doesn't support a step value.
Use while <= loop instead and Inc(i, 2); { step by 2 }

Floating Point Values: real --> aFloat (single to double)
- float(n) command --> not needed.

Some Type Definition Differences:

view.projtype --> view.viewmode
view.viewmat --> view.vmat
view.clipmat --> view.cmat
view.editmat --> view.emat
view.inptmat --> view.imat
view.clipmax --> view.clpmax
view.clipmin --> view.clpmin
view.scalenum --> view.scalei
view.viewcent --> view.perscent

ent.sttyp --> ent.User0
ent.index --> ent.User1
ent.dbase --> ent.User2
ent.block --> ent.User3

ent.txtsize --> ent.txtsiz
ent.txtfont --> ent.txtfon

entCnt.cntPnt --> entCnt.ckpnt

atr.positn --> atr.xdata.positn
atr.positn.z --> atr.xdata.positn.z
atr.txtsize --> atr.xdata.txtsize
atr.txtang --> atr.xdata.txtang
atr.txtslant --> atr.xdata.txtslant
atr.txtaspect --> atr.xdata.txtaspect

Function Names:

brkpress --> brkprss
setlyrname -- > setlayername

Who is online

Users browsing this forum: No registered users and 9 guests

About DataCAD Forum

The DataCAD Forum is a FREE online community we provide to enhance your experience with DataCAD.

We hope you'll visit often to get answers, share ideas, and interact with other DataCAD users around the world.

DataCAD

Software for Architects Since 1984