tag:blogger.com,1999:blog-193260292024-02-21T09:42:34.909+01:00GFA-BASIC 32 for WindowsGFA-BASIC 32 for Windows by Sjouke HamstraSjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.comBlogger170125tag:blogger.com,1999:blog-19326029.post-47397775312314734712024-02-09T17:30:00.001+01:002024-02-09T17:30:14.466+01:00What is the purpose of New?<p>The <strong>New</strong> keyword is used to create a COM object instance that cannot be created otherwise. In GB32 the most objects are created using the <strong>Ocx</strong> command, however not all COM types (<strong>Collection</strong>, <strong>Font</strong>, <strong>DisAsm</strong>, <strong>StdFont</strong>, and <strong>StdPicture</strong>) can be created this way.</p> <p>The <strong>Ocx</strong> command is defined as:</p> <p align="center"><strong>Ocx</strong> <strong>comtype</strong> <em>name</em>[(idx)] [[= text$] [,ID][, x, y, w, h]</p> <p>It performs two things:</p> <ol> <li>Declares a global variable <em>name</em> of the specified and predefined <em><strong>comtype</strong></em></li> <li>Creates an object instance and assigns it to <em>name</em>.</li> </ol> <p>The <strong><em>comtype</em></strong> is one of the GB32 provided COM types: a window based objecttype like <strong>Form</strong>, <strong>Command</strong>, but also <strong>Timer</strong>. Creating concrete objects of these types require initialization parameters, sometimes optionally, but the syntax must be able to accept additional parameters. </p> <p>To create objects of non-window based types GB32 provides the <strong>New</strong> keyword to be used in a variable declaration statement. Here also, the two step process must be followed: declare a variable and assign the object instance. </p> <p align="center"><strong>Dim</strong> <em>name</em> As [<strong>New</strong>] <strong><em>comtype</em></strong></p> <p>Without the <strong>New</strong> keyword only a variable is declared and initialized to <strong>Nothing </strong>(0). <strong>New</strong> forces GB32 to create an instance (allocate memory for it) and assign that memory address to the variable <em>name</em>. In contrast with the <strong>Ocx</strong> command which creates global variables, these objecttypes can be declared and created locally. When the procedure is left the object is released from memory.</p> <p>When declaring a COM type (<strong>Ocx</strong> or <strong>Dim</strong>) GB32 only reserves a 32-bits integer for the variable. The variable is a pointer to the allocated memory of the object and initially zero (Nothing). For instance:</p> <pre>Dim <font color="#800000">c </font>As Collection
</pre>
<p>The variable <em>c</em> is a 32-bits pointer that can be assigned another instance of <strong>Collection</strong> by using the <strong>Set</strong> command.</p>
<p><strong>Passing a COM object</strong>
<br />An often asked question is whether an object variable should be passed <strong>ByRef</strong> or <strong>ByVal</strong> to a procedure. Since the variable is a pointer a <strong>ByVal</strong> parameter accepts a <em>copy of the pointer</em> and <strong>ByRef</strong> <em>the address of the 32-bits pointer variable</em>. In both cases GB32 knows how to handle the passed value, although a <strong>ByVal</strong> passed pointer outperforms a <strong>ByRef</strong> parameter. To access a <strong>ByRef</strong> parameter there is always an extra level of indirection.</p>
<p>Passing an object does not increment the reference count on the object.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-36907915001879110582023-10-20T16:13:00.001+02:002023-10-20T16:13:12.356+02:00File Creation Date and Time<p>To read the file-time of a file GB32 offers the following functions:</p> <pre>Dim <font color="#800000">ft </font>As Date
<font color="#800000">ft </font>= <font color="#005bb7">FileDateTime(</font><font color="#800000">file$</font><font color="#005bb7">) </font><font color="#008000">// last write time
</font><font color="#800000">ft </font>= <font color="#005bb7">FileDateTimeAccess(</font><font color="#800000">file$</font><font color="#005bb7">) </font><font color="#008000">// last access time
</font><font color="#800000">ft </font>= <font color="#005bb7">FileDateTimeCreate(</font><font color="#800000">file$</font><font color="#005bb7">) </font><font color="#008000">// creation time
</font></pre>
<p>They return a <strong>Date</strong> datatype with resp. the last write time. last access time, and the creation time. </p>
<table cellspacing="0" cellpadding="2" border="1"><tbody>
<tr>
<td>
<p>A <strong>Date</strong> stores a date/time value as an 8-byte real value (<b>Double</b>), representing a date between January 1, 100 and December 31, 9999, inclusive.
<br />
<br />The integer part of the Double represents the day:
<br />- The value 2.0 represents January 1, 1900
<br />- 3.0 represents January 2, 1900, and so on.
<br />Adding 1 to the value increments the date by a day.
<br />
<br />The fractional part of the value represents the time of day. Therefore, 2.5 represents noon on January 1, 1900; 3.25 represents 6:00 A.M. on January 2, 1900, and so on.
<br />Negative numbers represent dates prior to December 30, 1899.</p>
<p>You can display the <strong>Double</strong> representation of the current time like this:</p>
<pre>Dim <font color="#800000">dt </font>As Date = <font color="#005bb7">Now
</font>Debug <font color="#005bb7">CDbl(</font><font color="#800000">dt</font><font color="#005bb7">)
</font></pre>
</td>
</tr>
</tbody></table>
<p>The <strong>FileDateTime*</strong> functions are wrappers around Windows API functions and from their name you expect the date of the last write, last access, or the creation time. For instance, the <strong>FileDateTimeCreate</strong>() should return the time at which a file is created, thus - for instance - the time a program executed the <strong>Open</strong> command to create a new file. (BTW the time of the file is not set before the <strong>Close</strong> command is invoked.) However, if the same file was created earlier, the date/time of the earlier creation is returned!
<br />According to the MS documentation:</p>
<p><font color="#8064a2">"If you rename or delete a file, then restore it shortly thereafter, Windows searches the cache for file information to restore. Cached information includes its short/long name pair and <u><em><strong>creation time</strong></em></u>."</font></p>
<p>Ok, that is a little disappointment, we cannot rely on <strong>FileDateTimeCreate</strong> to return the file's creation time. What's left is the most obvious function <strong>FileDateTime</strong>(), which is a kind of default function for a file's time. This first choice function returns the last write time, which seems to be the best thing to get the last time the file was created. The last write time returns the time the file is recreated, last updated or written to. So, you can use <strong>FileDateTime</strong> to obtain the 'last creation time', because <strong>FileDateTimeCreate</strong> returns the first creation time. To be sure I tested this by recreating an existing file created first at 3 March 2023:</p>
<pre>Open <font color="#804000">"c:\tmp\test.txt" </font>for Output As <font color="#005bb7"># </font><font color="#404040">1
</font>Print # <font color="#404040">1</font>; <font color="#804000">"Text"
</font>Close <font color="#005bb7"># </font><font color="#404040">1
</font></pre>
<p>After executing these codelines and subsequently choosing the file's properties in the Windows Explorer it indeed still shows a creation date of 3 March 2023. To force the file to a new creation date I changed the code with a <strong>Touch</strong> command:</p>
<pre>Open <font color="#804000">"c:\tmp\test.txt" </font>for Output As <font color="#005bb7"># </font><font color="#404040">1
</font>Print # <font color="#404040">1</font>; <font color="#804000">"Text"
</font>Touch <font color="#005bb7"># </font><font color="#404040">1
</font>Close <font color="#005bb7"># </font><font color="#404040">1
</font></pre>
<p>Now the Windows Explorer properties show the current date as the creation date. Using the <strong>Touch</strong> command will change all three filedates to the current time. To set each file date separately use one of the <strong>SetFileDateTime*</strong> functions after closing the file. </p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-13932355776938991622023-08-03T08:46:00.001+02:002023-08-03T08:46:21.791+02:00File I/O using Get and Put<p>This time I want to put the focus on the <strong>Get</strong> and <strong>Put</strong> commands that were first introduced in GFA-BASIC 32. These are high-performance commands to save and load the contents of a variable in a binary format. The syntax for these commands:</p> <p><font face="Courier New"><strong>Get</strong> #n, [index%], variable <br /><strong>Put</strong> #n, [index%], variable</font></p> <p>The <em>index%</em> parameter specifies the record number, but it is only required for a <strong>Random</strong> mode file. A <strong>Random</strong> mode file needs a <strong>Len</strong> value when opened, which is the last parameter in the <strong>Open</strong> command:</p> <p><font face="Courier New"><strong>Open</strong> pathname [<strong>For</strong> mode] [<strong>Access</strong> access] [share] [<strong>Commit</strong>] [<strong>Based</strong> 0/1] <strong>As</strong> [#]filenumber [<strong>Len</strong>=reclength]</font></p> <p>When the <em>index%</em> parameter is used, the file pointer is positioned at <em>index%</em> * <strong>Len.</strong> For all other files (mode is <strong>Output</strong>, <strong>Input</strong>, <strong>Binary</strong>, <strong>Update</strong>, or <strong>Append</strong>) the <em>index%</em> parameter should be omitted and:</p> <p><strong>Get</strong> reads from the current file position. <br /><strong>Put</strong> writes the variable at the current position.</p> <p>Depending on the <strong>Based</strong> setting in the <strong>Open</strong> command, which is 1 by default, the file position is actually calculated as (<em>index%</em> - <strong>Based</strong>) * <strong>Len</strong>. If <strong>Len</strong> is omitted the record length is set to 1. Consequently, when <em>index% </em>is used with a <strong>Len</strong> setting of 1, the <em>index%</em> value is multiplied by 1. Therefor, it is important to omit the parameter in non-<strong>Random</strong> files, so most often these commands are used like this:</p> <pre>Put <font color="#005bb7"># </font><font color="#404040">1</font><font color="#005bb7">, , </font><font color="#800000">a$
</font>Get <font color="#005bb7"># </font><font color="#404040">1</font><font color="#005bb7">, , </font><font color="#800000">a$
</font></pre>
<p><strong>The binary format</strong>
<br />The contents of the variable is not saved as a string representation of the value like <strong>Print #</strong> and <strong>Write #</strong> do. The contents of the variable is saved in the same format as it is stored in memory. For instance, a <strong>Float</strong> variable is stored in 4 bytes and <strong>Put</strong> only copies those 4 bytes to the opened file. <strong>Get</strong> reads the 4 bytes and moves them directly into the <strong>Float</strong> variable. Saving a the floating-point as a 4 byte binary prevents the rounding otherwise necessary for writing a string representation using <strong>Write #</strong> or <strong>Print #</strong>. (BTW <strong>Print #</strong> isn't a suitable file I/O command unless you are saving a string.)</p>
<p>If the variable being written is a numeric <strong>Variant</strong>, <strong>Put</strong> writes 2 bytes identifying the variable type of the <strong>Variant</strong> and then writes the binary representation of the variable. So, a <strong>Variant</strong> holding a <strong>Float</strong> is saved in 6 bytes: first 2 bytes identifying the <strong>Variant</strong> as <strong>basSingle</strong> (4) and followed by 4 bytes containing the data.
<br />If the <strong>Variant</strong> holds a string, <strong>Put</strong> writes 2 bytes to identify the type (<strong>basVString</strong>) , then 2 bytes specifying the length of the string, followed by the string data.</p>
<p>A variable-length string is saved likewise, only it omits the 2 bytes that specify the datatype. <strong>Put</strong> writes the length in 2 bytes, directly followed by the string data. The disadvantage is the limitation of 65535 characters, because that's the maximum value that can be stored in 2 bytes (Card).</p>
<p><strong>File mode</strong>
<br />Since <strong>Put</strong> and <strong>Get</strong> are binary I/O commands you might think they are restricted to <strong>Random</strong> mode or <strong>Binary</strong> mode files, but that isn't true. Binary I/O can happen with files opened in all modes, including <strong>Output</strong>, <strong>Input</strong>, <strong>Update</strong>, and <strong>Append</strong>.These modes do not differ much; opening a file with a certain mode is more of a reminder to the developer than that it defines an I/O operation. It is the file I/O command that defines the input-output format. <strong>Print #</strong> always writes a string, and <strong>Out # </strong>always write a binary value, whatever the mode of the opened file. Making a file <strong>Random</strong> allows <strong>Get</strong> and <strong>Put</strong> to read/write to a record directly with out setting the file pointer, otherwise it is the same as <strong>Update</strong>. </p>
<p><strong>Conclusion</strong>
<br />The <strong>Get</strong> and <strong>Put</strong> commands are fast binary I/O commands and are an interesting addition to the file I/O commands from previous versions of GFA-BASIC.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-776479604073083312023-05-29T08:06:00.001+02:002023-05-29T08:06:25.973+02:00Sleep doesn't wait?<p>Once in a while you might have created a quick and dirty program that repeatedly prints some value from inside the <strong>Sleep</strong> message loop. However, there is something funny about that. Shouldn't <strong>Sleep</strong> wait until there is a message in the queue? So, how can you print something repeatedly? How can <strong>Sleep</strong> return from its wait state?</p> <p><strong>The issue</strong> <br />The next small program shows the issue. It opens a window and enters the message loop while printing a dot each time. (I wanted to print the number of the message <strong>(_Mess</strong>) that is retrieved from the queue, but that isn't possible. The <strong>_Mess</strong> variable is set in the window procedure and is not part of the <strong>Sleep</strong> (<strong>GetEvent</strong> or <strong>PeekEvent</strong>) command. In addition, GB32 filters the message and not all message numbers are stored in <strong>_Mess</strong>. So, instead, we print a dot each time the loop is executed.)</p> <pre>OpenW <font color="#404040">1
</font>PrintScroll = <font color="#005bb7">True
</font>PrintWrap = <font color="#005bb7">True
</font>Do
Print <font color="#804000">"."</font>;
Sleep
Until <font color="#005bb7">Me Is Nothing
</font></pre>
<p>According to the documentation <strong>Sleep</strong> should 'sleep' until there is a message available. However, the <strong>Print</strong> command is executed frequently at a pretty high speed printing dots in the window. This shouldn't happen, should it?</p>
<p>Now, lets copy the code above into the IDE, save it and execute the code as a stand-alone EXE. For this choose the 'Launch EXE' button on the toolbar:</p>
<a href="https://drive.google.com/uc?id=1pNyag0fW49tw00vX7R0f6KkMmFTmsNLq"><img title="SleepNoWait" style="display: inline; background-image: none;" border="0" alt="SleepNoWait" src="https://drive.google.com/uc?id=1KyyNLmQrxtwpXv31MxpStVavgwlojcjR" width="559" height="54" /></a>
<p>Now we see something completely different: in the stand-alone EXE the <strong>Print</strong> command is not executed repeatedly; now <strong>Sleep</strong> does wait.</p>
<p><strong>Difference between IDE and standalone EXE</strong>
<br />When a program is run from inside the IDE the <strong>Sleep</strong> command doesn't <em>seem</em> to wait, because it returns repeatedly. However, the clue here is the word <em>'seem'</em>, because <strong>Sleep</strong> does actually wait (as does <strong>GetEvent</strong>), but it receives WM_TIMER messages at a pretty high speed. These WM_TIMER messages are missing in the stand-alone EXE. So, obviously, the IDE must be responsible for the WM_TIMER messages and indeed it is. </p>
<p><strong>The IDE is to blame</strong>
<br />The IDE uses several timers for different purposes. Well known timers are <strong>Gfa_Minute</strong> and <strong>Gfa_Second</strong>, that fire every minute or second resp. These two timers are disabled before a program is run (F5), so these are not the cause of the issue. However, there are two more IDE timers that are used to update UI elements like the toolbar buttons, for instance. Every 200ms the clipboard is checked to see if there is text available. If so, the toolbar's Paste button is enabled. Another timer is used to update the sidebar, this one fires every 100ms. </p>
<p>As it happens, these timers are <strong><u>not</u></strong> disabled before a program is run from within the IDE.These timers keep firing their WM_TIMER messages to the thread's queue, which are read by our <strong>Sleep</strong> in the program's message loop. Our program is executed in the same thread as the IDE and thus takes over the retrieving and dispatching of messages. While running a program, the IDE's message loop isn't executed any longer and all the messages for the IDE are obtained by the program's message loop. After quitting the program the IDE returns to its main message loop and takes over again.</p>
<p><strong>Conclusion</strong>
<br />Be aware that the number of times <strong>Sleep</strong> and <strong>GetEvent</strong> return from their wait state depends on the timer resolution of the IDE's timers that are still active while running the program. </p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-16876942595059741342023-01-04T09:15:00.001+01:002023-01-04T09:15:23.816+01:00The danger of And and Or<p>The <a href="http://gfabasic32.blogspot.com/2022/10/and-or-versus.html">previous blogpost</a> discussed the difference between <strong>And</strong> vs <strong>&&</strong>, and <strong>Or</strong> vs <strong>||</strong> in conditional statements. It showed why <strong>&&</strong> and <strong>||</strong> should be used instead of <strong>And</strong> and <strong>Or</strong>. The post also contained an example where it is legitimate to use the <strong>And</strong> operator:</p> <pre>Local Int <font color="#800000">x </font>= <font color="#404040">%111 </font><font color="#008000">' binary notation of 7
</font>If <font color="#800000">x </font><font color="#005bb7">And </font><font color="#404040">%11 </font><font color="#005bb7">> </font><font color="#404040">0 </font><font color="#008000">' test if lower 2 bits are set
' do something
</font>EndIf
</pre>
<p>However, this condition is true for the<em> wrong reasons</em>. The condition is also true when only bit one is set. To prevent this and only check for the two lower bits we could change it into:</p>
<pre>If <font color="#800000">x </font><font color="#005bb7">And </font><font color="#404040">%11 </font><font color="#005bb7">== </font><font color="#404040">3 </font><font color="#008000">' test if lower 2 bits are set
</font></pre>
<p>This seem to work ok, but the condition is still true for the <em>wrong reason</em> and that's gone haunt you. Let's try something different, let's test if bit 1 (value is 2) is set using the same method:</p>
<pre>If <font color="#800000">x </font><font color="#005bb7">And </font><font color="#404040">%11 </font><font color="#005bb7">== </font><font color="#404040">2 </font><font color="#008000">' test if bit 1 is set
</font>Message <font color="#804000">"Condition is True"
</font>Else
Message <font color="#804000">"Condition is False"
</font>EndIf
</pre>
<p>When we run this code, the program displays:</p>
<a href="https://drive.google.com/uc?id=10HxXJkKDHomOPkW554ynrR4XKZIdca6n"><img title="Screenshot 2023-01-04 071908" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Screenshot 2023-01-04 071908" src="https://drive.google.com/uc?id=1CS88VGvRZTOJeLJxoRJtqYLIaxwwE3wT" width="141" height="136" /></a>
<p>As you can see, the statement does not recognize that bit 1 is set (binary %10 == 2), despite the fact that the bit is 1.</p>
<p>So, what is going on here? Can't we trust <strong>And</strong> anymore? Maybe it is a bug? It is not a bug; it works like this is in any language and to understand this behavior we need to look at the operator precedence table. The helpfile contains the table under the topic name Operator Hierarchy:</p>
<table><tbody>
<tr>
<th class="vtl" style="width: 30%;"><b>( )</b> </th>
<th class="vtl" style="width: 70%;">parenthesis</th>
</tr>
<tr>
<td class="vtl"><b>+ - ~ !</b> </td>
<td class="vtl">unary plus, unary minus, bitwise NOT, logical NOT</td>
</tr>
<tr>
<td class="vtl"><b>$ &</b> </td>
<td class="vtl">explicit string addition</td>
</tr>
<tr>
<td class="vtl"><b>^</b> </td>
<td class="vtl">the power of</td>
</tr>
<tr>
<td class="vtl"><b>* /</b> </td>
<td class="vtl">multiply, divide (floating-point)</td>
</tr>
<tr>
<td class="vtl"><b>\ Div Mul</b> </td>
<td class="vtl">integer division, integer multiplication</td>
</tr>
<tr>
<td class="vtl"><b>% Mod Fmod</b> </td>
<td class="vtl">integer and the floating point modulo</td>
</tr>
<tr>
<td class="vtl"><b>+ - Add Sub</b> </td>
<td class="vtl">addition (the string addition, too) and subtraction</td>
</tr>
<tr>
<td class="vtl"><b><< >> Shl Shr Rol Ror</b> </td>
<td class="vtl">all shift and rotate operators (also: Shl%, Rol|, Sar8, etc.)</td>
</tr>
<tr>
<td class="vtl"><b>%& </b></td>
<td class="vtl">bitwise And</td>
</tr>
<tr>
<td class="vtl"><b>%| </b></td>
<td class="vtl">the bitwise Or</td>
</tr>
<tr>
<td class="vtl"><b>= == < > <= >= !=</b> </td>
<td class="vtl">all comparisons (also: NEAR ...)</td>
</tr>
<tr>
<td class="vtl"><b><font style="background-color: rgb(255, 255, 0);">And</font></b> </td>
<td class="vtl">bitwise And</td>
</tr>
<tr>
<td class="vtl"><b>Or</b> </td>
<td class="vtl">bitwise Or</td>
</tr>
<tr>
<td class="vtl"><b>Xor Imp Eqv</b> </td>
<td class="vtl">bitwise exclusive Or, implication and equivalence</td>
</tr>
<tr>
<td class="vtl"><b>&&</b> </td>
<td class="vtl">logical And</td>
</tr>
<tr>
<td class="vtl"><b>||</b> </td>
<td class="vtl">logical Or</td>
</tr>
<tr>
<td class="vtl"><b>^^</b> </td>
<td class="vtl">logical exclusive Or</td>
</tr>
<tr>
<td class="vtl"><b>Not</b> </td>
<td class="vtl">bitwise complement</td>
</tr>
</tbody></table>
<p>When an expression is evaluated the rules of operator precedence are applied. For instance, multiplication and division go before addition and subtraction. The table shows this by placing the <strong>*</strong> and <strong>/</strong> operators before (or above) <strong>+</strong> and <strong>-</strong>. Now look at the <strong>And</strong> operator; it comes<em> after</em> the comparison operators. This means that if an expression contains a comparison operator, it is evaluated (computed/calculated) before the <strong>And</strong> operator is applied. In our case, the part <em>%11 == 2</em> is evaluated before <strong>And</strong> is applied. Since %11 = 3, 3 is not equal to 2 (results in False) and x And 0 is always 0, the result is 0 (False). These are the steps involved in the evaluation:</p>
<p><font face="Courier New">(Step 1) If x And %11 == 2  <br />(Step 2) If x And False
<br />(Step 3) If x And 0
<br />(Step 4) If 0</font></p>
<p>Can you now see why the original example form above results in True?</p>
<pre>If <font color="#800000">x </font><font color="#005bb7">And </font><font color="#404040">%11 </font><font color="#005bb7">== </font><font color="#404040">3 </font><font color="#008000">' True for the wrong reason
</font></pre>
<p>The problem can be solved by using either parenthesis or <strong>%&:</strong></p>
<pre>If <font color="#005bb7">(</font><font color="#800000">x </font><font color="#005bb7">And </font><font color="#404040">%11</font><font color="#005bb7">) == </font><font color="#404040">2 </font><font color="#008000">' test if bit 1 is set
</font></pre>
<pre><strong>If <font color="#800000">x </font><font color="#005bb7">%& </font><font color="#404040">%11 </font><font color="#005bb7">== </font><font color="#404040">2 </font></strong><font color="#008000"><strong>' GB way</strong>
</font></pre>
<p>In all other languages than GB the first solution is used. However GB defines an additional 'And' operator with a higher precedence that comes before the comparison operators: the <strong>%&</strong> operator. See the table for its location.</p>
<p>The <strong>Or</strong> operator suffers from the same problem, so GB defines an or-operator with higher precedence, the <strong>%|</strong> operator.</p>
<p>Is there a moral to this story? Try to avoid the use of <strong>And</strong> (<strong>&</strong>) and <strong>Or</strong> (<strong>|</strong>), unless - for instance - when translating C/C++ code to GB. (C/C++ does not support <strong>%&</strong> and <strong>%|</strong>.) Otherwise you might prefer the use of <strong>%&</strong> and <strong>%|</strong>.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-70364577718614701922022-10-16T11:30:00.001+02:002022-10-16T11:30:02.046+02:00And / Or versus && / ||<p>Are you aware between the difference between <strong>And</strong> and <strong>&&</strong> and <strong>Or</strong> and <strong>||</strong>? <strong>And</strong> and <strong>Or</strong> are <em>mathematical operators</em>, while <strong>&&</strong> and <strong>||</strong> are<em> logical operators</em>, so they are quite different. The only place where the <strong>&&</strong> and <strong>||</strong> operators are used are in conditional statements like <strong>If</strong>, <strong>While</strong>, and <strong>Until</strong>. <strong>And</strong>  and <strong>Or</strong> are used in mathematical expressions (calculations) and are generally not meant to be used in the conditional commands  <strong>If</strong>, <strong>While</strong>, and <strong>Until</strong>.</p> <p>The following example shows the difference:</p> <pre>Local Int <font color="#800000">x </font>= <font color="#404040">2</font><font color="#005bb7">, </font><font color="#800000">y </font>= <font color="#404040">3
</font><font color="#008000">' The inefficient way using And:
</font>If <font color="#800000">x </font><font color="#005bb7">== </font><font color="#404040">0 </font><font color="#005bb7">And </font><font color="#800000">y </font><font color="#005bb7">== </font><font color="#404040">3
</font><font color="#008000">' do something
</font>EndIf
<font color="#008000">' The efficient way using &&:
</font>If <font color="#800000">x </font><font color="#005bb7">== </font><font color="#404040">0 </font><font color="#005bb7">&& </font><font color="#800000">y </font><font color="#005bb7">== </font><font color="#404040">3
</font><font color="#008000">' do something
</font>EndIf
</pre>
<p>The commands following the <strong>If </strong>statements aren't executed, but for different reasons.
<br /> The first <strong>If</strong> statement evaluates both expressions and then performs a mathematical operation on the result of both boolean expressions. The second <strong>If</strong> statement only evaluates the first expression and never bothers to check y == 3. Because <strong>And</strong> is a mathematical operator like +, -, *, / the expression <em>x == 0 And y == 3</em> is <u>completely </u>calculated. First x == 0 is evaluated, which produces the boolean value <strong>False</strong> (0). Then y == 3 is evaluated, which returns the boolean value <strong>True</strong>(-1). After calculating both expressions the boolean results are combined by the <strong>And</strong> operator: 0 <strong>And</strong> -1 which then returns 0 (False), because only one expression is <strong>True. </strong>These are steps involved:</p>
<p><font face="Courier New">(1) x == 0 And y == 3
<br />(2) FALSE And TRUE
<br />(3) FALSE</font></p>
<font face="Courier New"></font>
<p>The second <strong>If</strong> statement uses <strong>&&</strong>. Because <strong>&&</strong> is not a mathematical operator the second expression is <u>only</u> evaluated if the first expression is <strong>True</strong>. Note that an AND operator requires both operands to be TRUE to result TRUE, as you can see from this AND table:</p>
<table cellspacing="0" cellpadding="2" border="0"><tbody>
<tr>
<td valign="top">Value 1</td>
<td valign="top">Value 2</td>
<td valign="top">AND-Result </td>
</tr>
<tr>
<td valign="top">0</td>
<td valign="top">0</td>
<td valign="top">0</td>
</tr>
<tr>
<td valign="top">0</td>
<td valign="top">1</td>
<td valign="top">0</td>
</tr>
<tr>
<td valign="top">1</td>
<td valign="top">0</td>
<td valign="top">0</td>
</tr>
<tr>
<td valign="top"><strong>1</strong></td>
<strong></strong>
<td valign="top"><strong>1</strong></td>
<strong></strong>
<td valign="top"><strong>1</strong></td>
</tr>
</tbody></table>
<p>From the table you can see that if Value 1 equals 0 (FALSE) the result is always 0 (FALSE), despite Value 2. Only when Value 1 equals 1 (TRUE) Value 2 needs to be evaluated. The compiler produces code to do just that. It first evaluates the first expression x == 0 and because the result is FALSE the next expression y == 3 is never executed. This results in a considerable increase of performance, especially if the second expression calls a function. For instance, in the next example the function <em>div3()</em> is never called if x is 0 ( otherwise <em>div3()</em> would generate a division-by-zero exception):</p>
<pre>Local Int <font color="#800000">x </font>= <font color="#404040">0
</font>If <font color="#800000">x </font><font color="#005bb7">!= </font><font color="#404040">0 </font><font color="#005bb7">&& </font><font color="#800000">div3</font><font color="#005bb7">(</font><font color="#800000">x</font><font color="#005bb7">) == </font><font color="#404040">3
</font><font color="#008000">' do something
</font>EndIf
Function <font color="#800000">div3</font><font color="#005bb7">(</font>ByVal <font color="#800000">n </font><font color="#005bb7">As </font>Int<font color="#005bb7">) </font>As Int
<font color="#800000">foo </font>= <font color="#404040">3 </font><font color="#005bb7">/ </font><font color="#800000">n
</font></pre>
<p>The same is true for <strong>Or</strong> and <strong>||</strong>. Look at this OR-table, the result is always TRUE if the first value is TRUE.</p>
<table cellspacing="0" cellpadding="2" border="0"><tbody>
<tr>
<td valign="top">Value 1</td>
<td valign="top">Value 2</td>
<td valign="top">OR-Result</td>
</tr>
<tr>
<td valign="top">0</td>
<td valign="top">0</td>
<td valign="top">0</td>
</tr>
<tr>
<td valign="top">0</td>
<td valign="top">1</td>
<td valign="top">1</td>
</tr>
<tr>
<td valign="top"><strong>1</strong></td>
<strong></strong>
<td valign="top"><strong>0</strong></td>
<strong></strong>
<td valign="top"><strong>1</strong></td>
<strong></strong></tr>
<strong></strong>
<tr><strong></strong>
<td valign="top"><strong>1</strong></td>
<strong></strong>
<td valign="top"><strong>1</strong></td>
<strong></strong>
<td valign="top"><strong>1</strong></td>
</tr>
</tbody></table>
<p>In the next example the second expression (y == 4) isn't evaluated because the first expression (x == 2) is already TRUE, making the result TRUE despite the result of the second expression.</p>
<pre>Local Int <font color="#800000">x </font>= <font color="#404040">2</font><font color="#005bb7">, </font><font color="#800000">y </font>= <font color="#404040">3
</font>If <font color="#800000">x </font><font color="#005bb7">== </font><font color="#404040">2 </font><font color="#005bb7">|| </font><font color="#800000">y </font><font color="#005bb7">== </font><font color="#404040">4
</font><font color="#008000">' do something
</font>EndIf
</pre>
<p>If we used the mathematical operator <strong>Or,</strong> first both expressions would be evaluated and then the boolean results would be or-ed, an unnecessary extra operation. </p>
<p>The <strong>And</strong> operator may have a purpose in a conditional statement, but it would be used as a mathematical operator in the expression, for instance to test if certain bits are set:</p>
<pre>Local Int <font color="#800000">x </font>= <font color="#404040">%111 </font><font color="#008000">' binary notation of 7
</font>If <font color="#800000">x </font><font color="#005bb7">And </font><font color="#404040">%11 </font><font color="#005bb7">> </font><font color="#404040">0 </font><font color="#008000">' test if lower 2 bits are set
' do something
</font>EndIf
</pre>
<p>Here x (=7) is mathematically And-ed with 3 which results in 3, and 3 is larger than 0. The <strong>If</strong> statement will be executed. </p>
<p><strong>Conclusion</strong>
<br />Rather than using <strong>And</strong> and <strong>Or, u</strong>se the logical operators <strong>&&</strong> and <strong>||</strong> in conditional statements.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-19828165552883681172022-07-19T08:28:00.001+02:002022-07-19T08:28:59.148+02:00Numeric/string conversions<p>Ever wondered how numbers are printed? Check out the following snippet:</p> <pre>Dim <font color="#800000">i </font>As Int = <font color="#404040">2345
</font>Print <font color="#800000">i
</font></pre>
<p>Before the number is printed to the active window, the number is converted to a string using a hidden call of the <strong>Str</strong>(i) function. The same is true for printing a <strong>Date</strong> (numeric) value; the date-value is converted to a string before it is output in the Debug Output window:</p>
<pre>Dim <font color="#800000">d </font>As Date = <font color="#000080">Now
</font>Debug<font color="#000080">.Print </font><font color="#800000">d
</font>Debug <font color="#000080">Str(</font><font color="#800000">d</font><font color="#000080">) </font><font color="#008000">// short for Debug.Print
</font></pre>
<p>The output is (at the time of writing this blog) is:</p>
<p><font face="Courier New">18-7-2022 17:03:14
<br />18-7-2022 17:03:14</font></p>
<p>The snippet demonstrates that the date is converted using a hidden call of the <strong>Str</strong>() function. It is not possible to print any numeric value without converting it to a string first. GFA-BASIC 32 uses hidden calls to the <strong>Str</strong>() function to convert the numeric value(s). The need for a numeric-to-string conversion before printing to screen (or printer) is that the underlying output functions require strings. For instance, to put the value on the screen the <strong>Print</strong> command uses the API function <em>TextOut(hDc, x, y, strAddr, strLen),</em> which requires a string.</p>
<p>Another implicit to string conversion is demonstrated in this example:</p>
<pre>Dim <font color="#800000">s </font>As String<font color="#000080">, </font><font color="#800000">i </font>As Int = <font color="#404040">2345</font><font color="#000080">, </font><font color="#800000">d </font>As Date = <font color="#000080">Now
</font><font color="#800000">s </font>= <font color="#800000">i </font><font color="#000080">& </font><font color="#804000">" " </font><font color="#000080">& </font><font color="#800000">d
</font>Debug<font color="#000080">.Print </font><font color="#800000">s </font><font color="#008000">// shows: 2345 18-7-2022 17:12:44
</font></pre>
<p>The<strong> &</strong> string operator allows to concatenate numeric and string values without converting them to a string explicitly. Still, under the hood, everything is converted to a string first. A nasty habit of the <strong>Str()</strong> function is to insert a space in front of converted value (a VB compatible setting). To prevent the space insertion use <strong>Mode StrSpace</strong> "0" somewhere at the beginning of the program.</p>
<p><strong>The Str() and CStr() functions</strong>
<br />The <strong>Str</strong>() function converts the value argument using a classic-style method, the output of the function is not language dependent. The produced string does not contain locale info for punctuation to separate the thousands and decimals in the value. A floating point is converted to a string with a single dot as separator. If the value is too large or too small the exponent notation is used.</p>
<pre><font color="#800000">s </font>= <font color="#000080">Str( </font><font color="#404040">1 </font><font color="#000080">/ </font><font color="#404040">3</font><font color="#000080">) </font><font color="#008000">// argument is a Double
</font>Debug <font color="#800000">s </font><font color="#008000">// 0.333333333333333
</font><font color="#800000">s </font>= <font color="#000080">Str(_minDbl) </font><font color="#008000">// a very small number
</font>Debug <font color="#800000">s </font><font color="#008000">// -1.79769313486232e+308
</font></pre>
<p>The output of <strong>Str</strong>() can not be manipulated. However, there is another function that converts the numeric value according the user's regional or language settings, the <strong>CStr</strong>() function.</p>
<pre>Dim <font color="#800000">f </font>As Float = <font color="#404040">1000.2345
</font>Debug<font color="#000080">.Print CStr(</font><font color="#800000">f</font><font color="#000080">) </font><font color="#008000">// output: 1000,234
</font></pre>
<p>Here the output follows the regional setting for the Netherlands where the decimal part is separated with a comma. The <strong>CStr</strong>() function follows the rules defined by the OLE API function <a href="https://docs.microsoft.com/en-us/windows/win32/api/oleauto/nf-oleauto-variantchangetypeex"><em>VariantChangeTypeEx()</em></a><em> </em>that handles coercions between fundamental data-types, including numeric-to-string and string-to-numeric coercions. One of the parameters of the API is the LCID, a value that uniquely identifies the language to use. GFA-BASIC 32 stores the LCID value at start-up, by querying the user's default LCID from the OS. The LCID value is stored in the <strong>Mode</strong> structure and cannot be changed directly. The only way to modify the internal LCID is by using the <strong>Mode Lang</strong> command. By specifying a 3 letter language abbreviation GB32 will change the internal LCID value accordingly.</p>
<pre>Dim <font color="#800000">sMyLanguage </font>As String = <font color="#000080">Mode(Lang)
</font>Mode Lang <font color="#804000">"DEU" </font><font color="#008000">// change to German, LCID is changed.
</font></pre>
<p>If you're not satisfied with the numeric format produced by <strong>CStr</strong>() you can switch to the <strong>Format</strong>() function. The <strong>Format</strong>() function not only allows language depending conversion, but you can fine tune the output for your particular needs. When your user inputs a value in a language dependent value, for instance by using a <strong>TextBox</strong>, your program must be able to convert the string to a numeric datatype in GFA-BASIC's internal format using one of the <strong>C*()</strong> conversion functions, like <strong>CInt($).</strong></p>
<p><strong>String to numeric</strong>
<br />Converting from string to numeric, is done using the <strong>Val*()</strong> functions or the other <strong>C*()</strong>-conversion functions. The <strong>Val*</strong> functions accept strings containing numeric values in the classical format, ie. the only punctuation allowed is a dot in floating point values. To convert to a <strong>Double</strong> use either <strong>Val()</strong> or its synonym <strong>ValDbl()</strong>:</p>
<pre>Dim <font color="#800000">d </font>As Double<font color="#000080">, </font><font color="#800000">sValue </font>As String = <font color="#804000">"1000.234567"
</font><font color="#800000">d </font>= <font color="#000080">Val(</font><font color="#800000">sValue</font><font color="#000080">)
</font><font color="#800000">d </font>= <font color="#000080">ValDbl(</font><font color="#800000">sValue</font><font color="#000080">)
</font></pre>
<p>To convert to a 32-bit integer use <strong>ValInt()</strong> and for a 64-bit integer <strong>ValLarge()</strong>.</p>
<p>The <strong>Val()</strong> functions are not suited for language dependent formatted values. In the next snippet, the number is formatted according the regional settings of the Netherlands and is then converted to a <strong>Double</strong> using <strong>CDbl()</strong>.</p>
<pre>Dim <font color="#800000">d </font>As Double<font color="#000080">, </font><font color="#800000">sValue </font>As String = <font color="#804000">"1.000,23"
</font><font color="#800000">d </font>= <font color="#000080">CDbl(</font><font color="#800000">sValue</font><font color="#000080">)
</font>Debug <font color="#800000">d </font><font color="#008000">// output: 1000.23
</font></pre>
<p><strong>CDbl()</strong> uses the same  API function <a href="https://docs.microsoft.com/en-us/windows/win32/api/oleauto/nf-oleauto-variantchangetypeex"><em>VariantChangeTypeEx()</em></a><em> </em>to process the string and change it into a floating-point value. To parse a language dependent formatted numeric string use any of the following functions: </p>
<p>Bool = <strong>CBool</strong>(); Byte = <strong>CByte</strong>(); Currency = <strong>CCur</strong>(); Date = <strong>CDate</strong>(); Double = <strong>CDbl</strong>(); Short = <strong>CShort</strong>(); Integer = <strong>CInt</strong>() or Long = <strong>CLong</strong>(); Handle = <strong>CHandle</strong>(); Large = <strong>CLarge</strong>(); Single = <strong>CSng</strong>() or Single = <strong>CFloat</strong>(); String = <strong>CStr</strong>(); Variant = <strong>CVar</strong>()</p>
<p>These function not only parse strings, but can also be used to convert any other data-type using an explicit cast. For instance:</p>
<pre>Dim <font color="#800000">i </font>As Int<font color="#000080">, </font><font color="#800000">b </font>As Bool = <font color="#000080">True
</font><font color="#800000">i </font>= <font color="#000080">CInt(</font><font color="#800000">b</font><font color="#000080">) </font><font color="#008000">// i becomes -1, same as i = b
</font></pre>
<p>These explicit casts produce the same code as simply assigning one datatype to another.</p>
<p><strong>Conclusion</strong>
<br /><strong>CStr()</strong> produces a language dependent formatted string using the current LCID value. The <strong>C*</strong> conversion functions use the LCID language value for conversion to a numeric datatype. <strong>Format()</strong> offers more possibilities to format a numeric value. <strong>Str()</strong> and <strong>Val*()</strong> function use classical formatted values. </p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-72973124567355061812022-04-25T11:18:00.001+02:002022-04-25T11:18:14.016+02:00Variables and parameters<p>Let’s discuss some basic issues of variables and parameters and explain auto-complete information about variables and parameters.</p> <p>This blog post is a sequel to: <a href="http://gfabasic32.blogspot.com/2020/07/where-are-variables-stored.html"><strong>Where are variables stored?</strong></a></p> <p><strong>Variable declaration</strong> <br />Before a variable can be used it must have been declared explicitly. A declaration introduces the variable-name into the compiler’s database. The declaration requires a name for the variable and a datatype so that the compiler knows what to do with that variable; an integer variable is handled completely different than a string variable. Usually, the type is specified in a declaration statement. If the type is omitted the variable gets the default type <strong>Variant</strong>.</p> <pre>Global <font color="#800000">i </font>As Int<font color="#000080">, </font><font color="#800000">v </font><font color="#008000">' an integer and a Variant
</font></pre>
<p>Not specifying a type introduces a <strong>Variant</strong> that might quickly cause confusion and problems. <strong>Variant-</strong>operations use different functions than – for instance – integer and floating-point operations. When a <strong>Variant</strong> is used to store a numeric value, simply incrementing it would require the call of a special <em>Variant-Increment</em> function in the runtime. Incrementing a simple data type as <strong>Int</strong> and <strong>Float</strong> is an (almost) atomic operation and requires only one CPU or FPU instruction. Therefor, it requires some attention when declaring variables. An error is quickly made as shown in the next line:</p>
<pre><font color="#ff0000">Global pic1, pic2 as Picture ' probably not wanted
</font></pre>
<p>This line declares two variables. Two Picture variables are required, but <em>pic1</em> is a <strong>Variant</strong>!
<br />Instead use this:</p>
<pre>Global Picture <font color="#800000">pic1</font><font color="#000080">, </font><font color="#800000">pic2
</font></pre>
<p>Before the introduction of auto-complete it was difficult to note these errors. Now auto-complete shows you the type of the variable. Here the type of <em>pic1 </em>variable that was wrongly declared:</p>
<a href="https://drive.google.com/uc?id=1BGplIbf1OdeeZIIsd-uxXBBXS-1_q2H4"><img title="Screenshot 2022-03-04 Variant AC" style="display: inline; background-image: none;" border="0" alt="Screenshot 2022-03-04 Variant AC" src="https://drive.google.com/uc?id=1Gma8bQYVl207gvZS_LMb2xs1BGpdrh_f" width="393" height="169" /></a>
<p><strong>Global, local and static</strong>
<br />Other statements to declare variables are <strong>Local</strong>, <strong>Dim</strong>, and <strong>Static</strong>. The <strong>Local</strong> statement declares a variable that only exists in a procedure. When <strong>Dim</strong> is used inside a procedure it declares local variables, when it is used in the main part of the program it introduces global variables. (Note that the main part of the program can have local variables as well using the <strong>Local</strong> statement.) When a procedure returns the local variables <em>go out of scope</em> and the variables are removed from the stack or and the dynamic variables are released (their memory is deleted).
<br />The variables declared with <strong>Static</strong> are global but only locally visible. They are not freed when they go out of scope, they keep their contents. </p>
<p><strong>Initialization while declaring</strong>
<br />Declaring a variable adds it to the compiler’s database, a declaration does not introduce any executable code! A common practice is to collect the declaration of global variables in a separate procedure often called <em>Init</em> or something like that. Note that such a procedure doesn’t need to be executed, i.e. called from the main-part of the program. The procedure would not contain any executable code.
<br />However, this changes if the declaration is used to initialize the variable with a value:</p>
<pre>Global <font color="#800000">s </font>As String = <font color="#804000">"Hello"
</font></pre>
<p>Now the declaration statement contains executable code that needs to executed when the program is run. The statement introduces the variable <em>s</em> into the compiler’s database and produces code to copy “Hello” into the string variable. If the program uses a procedure to declare globals that also initialize the variables, the procedure should be executed when the program is run. The procedure must also be run if the contains array declarations.</p>
<p>A special case is the <strong>Static</strong> local-variable, which is usually initialized while being declared. The initialization code is executed only once: the first time the <strong>Static</strong> statement is executed. (This is accomplished by guarding the <strong>Static</strong> statement by a hidden global boolean variable. After executing the <strong>Static</strong> statement the hidden boolean is set to true and the statement is never executed again.) Here is an excerpt form gfawinx.lg32’s WinDpi function:</p>
<pre>Function <font color="#800000">WinDpi</font><font color="#000080">(</font><font color="#800000">hWnd </font><font color="#000080">As </font>Handle<font color="#000080">) </font>As Long
Static Long <font color="#800000">pfnGetDpiForWindow </font>= <font color="#000080">GetProcAddress( _
GetModuleHandle(</font><font color="#804000">"user32.dll"</font><font color="#000080">), </font><font color="#804000">"GetDpiForWindow"</font><font color="#000080">)
</font>If <font color="#800000">pfnGetDpiForWindow </font><font color="#008000">' works from Windows 8.1
</font><font color="#800000">WinDpi </font>= <font color="#000080">StdCall(</font><font color="#800000">pfnGetDpiForWindow</font><font color="#000080">)(</font><font color="#800000">hWnd</font><font color="#000080">)
</font>Else
<font color="#800000">WinDpi </font>= <font color="#000080">GetDeviceCaps(Screen.GetDC, LOGPIXELSX)
</font>Screen<font color="#800000">.</font><font color="#000080">ReleaseDC
</font>EndIf
EndFunc
</pre>
<p>The <em>pfnGetDpiForWindow</em> is only initialized once with the function pointer to <em>GetDpiForWindow()</em> API or null if it isn’t supported. If the <em>WinDpi()</em> function is executed again, the <em>pfnGetDpiForWindow</em> variable is still pointing to the API or it is still null. If the API isn’t supported by the Windows version, the DPI of the screen-device context is returned.</p>
<p><strong>Simple datatype parameters</strong>
<br />When declaring procedure parameters you need to decide whether to pass a value or variable <em>by value</em> (<strong>ByVal</strong>) or <em>by reference</em> (<strong>ByRef</strong>). In general, a parameter is passed by value unless the passed variable needs to be modified. A by value parameter is pushed on the stack by the caller and popped from the stack by the called procedure. Passing a 32-bit integer by value requires 4 bytes of stackspace, passing a <strong>Variant</strong> by value takes 16 bytes (the size of a <strong>Variant</strong>).
<br />When a variable is passed by reference the storage location of the variable – a 32-bit memory address -  is pushed on the stack. A <strong>Variant</strong> passed by reference takes only 4 bytes of stackspace. However, a by reference variable requires an additional step from the compiler: it needs to obtain the address of the variable before pushing it on the stack. </p>
<p><strong>Dynamic datatype parameters</strong>
<br />How about passing an array, hash, string, variant, or object (OCX) parameter? Well, an array is simple, it can only be passed by reference. A hash can not be passed without problems due to a bug in GFA-BASIC. </p>
<p>Passing a string by reference is faster than passing it by value. A by value string is first copied in the calling procedure and then the (hidden) copy is passed by reference. It isn’t possible to copy an entire string on the stack! Because the string is first copied, it takes a <em>malloc</em> to allocate the string memory and a <em>memcpy</em> to copy the string’s characters. So, it can be (much) faster to pass a string by reference, you only need to make sure you don’t change the contents of the by reference string parameter.  <br />Auto-complete cannot differentiate between these types of string parameters and always presents a string parameter with the Ref clause.</p>
<a href="https://drive.google.com/uc?id=1XyBrldiMIaurOxPoTUwNX1UkzsaVlFqA"><img title="Screenshot 2022-03-11 085036" style="display: inline; background-image: none;" border="0" alt="Screenshot 2022-03-11 085036" src="https://drive.google.com/uc?id=1Z8MK6Jy5OtjCeG45fK-qND-1LvlqX213" width="379" height="73" /></a>
<p>A COM object variable is best passed by value, it only takes 4 bytes to pass the contents of a COM variable. A COM or Ocx variable is a 32-bits integer pointing to the actual COM object. The only need for a by reference COM parameter is when the object must be set to <strong>Nothing</strong>. </p>
<p>Passing a <strong>Variant</strong> by value may cause trouble and even a program crash if not handled properly. The rule of thumb is: </p>
<p><font style="background-color: rgb(255, 255, 0);">Don’t write to a by value Variant parameter (don’t use the by value variant parameter as a convenient extra local variable).</font> </p>
<table cellspacing="0" cellpadding="4" border="1"><strong></strong><tbody><strong></strong>
<tr><strong></strong>
<td valign="top"><strong>Explanation of variant parameter issue</strong></td>
<strong></strong></tr>
<strong></strong>
<tr><strong></strong>
<td valign="top">Often a subroutine parameter is used as an extra local variable that can be written to. For instance, the ByVal <em>s</em> parameter in the procedure <em>foo</em> above can be used to temporarily store a string, s is a copy of the string passed to the procedure. Writing to <em>s</em> won’t affect the string in the caller. A variant containing a string that is to be passed to a procedure by value <em>does not copy the string before invoking the procedure</em>.
<pre>Dim <font color="#800000">vnt </font>= <font color="#804000">"Hello"
</font><font color="#800000">foo</font><font color="#000080">(</font><font color="#800000">vnt</font><font color="#000080">) </font><font color="#008000">' by value
</font>Trace <font color="#800000">vnt </font><font color="#008000">' wrongly displays Hello
</font>Proc <font color="#800000">foo</font><font color="#000080">(</font>ByVal <font color="#800000">v </font><font color="#000080">As </font>Variant<font color="#000080">)
</font><font color="#800000">v </font>= <font color="#804000">"GFA BASIC GFA BASIC GFA BASIC"
</font></pre>
<p>This code sample produces problems. The <em>vnt</em> variable stores a pointer to an OLE string containing “Hello”. When passed by value the parameter <em>v</em> is a copy of <em>vnt</em>, a 16 bytes data-structure with type information (VT_BSTR) and a pointer to the OLE string “Hello” on the stack. Assigning a new string to <em>v</em> will release the OLE memory currently pointed to by <em>v</em>. The new OLE string’s memory address is stored in <em>v</em>, together with the new data type (again a VT_BSTR). When leaving a procedure parameters aren’t cleared, so the <em>foo</em> procedure does not free the new contents of <em>v</em>. The variant’s 16 bytes occupying the stack are simply popped off the stack, leaving the new OLE string unreferenced. After returning from calling <em>foo</em> there is nothing that holds a pointer to the new OLE string and the OLE memory will never be released, the program is leaking memory. </p>
<p>Now, why does <strong>Trace</strong> vnt display “Hello”? After executing <em>foo</em>, the <em>vnt</em> variable is still referencing the OLE memory allocated by the assignment of “Hello”. The OLE string was released in <em>foo</em> when the new string was assigned, but the original variable <em>vnt</em> is never updated. The variable <em>vnt</em> still references the memory bytes where Hello <em>was</em> stored, bytes that weren’t actually cleared when released. The variable <em>vnt</em> references released OLE memory. When <em>vnt</em> goes out of scope, at the end of the program, it is released by GFA-BASIC by calling the OLE system function <em>VariantClear()</em>. Since the variable <em>vnt</em> points to released memory, the program may crash.</p>
</td>
<strong></strong></tr>
<strong></strong></tbody><strong></strong></table>
<p><strong>The type of procedures and parameter-defaults</strong>
<br />To declare a subroutine you can choose between a <strong>Procedure</strong>, <strong>Sub</strong>, <strong>Function</strong>, or <strong>FunctionVar</strong>. The rule of thumb here is to use a <strong>Procedure</strong> or <strong>Function</strong>, unless you explicitly need a <strong>Sub</strong> or <strong>FunctionVar</strong>. The <strong>Sub</strong> is needed for event procedures where the parameters are passed by reference, the default behavior for a <strong>Sub</strong>. However, using a <strong>Sub</strong> as a general procedure might cause problems due to a flaw in the default by reference behavior. See the link at the end of this post for more information. If you use a <strong>Sub</strong> for something else than event subs make sure to use an explicit <strong>ByRef</strong> or <strong>ByVal</strong> clause in the declaration of the parameters.</p>
<p>Default behavior of procedures and functions:</p>
<table cellspacing="0" cellpadding="4" border="1"><tbody>
<tr>
<td valign="top"><strong>Type of subroutine  </strong></td>
<strong></strong>
<td valign="top"><strong>Default ByVal or ByRef  </strong></td>
<strong></strong>
<td valign="top"><strong>Default datatype  </strong></td>
<strong></strong>
<td valign="top"><strong>Default return datatype</strong></td>
</tr>
<tr>
<td valign="top"><strong>Procedure</strong></td>
<td valign="top">ByVal</td>
<td valign="top">Double</td>
<td valign="top">-</td>
</tr>
<tr>
<td valign="top"><strong>Sub</strong></td>
<td valign="top">ByRef in event subs,
<br />otherwise flawed</td>
<td valign="top">Variant</td>
<td valign="top">-</td>
</tr>
<tr>
<td valign="top"><strong>Function</strong></td>
<td valign="top">ByVal</td>
<td valign="top">Double</td>
<td valign="top">Ref Variant</td>
</tr>
<tr>
<td valign="top"><strong>FunctionVar</strong></td>
<td valign="top">ByRef</td>
<td valign="top">Variant</td>
<td valign="top">Ref Variant</td>
</tr>
</tbody></table>
<p>As you can see, a function’s default return type is a <em><u>by reference Variant</u></em>. This means that the caller of the function passes a <strong>Variant</strong> by reference, the variant is ‘owned’ by the caller. This is illustrated by the following example:</p>
<pre>Proc <font color="#800000">foo</font><font color="#000080">()
</font>Dim <font color="#800000">v </font>As Variant
<font color="#800000">v </font>= <font color="#800000">GetValue</font><font color="#000080">() </font><font color="#008000">' passes v by reference
</font>EndProc
Function <font color="#800000">GetValue</font><font color="#000080">() </font><font color="#008000">' default is variant
</font><font color="#800000">GetValue </font>= <font color="#404040">10 </font><font color="#008000">' this references v from foo
</font>EndFunc
</pre>
<p>The <em>GetValue</em> = 10 assignment writes to the <em>v</em> variable from <em>foo() </em>directly<em>.</em></p>
<p>Here you see the auto-complete information of the function-variable <em>GetValue</em>:</p>
<a href="https://drive.google.com/uc?id=1EtYVb_CfL3N0MiSrctATAc343s2kkxHk"><img title="Screenshot 2022-03-06 101409" style="display: inline; background-image: none;" border="0" alt="Screenshot 2022-03-06 101409" src="https://drive.google.com/uc?id=13BFqZy_gIdh9hlP6vZK62yV3BS2Yru5z" width="463" height="86" /></a>
<p>If the function’s return type is <strong>String</strong>, <strong>Object</strong> (or other Ocx type) or a user defined type, the caller passes a by reference variable to the called function.
<br />A function cannot return an array or <strong>Hash</strong> datatype.
<br />Note - Each function automatically gets a ‘local’ variable with the function’s name and type. This function-variable can only be used to assign a value, it is not available as a real local variable that can be used to read from; consequently auto-complete won’t show the function variable in a ‘read-context’. </p>
<p><strong>Finally</strong>
<br />Pay attention when declaring variables to not introduce unwanted <strong>Variants</strong>. Explicitly use <strong>ByVal</strong> or <strong>ByRef</strong> when declaring subroutine parameters, and also explicitly specify the datatype (either by name or by postfix). Auto-complete always shows by reference for string parameters, even if they are passed by value. The default return type of a function is a by reference <strong>Variant</strong>. Don’t use a <strong>Variant</strong> parameter as a general local variable, ie. don’t write to the variant.</p>
<p>See also: <a href="http://gfabasic32.blogspot.com/2018/03/function-and-sub-parameters.html">Function and Sub parameters</a> & <a href="http://gfabasic32.blogspot.com/2014/06/passing-default-byref-parameters-to-sub.html">Passing default ByRef parameters to a Sub</a></p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-30306813331191907162022-03-13T11:29:00.001+01:002022-03-13T11:29:17.616+01:00Update 2.62 March 2022<p>A picture says more than 1000 words, therefor a screenshot with notes of improvements and fixes of the IDE (running on Windows 11): </p> <a href="https://drive.google.com/uc?id=1V3GRiRkfzX6_0HN8oSTSGM2ms9v-q841"><img title="Update 262" style="display: inline; background-image: none;" border="0" alt="Update 262" src="https://drive.google.com/uc?id=1jwvwUDm85fIaZyqeUIt1-r6tVD0nrHKR" width="583" height="604" /></a> <p><strong>Runtime Updates</strong>    <br /> Since last year virus-scanners report the patched runtime (GfaWin23.Ocx) as malicious - a false positive! Consequently, it is no longer possible to release a runtime binary with bug fixes. A new way of fixing bugs had to be introduced. Starting with this update version 2.62 the runtime bugs are fixed on the fly, they are patched when the program is run (F5). For this to happen each new program automatically inserts the following lines:</p> <pre>$Library <font color="#804000">"UpdateRT"
</font>UpdateRuntime <font color="#008000">' Patches GfaWin23.Ocx
</font></pre>
<p>The <strong>$Library</strong> “UpdateRT” command loads the compiled code with the exported procedure <strong>UpdateRuntime</strong>. The <strong>UpdateRuntime</strong> should be the first statement executed, so that the runtime is fixed before the actual program is run. By taking this approach we can continue fixing runtime bugs!
<br />You can inspect the source code in UpdateRT.g32, which is stored in the Include directory.
<br />For older programs these lines have to be added manually, so that they benefit form the fixes as well.</p>
<p>See also: <a href="http://gfabasic32.blogspot.com/2021/09/update-26-produces-false-positive.html">Update 2.6 produces a false positive (virus scanner)</a></p>
<p><strong>Fixed: the Branch-Optimization compiler bug</strong>
<br />This update sets an important step forward by fixing the compiler’s <em>Branch-Optimizing</em> bug. When <em>Branch-Optimizations</em> was set to any other value than zero the program could crash in one particular situation: when a <strong>Case</strong> or <strong>Otherwise</strong> statement was directly followed by an <strong>Exit</strong> command or one of its variants (<strong>Exit</strong>,<strong> Exit For</strong>/<strong>Do</strong>, <strong>Exit Proc</strong>, etc). The EXE crashed also if ‘<em>Full Optimization for EXE’</em> was set. Now this problem is fixed, your program can benefit from full branch optimization, it reduces the size of the program by 10% and increases performance.</p>
<p><strong>A couple of new IDE features</strong>. </p>
<ul>
<li>The editor now shows format lines (toggle with Ctrl+F7) and you can use PeekView to hoover over format lines to see what statements are connected by a format line. </li>
<li>New projects can be started from a template, ranging from a simple Hello World app to a sophisticated dpi-aware application. The templates can be found in the File | New menu-item.</li>
<li>AC (auto-complete) comes with many improvements. </li>
<li>In dark-mode the proc-line color is changed and the auto-complete list box is displayed in dark mode as well. </li>
</ul>
<p>See Readme262.rtf for more fixes and improvements.</p>
<p><strong>New Commands/Functions in gfawinx.lg32</strong></p>
<ul>
<li><strong>PrevInstance</strong> helps in starting a program only once. </li>
<li><strong>DlgCenter</strong> centers all GB32 dialog boxes in the main thread on top of their owner (Me).
<br /><strong>DlgCenterHook</strong> is used to center the dialog boxes in a additional threads. </li>
<li><strong>WorkWidth</strong> & <strong>WorkHeight</strong> return the real size of the clientarea of a Form with a toolbar and/or statusbar.</li>
<li><strong>OffsetXY</strong> sets the graphical offset using positive values for GB32 graphical commands. </li>
<li><strong>VStrLen</strong>, <strong>VStrLenB</strong>, and <strong>VStrPtr</strong> return the length (in character or bytes) and the address of a string in a Variant. </li>
<li><strong>AutoFreePtr</strong> returns a COM object for storage of handles and (memory) pointers that need proper releasing, even when the program halts with a runtime error or Stop/End. The COM object has a <strong>Ptr</strong> (read/write) property to read and update the resource after the object is created.   </li>
</ul>
<p>See the updated CHM help-file for detailed information about these new features.
<br />Note – gfawinx.lg32 is loaded automatically in new projects. Optionally, this can be disabled in the Extra tab of GFA-BASIC 32 Properties. </p>
<p><strong>The new App_Close event</strong>
<br />Probably the most important new feature of this update is the introduction of an application close event: the <strong>App_Close</strong> event sub. This event sub is automatically called after the program is closed. It provides a way to free global resources that might never be released otherwise. This happens when developing a program and the program stops abruptly with a runtime error. This happens all the time. When a runtime error occurs the IDE shows a message box telling about the error and puts an arrow on the line that caused the error. Maybe you don’t always realize, but after execution stopped no more code is executed and allocated resources won’t be released. For instance:</p>
<pre>OpenW <font color="#404040">1
</font><font color="#008000">' Create global resources
</font>Do
Sleep
Until <font color="#000080">Me Is Nothing
</font><font color="#008000">' Delete resources: might never be reached!
</font></pre>
<p>The releasing of resources also fails when a program ends with the <strong>End</strong> or <strong>Stop</strong> statement, no more code is run after these commands. Any API handles, memory pointers, bitmaps, and other global resources are not released and the program is leaking memory. When the program is run again and then stops again in the middle of the execution the leakage accumulates and soon you might experience unexpected errors. Even more, there are situations where the program can’t be run again, because of locked handles (for instance mutex handles). By using App_Close this leaking is over:</p>
<pre>OpenW <font color="#404040">1
</font><font color="#008000">' Create global resources
</font>Do
Sleep
Until <font color="#000080">Me Is Nothing
</font>Sub <font color="#800000">App_Close</font><font color="#000080">()
</font><font color="#008000">' Delete resources: guaranteed to be released!
</font>EndSub
</pre>
<p>Now put the program-lines that free the resources in the <strong>App_Close</strong> sub and the global resources are guaranteed to be released in all situations.  </p>
<p><strong>The AutoFreePtr object</strong>
<br />The implementation of <strong>App_Close</strong> is only possible through the introduction of the <strong>AutoFreePtr</strong> object. Instead of using the <strong>App_Close</strong> event sub a resource can also be assigned to an <strong>AutoFreePtr</strong>, which will call a predefined or custom procedure to free the resource. Because <strong>App_Close</strong> can only be used for globally stored resources, any local resource can be automatically released by using an <strong>AutoFreePtr</strong>. For instance, when a procedure temporarily allocates some memory that needs to be freed at the end of procedure:</p>
<pre>Proc <font color="#800000">Something
</font>Local <font color="#800000">pmem </font>As Long<font color="#000080">, </font><font color="#800000">Mem </font>As Object
<font color="#800000">pmem </font>= <font color="#000080">mAlloc(</font><font color="#404040">100</font><font color="#000080">) </font><font color="#008000">' alloc some memory
' Allocate an AutoFreePtr object and
' let it call mFree() automatically
</font>Set <font color="#800000">Mem </font>= <font color="#000080">AutoFreePtr(</font><font color="#800000">pmem</font><font color="#000080">, </font><font color="#ff0080">AfpMfree</font><font color="#000080">)
</font><font color="#008000">' use pmem or Mem.Ptr
</font><font color="#800000">pmem </font>= <font color="#000080">mShrink(</font><font color="#800000">pmem</font><font color="#000080">, </font><font color="#404040">50</font><font color="#000080">) </font><font color="#008000">' resize memoryblock
</font><font color="#800000">Mem.Ptr </font><font color="#000080">= </font><font color="#800000">pmem </font><font color="#008000">' assign new pointer
</font>EndProc <font color="#008000">' No mFree call necessary!
</font></pre>
<p>The <strong>AutoFreePtr</strong> object provides a <strong>Ptr</strong> property (Long - Get/Put) to read the assigned pointer or handle and to re-assign a new pointer/handle.  <br />The <strong>AutoFreePtr</strong> can free several predefined pointer or handle types. By specifying an <em><strong>Afp*</strong></em> constant you can instruct the <strong>AutoFreePtr</strong> object to invoke that specific release function for you. See the helpfile for more info on which types can be freed automatically.
<br />Instead of specifying a constant to execute a predefined freeing-function, you can set a custom procedure to call when the <strong>AutoFreePtr</strong> object goes out of scope.</p>
<pre>Proc <font color="#800000">Something2
</font>Local <font color="#800000">pmem </font>As Long<font color="#000080">, </font><font color="#800000">Mem </font>As Object
<font color="#800000">pmem </font>= <font color="#000080">mAlloc(</font><font color="#404040">100</font><font color="#000080">) </font><font color="#008000">' alloc some memory
</font>Set <font color="#800000">Mem </font>= <font color="#000080">AutoFreePtr(</font><font color="#800000">pmem</font><font color="#000080">, ProcAddr(</font><font color="#800000">FreeMem</font><font color="#000080">))
</font><font color="#008000">' use pmem or Mem.Ptr
</font>EndProc <font color="#008000">' mFree executed in FreeMem()
</font>Proc <font color="#800000">FreeMem</font><font color="#000080">(</font>ByVal <font color="#800000">ptr </font><font color="#000080">As </font>Long<font color="#000080">)
</font>~<font color="#000080">mFree(</font><font color="#800000">ptr</font><font color="#000080">)
</font>EndProc
</pre>
<p>Start using <strong>App_Close </strong>and <strong>AutoFreePtr</strong> to develop without leaking memory and handles.</p>
<p>Download the new update: <a href="http://gfabasic32.blogspot.com/p/download.html">GFA-BASIC 32 for Windows: Download</a><u><font color="#0066cc"></font></u></p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-42966301733620303542021-11-12T11:46:00.000+01:002021-11-12T11:48:38.996+01:00Code Performance Timing<p>This post discusses performance timing of a piece of code. Basically, there are two methods of timing, either by using the <strong>_RDTSC</strong> function or the <strong>Timer </strong>function. <strong>_RDTSC</strong> timing uses the CPU’s internal clock and <strong>Timer</strong> (<em>QueryPerformanceCounter</em>) uses the preferred, most reliable and portable timing method selected by Windows. Note that code using <strong>_RDTSC</strong> isn’t portable, it cannot be used in production code to perform timing, instead always use <strong>Timer</strong> (<em>QueryPerformanceCounter</em>). </p> <p><strong>Setting the scene</strong> <br />Recently I converted a piece of GFA-BASIC 32 code to assembler and wondered how much faster it was. I used the <strong>_RDTSC</strong> function to time the execution-speed of the code. The structure of the program was this:</p> <pre>Dim <font color="#800000">t </font>As Large
$StepOff
<font color="#800000"><font color="#222222">. db </font><font color="#000080">0x0F, 0xAE, 0xE8 </font><font color="#008000">// LFENCE opcode
</font><font color="#800000"></font>t </font>= <font color="#000080">_RDTSC
</font><font color="#008000">' execute GB32 code
</font><font color="#800000"><font color="#222222">. db </font><font color="#000080">0x0F, 0xAE, 0xE8 </font><font color="#008000">// LFENCE opcode
</font><font color="#800000"></font>t </font>= <font color="#000080">_RDTSC - </font><font color="#800000">t </font><font color="#000080">: </font>Debug <font color="#804000">"GB32-code:"</font><font color="#000080">; </font><font color="#800000">t
<font color="#222222">. db </font><font color="#000080">0x0F, 0xAE, 0xE8 </font><font color="#008000">// LFENCE opcode
</font><font color="#800000"></font>t </font>= <font color="#000080">_RDTSC
</font><font color="#008000">' execute assembler code
</font><font color="#800000"><font color="#222222">. db </font><font color="#000080">0x0F, 0xAE, 0xE8 </font><font color="#008000">// LFENCE opcode
</font><font color="#800000"></font>t </font>= <font color="#000080">_RDTSC - </font><font color="#800000">t </font><font color="#000080">: </font>Debug <font color="#804000">"Asm-code:"</font><font color="#000080">;</font><font color="#800000">t
</font>$Step
</pre>
<p>The <strong>$StepOff</strong> command disables the inclusion of debugging code; the GB32-code following <strong>$StepOff</strong> is compiled without instructions to call a <strong>Tron</strong> proc. It also disables the possibility to break (or stop) the program. The compiler switch <strong>$Step</strong>(<strong>On</strong>) re-enables the inclusion of <strong>Tron</strong> calls (and the possibility to break). Usually, these compiler switches are only used temporary for a small piece of code that needs to run at optimal speed in the IDE. A compiled to EXE (LG32 or GLL) program does not include the<strong> $StepOn</strong> functionality.</p>
<p>The test program gave me the following results: the GB32-code executed at ~4500 ticks and the assembler at ~3600 ticks. But what do these values mean? Are these the real CPU clock cycles necessary to execute the code?</p>
<p><strong>The _RDTSC function</strong>
<br />The answer to this question is no, the returned timing values did not represent the real number of assembler code clock-cycles as is advertised. The test-values simply returned the passed time between both <strong>_RDTSC</strong> calls. <strong>_RDTSC</strong> reads the <em>time-stamp counter</em> (TSC) of the CPU-cores. The value gives the number of elapsed ticks of the CPU’s internal clock. Maybe, in the past, in the era of one-core processors that only executed one app a time (MSDOS), the value might have represented the actual number of assembler clock-cycles. But not anymore. On a multi-core CPU the task is most likely split to run on multiple cores and the code is executed much faster than it would have done on one core. A consequence of splitting the code on multiple cores is that the <strong>_RDTSC</strong> (assembler) instructions could be executed on different cores as well, and might return different values. Only when the cores synchronize their time-stamp clocks (TSC) the <strong>_RDTSC</strong> values are reliable. You can test if the CPU supports the <strong>_RDTSC</strong> instruction by testing bit 4 of the value in <strong>_CPUIDD</strong>:</p>
<pre>Debug <font color="#000080">Btst(_CPUIDD, </font><font color="#404040">4</font><font color="#000080">) </font><font color="#008000">' must give -1 (True)
</font>Debug <font color="#800000">InvariantTSC</font><font color="#000080">() </font><font color="#008000">' must return True
</font></pre>
<p>To check if the TSC is invariant use:</p>
<pre>Function <font color="#800000">InvariantTSC</font><font color="#000080">() </font>As Bool Naked
_EAX <font color="#000080">= </font><font color="#404040">0
</font>. push <font color="#000080">ebx </font><font color="#008000">; always save ebx
</font>. mov <font color="#000080">eax, $80000007 </font><font color="#008000">; Advanced Power Management Information
</font>. CPuid <font color="#008000">; invoke cpuid
</font>GetRegs <font color="#008000">' store the register contents
</font>. pop <font color="#000080">ebx </font><font color="#008000">; restore ebx to access local vars
</font><font color="#800000">InvariantTSC </font>= <font color="#000080">Btst(_EDX, </font><font color="#404040">8</font><font color="#000080">)
</font>EndFunc
</pre>
<p>If all is well you can use the <strong>_RDTSC</strong> for performance timing, only, what are we measuring exactly? The timing values I measured were always different and sometimes ten times more than average… The reason for these irregular values is for instance multitasking, memory latency, and CPU power-saving. The test code will probably be interrupted by the OS to process other applications, writing and reading to memory costs time, and due to power-saving the CPU won’t execute the code at its highest clock frequency. These issues will remain regardless of the timing method you choose. I take closer at these issues at the end of this post. </p>
<p><strong>Flush the CPU before using _RDTSC</strong>
<br />There is one other thing related to the use of <strong>_RDTSC</strong>. The CPU does not guarantee that the machine code is executed in the order it is compiled. In other words, the <strong>_RDTSC</strong> command could be executed when the code to test has already started executing. To overcome this problem the CPU must be flushed before invoking the <em>rdtsc</em> assembler instruction. This is either done using the <em>cpuid</em> instruction or the <em>lfence</em> assembler instruction. We’ll use the <em>lfence</em> instruction, because the <em>cpuid</em> destroys the registers eax, ebx, ecx, and edx, where ebx is essential to GB32 and destroying it might give access violation errors. </p>
<p>For a proper working of TSC timing insert the <em>lfence</em> instruction before each <em>rdtsc</em> instruction: </p>
<pre>. db <font color="#000080">0x0F, 0xAE, 0xE8 </font><font color="#008000">// LFENCE opcode
</font><font color="#800000">t </font>= <font color="#000080">_RDTSC
</font></pre>
<p>The <em>lfence</em> instruction is not part of the GB32 built-in assembler, so we must insert the opcode bytes of <em>lfence</em> into the code stream manually. (You could use <em>cpuid</em>, but first save ebx (<em>push ebx</em>) and restore it afterwards (<em>pop ebx), </em>see the InvariantTSC() code above for an example.)</p>
<p><strong>Convert the TSC values to micro-seconds</strong>
<br />To be able to compare timing results among different PCs we need to convert the timing values to a standard unit, seconds or micro-seconds. To convert 4500 clock-cycles to micro-second, the number must be divided by the CPU’s clock frequency. On my PC the CPU’s internal clock has a base frequency of 1.51 GHz, as reported by the Windows Settings. However, I can obtain the frequency (in MHz) from the CPU as well:</p>
<pre>Function <font color="#800000">GetCPUMhz</font><font color="#000080">() </font>As Long Naked
_EAX <font color="#000080">= </font><font color="#404040">0 </font><font color="#008000">' clear global variable
</font>. push <font color="#000080">ebx </font><font color="#008000">' save, ebx is used for accessing local vars
</font>. mov <font color="#000080">eax, </font><font color="#404040">0 </font><font color="#008000">' get CPUID level
</font>. CPuid
. cmp <font color="#000080">eax, </font><font color="#404040">$16 </font><font color="#008000">' support level $16?
</font>. jnz <font color="#000080">.</font><font color="#8000ff">end </font><font color="#008000">' no, return 0
</font>. mov <font color="#000080">eax, </font><font color="#404040">$16 </font><font color="#008000">' get CPUID level $16
</font>. CPuid
GetRegs <font color="#008000">' copy registers (_EAX, ..)
</font>.<font color="#8000ff">end:
</font>. pop <font color="#000080">ebx </font><font color="#008000">' restore ebx to access local vars
</font><font color="#800000">GetCPUMhz </font>= <font color="#000080">_EAX </font><font color="#008000">' set the return value
</font>EndFunc
</pre>
<p>The <em>GetCPUMhz</em> function returned 1500 MHz (1.5 GHz). So, my ~4500 clock ticks take ~4500 / 1500000000 seconds, or, by multiplying the result with 10E6 to convert to micro-seconds, gives ~30 µs. The assembler version of my code took ~24 µs. (The values are an average after running the test code multiple times.)</p>
<p><strong>Should you use _RDTSC?
<br /></strong>Microsoft strongly discourages using the RDTSC processor instruction, because “you won’t get reliable results on some versions of Windows”, see <a href="https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps"><u><font color="#0066cc">Acquiring high-resolution time stamps - Win32 apps | Microsoft Docs</font></u></a>. Instead, Microsoft encourages you to use the  <em>QueryPerformanceCounter() </em>API. However, these warnings apply to using RDTSC in production code, not to a temporary test situation on one PC.</p>
<p><strong>Using QueryPerformanceCounter</strong>
<br />The alternative to RDTSC is the portable <a href="https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter"><em>QueryPerformanceCounter()</em></a> API together with the <em><a href="https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancefrequency">QueryPerformanceFrequency()</a></em> API. Well, that’s easy in GFA-BASIC 32, because these APIs are implemented by the the <strong>_TimerCount</strong> and <strong>_TimerFreq</strong> functions resp. Instead of using <strong>_RDTSC</strong> you could use <strong>_TimerCount</strong>, for instance:</p>
<pre>$StepOff
<font color="#800000">t </font>= <font color="#000080">_TimerCount
</font><font color="#008000">' execute code
</font><font color="#800000">t </font>= <font color="#000080">_TimerCount - </font><font color="#800000">t </font><font color="#000080">: </font>Debug <font color="#804000">"Ticks:"</font><font color="#000080">; </font><font color="#800000">t
</font></pre>
<p>For my test code the intervals with <strong>_TimerCount</strong> were ~30 and ~24 ticks, which are the same values as the reported <strong>_RDTSC</strong> intervals in micro-seconds. So, let’s see what these timer count values mean. The values tells us that the clock used by QPC was incremented by 30 and 24 ticks resp. As it turns out, QPC uses a different clock than RDTSC. The frequency of the QPC clock is returned by <strong>_TimerFreq</strong> and is - on my Surface 4 - 1000000 Hz (1 MHz) . So, the 30 timer count ticks correspond to 30 µs (Interval / <strong>_TimerFreq</strong> * 10E6), and the 24 ticks to 24 µs. So, as might be expected, both methods return (approximately) the same timings.</p>
<p>At start-up Windows decides how to implement QPC. It might use the CPU’s TSC for this purpose, but it might also use another clock provided by the PC’s hardware. Windows selects the most reliable method to obtain timing intervals. As you can see, on my PC Windows selects an alternative time source for QPC, the 1MHz clock.</p>
<p><strong>GB32 has the right function for you: Timer</strong>
<br />Now we know how to time intervals, we can use the GFA-BASIC 32 <strong>Timer</strong> function rather than divide the <strong>_TimerCount</strong> interval by <strong>_TimerFreq</strong>. The <strong>Timer</strong> function returns the current time in seconds as a Double:</p>
<p align="center"><strong>Timer</strong> <=> <strong>_TimerCount / _TimerFreq</strong>  </p>
<p>To convert to micro-seconds multiply the interval from two <strong>Timer</strong> calls with 10E6.</p>
<pre><font color="#800000">t# </font>= <font color="#000080">Timer
</font><font color="#008000">' execute code
</font><font color="#800000">t# </font>= <font color="#000080">Timer - </font><font color="#800000">t# </font><font color="#000080">: </font>Debug <font color="#804000">"Time in µs:"</font><font color="#000080">; Round (</font><font color="#800000">t# </font><font color="#000080">* </font><font color="#404040">10E6</font><font color="#000080">)
</font></pre>
<p>After changing my code to use <strong>Timer</strong> the results were again 30 µs and 24 µs.
<br />How fast are my test-results, or how fast is 1 µs? On my PC 1 µs takes 1500 TSC (CPU) ticks and 1 QPC tick. Code that operates below 1500 TSC ticks or 1 µs can not be measured with QPC (at least on my computer). You can calculate your <strong>Timer</strong>’s resolution as follows:</p>
<pre>Debug <font color="#804000">"Timer-resolution:"</font><font color="#000080">; </font><font color="#404040">1 </font><font color="#000080">/ _TimerFreq * </font><font color="#404040">10e6</font><font color="#000080">;</font><font color="#804000">" µs"
</font></pre>
<p><strong>Other timing issues</strong>
<br />Whether you use <strong>_RDTSC</strong> (with <em>lfence</em>) or <strong>Timer</strong> (QPC) the timing results simply return the elapsed time as measured by one of the internal hardware clocks. The interval is not the exact time necessary to accomplish the task. Because Windows is a multi-tasking OS the code is split over multiple cores and these cores might be interrupted by the Windows scheduler to execute other running processes. These issues can be addressed by limiting the test code to one core by using <a href="https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setthreadaffinitymask"><em>SetThreadAffinityMask()</em></a> API and reducing the chance that that core is interrupted by using <a href="https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreadpriority"><em>SetThreadPriority()</em></a> API. The structure of such a program could look like this:</p>
<pre>Dim <font color="#800000">Mask </font>As Long = <font color="#000080">SetThreadAffinityMask(GetCurrentThread(), </font><font color="#404040">1</font><font color="#000080">)
</font>~<font color="#000080">SetThreadPriority(GetCurrentThread(), </font><font color="#404040">2</font><font color="#000080">) </font><font color="#008000">' THREAD_PRIORITY_HIGHEST
</font>Try
$StepOff
Dim <font color="#800000">t# </font>= <font color="#000080">Timer
</font><font color="#008000">' execute code
</font><font color="#800000">t# </font>= <font color="#000080">Timer - </font><font color="#800000">t# </font><font color="#000080">: </font>Debug <font color="#804000">"Time in µs:"</font><font color="#000080">; Round (</font><font color="#800000">t# </font><font color="#000080">* </font><font color="#404040">10E6</font><font color="#000080">)
</font> $StepOn
Catch
MsgBox <font color="#000080">ErrStr(</font><font color="#804000">"Timing code"</font><font color="#000080">)
</font>EndCatch
~<font color="#000080">SetThreadAffinityMask(GetCurrentThread(), </font><font color="#800000">Mask</font><font color="#000080">)
</font>~<font color="#000080">SetThreadPriority(GetCurrentThread(), </font><font color="#404040">0</font><font color="#000080">) </font><font color="#008000">' THREAD_PRIORITY_NORMAL
</font></pre>
<p>This might give more reliable results if you have multiple cores. (Again, you won’t do this in production code. It will affect your application's performance by restricting processing to one core or by creating a bottleneck on a single core if multiple threads set their affinity to the same core when calling <em>QueryPerformanceCounter</em>.)</p>
<p> Making the test code run on one core still doesn’t return exact timing values. The executed code must be loaded into the CPU and reading the code from RAM memory might be slow(er) or fail (page hit faults) and the code might have to be re-read from memory again taking some extra time. In addition, the tested code might load and save values to memory that suffer from memory latency as well. Finally, on a laptop the actual CPU frequency might be lower than it’s base frequency, due to CPU power savings. Unfortunately, timing is not an exact science. </p>
<p><strong><em>See also</em></strong>: <a href="https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps"><u><font color="#0066cc">Acquiring high-resolution time stamps - Win32 apps | Microsoft Docs</font></u></a>.</p>
<p><strong><em>See also</em></strong>: <a href="https://en.wikipedia.org/wiki/CPUID">CPUID on Wikipedia</a></p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-33892327326470317702021-09-13T12:18:00.001+02:002021-09-13T12:18:01.576+02:00Update 2.6 produces false positive viruscheck<p>The September 2021 update version 2.6 causes problems with some virus scanners like F-Secure, Secure Point, and some others. The file that causes the problem is GfaWin23.Ocx version 2.39, the GFA-BASIC runtime. After investigating the problem I’m sure the scanners report a false positive. My PC and the files on it do not contain a virus. The GfaWin23.Ocx file can be used without any problems, the GFA-BASIC 32 installer will not install a virus.</p> <p align="left">GfaWin23.Ocx version 2.39 is a patched 2.38, which is not trapped by any virus scanner according to <a href="https://www.virustotal.com/gui/home/upload">VirusTotal</a>. To my surprise, patching (changing) only one byte in the binary already causes 5 out of 66 online virus scanners to complain. This is the first time patching causes problems. I patched the GfaWin32.exe as well, and this file does not raise any problems. <br />I have contacted the vendors of the virus scanners to notify them of the false positive and hope they will add it to their exception list. <u>Until then I will no longer release a patched GfaWin23.Ocx.</u></p> <p><strong>Use version 2.38 instead, reinstall</strong> <br />As a GFA-BASIC 32 developer you can ignore the virus scanner’s report, but when you release your software with the GfaWin23.Ocx runtime your customers face the same false positive virus reports. Therefor, I advise you to restore the previous version (2.38) of GfaWin23.Ocx, which does not give any problems. </p> <p align="center"><u><font size="2">The </font></u><a href="http://gfabasic32.blogspot.com/p/download.html"><u><font size="2">download page</font></u></a><u><font size="2"> now contains installer version 2.6a, which contains version 2.38 of the runtime. Please download 2.6a and reinstall GFA-BASIC 32 version 2.6.</font></u></p> <p><strong>Apply the runtime bug fixes yourself</strong>  <br />Version 2.39 did fix a number of bugs, you now must do without. However, you can apply those fixes yourself while running your program. There are 4 bugs that need to be fixed:</p> <ul> <li><strong>Alert</strong> box displays wrong background color.</li> <li>The mouse pointer over Ocx controls is not the control’s default mouse, but the Form’s mouse pointer. Especially, the <strong>TextBox</strong> Ocx shows a constantly flipping mouse pointer (arrow <–> I-beam).</li> <li>The <strong>FileName</strong> property after using <strong>CommDlg.ShowFolders</strong> returns a string with a terminating null character.</li> <li>The <strong>RichEdit</strong> Ocx property set <strong>CharFormat</strong> causes an exception when the string contains a 9.</li> </ul> <p>You can apply all fixes or only the ones your program requires. The following code must be inserted at the beginning of your code (it requires the <em>gfawinx.lg32</em> library):</p> <pre><font color="#008000">'
' Patches for GfaWin23.Ocx 2.38 - 13-Sep-2021 (SH)
' Bug fixes to apply on the fly in a program.
' Note - Patches are only applied once: on first RUN only.
'
</font>$Library <font color="#804000">"gfawinx"
</font>If <font color="#000080">Round(DllVersion * </font><font color="#404040">100</font><font color="#000080">) == </font><font color="#404040">238 </font><font color="#008000">' Only apply to 2.38
' Fix: Alert box background color
</font>If <font color="#000080">Peek(</font><font color="#404040">$1800193C</font><font color="#000080">) != </font><font color="#404040">6 </font>Then PokeProcess1 <font color="#404040">$1800193C</font><font color="#000080">, </font><font color="#404040">$06
</font><font color="#008000">' Fix: Get FileName after CommDlg.ShowFolder
</font>If <font color="#000080">Peek(</font><font color="#404040">$1801BCEF</font><font color="#000080">) != </font><font color="#404040">$4A </font>Then PokeProcess <font color="#404040">$1801BCEF</font><font color="#000080">, Chr(</font><font color="#404040">$4A</font><font color="#000080">, </font><font color="#404040">$89</font><font color="#000080">, </font><font color="#404040">$06</font><font color="#000080">, </font><font color="#404040">$89</font><font color="#000080">, </font><font color="#404040">$56</font><font color="#000080">, </font><font color="#404040">$10</font><font color="#000080">)
</font><font color="#008000">' Fix: MousePointer in Ocx Controls to default mouse
</font>If <font color="#000080">Peek(</font><font color="#404040">$18013B5D</font><font color="#000080">) != </font><font color="#404040">$5C </font>Then PokeProcess1 <font color="#404040">$18013B5D</font><font color="#000080">, </font><font color="#404040">$5C
</font><font color="#008000">' Fix: Rtf.CharFormat set fails if string contains a 9
</font>If <font color="#000080">Peek(</font><font color="#404040">$1805BA4D</font><font color="#000080">) != </font><font color="#404040">$7F </font>Then PokeProcess1 <font color="#404040">$1805BA4D</font><font color="#000080">, </font><font color="#404040">$7F
</font>EndIf
</pre>
<p>When GfaWin23.Ocx keeps being rejected by virus scanners, I will add these and possible new bug patches to a single routine in <em>gfawinx.lg32</em>.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-72927124491352853352021-09-06T11:28:00.001+02:002021-09-06T11:28:58.312+02:00Update 2.6–September 2021<p>Besides the obvious bug fixes, the update version 2.6 comes with some new features. In short, de editor can be switched to dark mode, the UI of the IDE has a new look, projects can be saved to a version history and libraries have been updated.</p> <p><strong>Bug Fixes </strong> <br />If possible, all known bugs have been fixed. This is true for the IDE, the CHM help, as well as for the runtime GfaWin23.ocx. The CHM Help is updated with the latest new commands and functions. Fixed is the bug where the CHM Help-viewer crashed when typing in the edit-field of the Index tab. <br />There were three known bugs in the runtime; the <strong>Alert</strong> box didn’t use the correct colors all the time, the <strong>FileName</strong> property after using <strong>ShowFolders</strong> didn’t provide the folder’s name correctly, and the mouse pointer didn’t display correctly over the <strong>TextBox</strong> Ocx. These issues have been fixed in the updated runtime version 2.39.</p> <p><strong>The libraries gfawinx.lg32 and direct2d.lg32 <br /></strong>The extension library <em>gfawinx </em>contains some new functions and commands: </p> <ul> <li><strong>SplitPath</strong> parses a given path specification like C’s <em>_splitpath().</em></li> <li><strong>DirExist</strong> checks for the existence of a path (UNC included) and does a much better job than <strong>GetAttr.</strong></li> <li><strong>CharW</strong> returns a wide character string from a given address.</li> <li>The string functions <strong>FindFirstOf</strong> and <strong>FindLastOf</strong> return the first or last position of any of the characters from a given set. </li> <li>The <strong>LoadRichEdit50W</strong> function modifies the runtime to use <em>msftedit.dll</em> with the rich edit window class RichEdit50W (rather than the current RichEdit20A class from <em>RichEd20.dll)</em>. See the updated CHM helpfile for more information. </li> <li>The high-resolution timer object <strong>TimerQ</strong> has been re-developed, because Windows 10 suddenly stopped supporting the older implementation.</li> </ul> <p>The <em>direct2d</em> library version 1.13 updates only a few functions; </p> <ul> <li><strong>D2GetRT</strong> can create a rendertarget for a memory DC. Syntax: <br /><font size="2" face="Courier New">Set memdcRT = D2GetRT(hdc, width, height)</font></li> <li><strong>D2Bitmap</strong> can load an image without ignoring the alpha channel. </li> </ul> <p>More advanced Direct 2D features are under development.</p> <p><strong>UI changes to the IDE</strong> <br />The IDE has a smoother user-interface and new (a bit larger) images for toolbar, auto-complete, and list-boxes. In addition, the editor can be switched to a dark mode for those that appreciate light-on-dark editing. </p> <a href="https://drive.google.com/uc?id=1_xEItBa7twPV-LFcyS1N1kuWm3HQ6cPg"><img title="Screenshot 2021-09-05 Dark Mode" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="Screenshot 2021-09-05 Dark Mode" src="https://drive.google.com/uc?id=1TNWfFAuFhP3zOj3pde9rXdOZjd0Qi9IB" width="588" height="601" /></a> <p>The default dark mode syntax colors are chosen from a palette of colors that display well on a dark background, for more color suggestions see <a href="http://colormind.io/template/paper-dashboard/"><u><font color="#0066cc">Colormind - Generate dashboard template colors</font></u></a>. The dark background isn’t pure black, but it’s RGB color value is $121212. More information on the editor’s colors can be found in <a href="http://gfabasic32.blogspot.com/2021/09/the-ides-color-dialog.html">The IDE's Color Dialog</a> blog.</p> <p><strong>Save to History</strong> <br />The toolbar displays an additional button (see picture above) for the <strong>Save to </strong>(Version)<strong> History</strong> feature. The command adds the current program to a history zipfile with a descriptive name that allow you to summarize the changes and new features of that program. By regularly storing the program in the version history file, you can easily return to a previous version of the program. By default, the history file is named <em>progname + “History.zip”</em> and it is stored in the program’s directory. However, the Extra tab in the Properties dialog box allows you to provide a dedicated directory (another (network) drive perhaps) to save the history files in one place. After selecting the command you are presented with this dialog box (Prompt):</p> <a href="https://drive.google.com/uc?id=1j-m4YlREWer_9AxtZT97y2gb3e2rk6qa"><img title="Screenshot 2021-09-06 History Save" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="Screenshot 2021-09-06 History Save" src="https://drive.google.com/uc?id=1WWD42RlIqhn2QvxEy_mIZ6-Nw3EI38hu" width="480" height="120" /></a> <p>The dialog shows the filename and timestamp of the current file. The timestamp is the first element added to the descriptive name when the file is added to the zipfile. This makes sorting the zipfile easier. The second filename specifies the path and filename of the history file to which it is added. The edit line is used to provide a description of changes and new features of the file to store. The description starts with your Windows username, which could be necessary when multiple developers work on the same code. Because this information makes up the name of the file in the zipfile it can not include specific characters as \:/*?<>|”. To separate items use the ; or – characters. After saving you can open the zip file with the File Explorer. </p> <p><strong>$Compiler command</strong> <br />This new command adds the current compiler settings to the program, so you can use different compiler settings for your projects. Just type <strong>$Compiler</strong> on an empty line and the IDE inserts the compiler settings as a long integer value (in hex format) into the code line. </p> <pre>$Compiler 0x0008A734 <font color="#008000">' Br:4 BrExe:1 Mul:3 Fp:3 ChkArr:1 Bswp:0 Num2Str:1 FpWait:0 FpCons:0 Trace:2
</font></pre>
<p>The line includes a comment specifying the compiler settings that are represented by the <strong>$Compiler</strong> value. The meaning of the abbreviations can be found in the helpfile.</p>
<p>Download: <a href="http://gfabasic32.blogspot.com/p/download.html">GFA-BASIC 32 for Windows: Download (gfabasic32.blogspot.com)</a></p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-43857319248932089032021-09-02T12:01:00.001+02:002021-09-02T12:01:30.313+02:00The IDE’s Color Dialog<p>The IDE features a custom Color Dialog box to select the foreground and background colors for Ocx controls and Forms. The Color Dialog box is also used to select the editor’s syntax colors in the GB32’s Properties dialog box. Using the Color Dialog box you can select any color you want. However, the Color Dialog box presents a custom color palette for a quick selection. In addition the dialog box displays the system colors as they are defined on your version of Windows.</p> <p><strong>The Color Dialog box <br /></strong>The following picture displays the Color Dialog box after selecting the <strong>ForeColor</strong> property of a Form (frm1) in the form-editor. This dialog box will also be displayed after selecting the <strong>BackColor</strong> property.</p> <a href="https://drive.google.com/uc?id=1WpR1TGTFDiTn_cz-wsCN2YxMMqNX5gg2"><img title="Screenshot 2021-09-01 ColorDlg" style="display: inline; background-image: none;" border="0" alt="Screenshot 2021-09-01 ColorDlg" src="https://drive.google.com/uc?id=1CrGHWgrDhPn4-5NRLZJqkjaXZQOEwyCz" width="512" height="286" /></a> <p>The <strong>ForeColor</strong> property shows a color value of $80000008, which means that the color is set to the system color with index 8 (COLOR_WINDOWTEXT). The <strong>ForeColor</strong> property is used as the foreground color for drawing in the client area of the form. </p> <p>The Color Dialog displays the 25 system colors in the lower two rows of the dialog box and it draws a focus rectangle around the color-cell that shows the system color for COLOR_WINDOWTEXT. The large cell at bottom-right of the dialog box displays the selected color. By clicking on the large box GB32 shows the common dialog’s color dialog box. The top 4 rows display a palette of often used RGB colors to allow a quick selection of a color. The fourth row also contains 8 additional colors otherwise not found in the 4 upper rows of the dialog’s color palette.</p> <p>The <strong>BackColor</strong> property defines the color used to draw the (empty) contents of the client area. By default, GFA-BASIC 32 uses the system color COLOR_BTNFACE, the system color that is used to paint the shading of the face of command buttons. However, this system color is used for more UI-elements than just the shadow of the face of a button. By using the color-value $8000000f the window background gets the default color of a dialog box, so that the GB32 form will look consistently with system dialog boxes.</p> <p><strong>Using system colors</strong> <br />It is a big advantage that GFA-BASIC 32 let you use system colors for the user-interface elements of the form and Ocx-controls. The system colors may change when a custom Windows theme is installed or when Microsoft changes the system colors with a new release of Windows. Whenever the system colors change, the colors of the form change accordingly, providing a consistent look with the OS.</p> <p>GFA-BASIC 32 distinguishes between a pure RGB color format and a system color by setting the high-bit of the 32-bit color value (<strong>Long</strong>). When a <strong>Long</strong> value is displayed in it’s hexadecimal format the high-bit setting is shown as $80000000. Before actually applying a color GB32 tests the high-bit of the color value and selects a system color when it is set: </p> <pre>If <font color="#800000">rgbcol </font><font color="#000080">%& </font><font color="#404040">$80000000 </font>Then <font color="#800000">rgbcol </font>= <font color="#000080">SysCol(</font><font color="#800000">rgbcol </font><font color="#000080">& </font><font color="#404040">$FF</font><font color="#000080">)
</font></pre>
<p>An application can specify a system color in two ways:</p>
<pre>RGBColor <font color="#404040">$80000000 </font><font color="#000080">+ COLOR_WINDOWFRAME
</font>RGBColor <font color="#000080">SysCol(COLOR_WINDOWTEXT)
</font></pre>
<p>The first statement sets the foreground color to a system color value. The second statement converts the system color to an RGB-value beforehand. Both statements will eventually use the RGB color that belongs to the system’s color element COLOR_WINDOWTEXT. The RGB color value for any of the display elements is obtained using the GB32’s function <strong>SysCol</strong> or the API function <em>GetSysColor()</em>. Each aspect of the display has its own COLOR_* constant that is used as an index in these functions. These constants are built into GFA-BASIC 32. For more information see the <strong>SysCol</strong> function in the helpfile. It explains which constant represents what user-interface element. When you hoover over the system colors in the IDE Color Dialog box it shows a short description of the display element it represents.</p>
<p><strong>The Editor colors</strong>
<br />The Editor tab in the Properties dialog box (Extra | Properties) displays the same Color Dialog box to select the syntax colors.</p>
<a href="https://drive.google.com/uc?id=1nIsM38JsNbc0TPg_gEL_V-zxtKZhILra"><img title="Screenshot 2021-09-02 ColorDlg" style="display: inline; background-image: none;" border="0" alt="Screenshot 2021-09-02 ColorDlg" src="https://drive.google.com/uc?id=1JehInPHRfON3OTkbWm6M2b6jZZYmtITk" width="407" height="286" /></a>
<p>This picture is taken after clicking the BackColor button. It shows the selected color for the background of the “Changed/Empty” syntax (ie. the background color of empty lines and the line that is being edited). By default, the background color for all syntax elements is set to system color COLOR_WINDOW ($80000005). The foreground colors of the syntax elements are custom RGB values. By keeping the background color to a system color, the GFA-BASIC 32’s editor will adapt to the new COLOR_WINDOW color if a theme is installed.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-9498899544438734382021-08-16T11:21:00.001+02:002021-08-16T11:21:36.165+02:00Fill up the Form (Part 3)<p>This is part 3 of my blogs on GFA-BASIC 32 Forms. The other parts focused on creating and interacting with a Form:</p> <ul> <li><a href="http://gfabasic32.blogspot.com/2021/06/forms-base-of-app-part-1.html">Forms, the base of an app (Part 1)</a></li> <li><a href="http://gfabasic32.blogspot.com/2021/07/interacting-with-forms-part-2.html">Interacting with forms (Part 2)</a></li> </ul> <p>In this blog I focus on drawing in the form’s client area.</p> <p><strong>Putting something on the Form</strong> <br />Basically, a form is used for two purposes. It is either used as a dialog box by populating it with OCX-controls, or it is used to draw graphics. Usually, these basic approaches aren’t combined, although you could draw some graphics in the dialog box form as a background for the controls. For instance, you could assign a <strong>Picture</strong> to draw in the form’s background or change the background color for the form. However, mostly these things are separated; a form is either used as an input form or as a graphics window. <br />When a GB32 form contains OCX controls it’s behavior changes and the form starts handling control-navigation keys (Tab and arrow-keys). This means that both the system and GB32 take control of the focus. The focus can only be set to a control, not to the client area of the form. The form’s method <strong>SetFocus</strong> does not work anymore. A form without OCX controls does not change to this behavior and allows you to set the focus to the form, making it possible to develop a text editor for instance. (BTW it is a good habit to add an OCX-Form child window to the client-area of the base-form. The base-form is the container of the OCX-controls and the OCX-Form control is used for drawing or editing.) </p> <p><strong>Drawing on a Form</strong> <br />An application should paint in the client area when Windows posts (or sometimes sends) a WM_PAINT message. GB32 converts the WM_PAINT message to an event which can be processed in the <strong>_Paint</strong> event sub. There are applications (like drawing programs) that need to draw interactively in the client area, for instance after a mouse-event. Even so, an application would store the new drawing coordinates and color and then updates its client area to redraw in the <strong>_Paint</strong> event sub again. This is achieved by invalidating the portion of the form that needs to be redrawn followed by a form-refresh.</p> <pre><font color="#800000">frm.</font><font color="#000080">Invalidate </font><font color="#800000">x</font><font color="#000080">, </font><font color="#800000">y</font><font color="#000080">, </font><font color="#800000">w</font><font color="#000080">, </font><font color="#800000">h
frm.</font><font color="#000080">Refresh
</font></pre>
<p>The <strong>Refresh</strong> method calls the <em>UpdateWindow()</em> API and <u>sends</u> a WM_PAINT message to the form directly, bypassing the message queue. By following this procedure, the form is repainted instantly and the app conforms to the rules of painting in the client-area.</p>
<p><strong>Should you use AutoRedraw?</strong>
<br />To make things easy VB naively introduced the <strong>AutoRedraw</strong> feature. Because of VB-compatibility <strong>AutoRedraw</strong> was also built into GB32. The <strong>AutoRedraw</strong> feature allows an application to draw outside the <strong>_Paint</strong> event sub. All subsequent drawings are copied to an offscreen bitmap which is then drawn to the client-area after the form receives a WM_PAINT message. There are some drawbacks to this approach. The application does no longer follow the UI-rules for drawing and it will be difficult to maintain and expand the application. A second drawback is the drop in performance. Each GB32 graphics command is executed twice, once to draw on the screen and once to draw in the offscreen bitmap. In addition, the drawing is limited to the use of GFA-BASIC 32 commands, only GB32 commands draw in the offscreen bitmap. When you use a Windows API drawing function to draw you must draw both on the screen and on the bitmap. For this, the form provides the <strong>hDC2</strong> property, this property returns the handle of the GDI device context for the offscreen bitmap. It is only valid after executing the <strong>AutoRedraw</strong> command. The use of an API function could look like this:</p>
<pre>~<font color="#000080">TextOut(</font><font color="#800000">frm.</font><font color="#000080">hDC, </font><font color="#404040">0</font><font color="#000080">, </font><font color="#404040">0</font><font color="#000080">, </font><font color="#804000">"Hello, Windows!"</font><font color="#000080">, </font><font color="#404040">15</font><font color="#000080">)
</font>If <font color="#800000">frm.</font><font color="#000080">hDC2
</font>~<font color="#000080">TextOut(</font><font color="#800000">frm.</font><font color="#000080">hDC2, </font><font color="#404040">0</font><font color="#000080">, </font><font color="#404040">0</font><font color="#000080">, </font><font color="#804000">"Hello, Windows!"</font><font color="#000080">, </font><font color="#404040">15</font><font color="#000080">)
</font>EndIf
</pre>
<p>If the form uses scaling, the scaling must be applied by hand. Each coordinate and size value must be converted to the current scaling of the form.
<br />Another thing to note is the size of the offscreen bitmap. The bitmap is created when the <strong>AutoRedraw</strong> command is executed taking the current size of the client area. When a form is later enlarged (resized) the automatic redrawing of the offscreen bitmap will not entirely fill up the client area of the form. This is demonstrated in the following picture where the picture on the right is a resized version of the left form.</p>
<a href="https://drive.google.com/uc?id=1l6pHGhZCYXsQsR7xkp1jua6cK0u9VkEq"><img title="AutoRedraw" style="display: inline; background-image: none;" border="0" alt="AutoRedraw" src="https://drive.google.com/uc?id=1wEFeLsM_mWNQpDgCRX9xt8d_U_udplU6" width="460" height="221" /></a>
<p><strong>AutoRedraw</strong> is an option to use for a quick and dirty test program, not for a serious application.</p>
<p><strong>Use Direct2D instead</strong>
<br />The GB32 drawing commands are wrappers for the Windows GDI drawing functions. However, GDI isn’t fast and isn’t suited for dpi-aware applications. More and more GDI-drawing is replaced by Direct2D drawing. Your application can use Direct2D as well. The <em>Include</em> directory contains a GB32 library <em>Direct2D.lg32</em> that provides access to the system’s COM-based direct2d libraries. The commands and functions provide a GB32 compatible approach to drawing, so an application can be ported to Direct2D easily. The library commands and functions start with the letters <strong>D2</strong> followed by the GB32 name of the drawing command. To set the colors you would use <strong>D2RgbColor</strong> instead of GB32’s <strong>RgbColor</strong> command. Instead of <strong>Line</strong> you would use <strong>D2Line</strong>, etc. The usage of the library is explained in the latest (English) CHM helpfile (don’t use the very old German hlp file anymore, it is outdated and does not contain OCX-properties and all the new stuff.)  You’ll find the Direct2D information by going to the Contents-tab and opening the <em>Creating an application</em> chapter. </p>
<p><strong>Conclusion</strong>
<br />An application either uses the form for input using OCX-controls or draws in the client-area in a response to a <strong>_Paint</strong> event. It is recommended to not use <strong>AutoRedraw</strong>. Even better, use Direct2D for drawing.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-56186502481319431752021-07-04T09:41:00.001+02:002021-07-04T09:41:41.836+02:00Interacting with Forms (Part 2)<p>This is the second post in a series about forms. <a href="http://gfabasic32.blogspot.com/2021/06/forms-base-of-app-part-1.html">In the first post</a> we discussed the commands to create forms and their window styles. Now we’ll discuss how to interact with forms.</p> <p><strong>Owner and owned forms</strong> <br />The commands <strong>OpenW</strong> and <strong>Form</strong> support the creation of owned forms (windows). They provide the <strong>Owner</strong> clause to specify the ‘parent’ or owner of the new form. The following example creates an overlapped <em>non-owned</em> window (<strong>Win_0</strong>) and an overlapped <em>owned</em> window <em>frm</em>.</p> <pre>OpenW <font color="#404040">0</font><font color="#000080">, 10</font><font color="#404040">0</font><font color="#000080">, 10</font><font color="#404040">0</font><font color="#000080">, </font><font color="#404040">300</font><font color="#000080">, </font><font color="#404040">300 </font><font color="#000080">: </font>TitleW <font color="#404040">0</font><font color="#000080">, </font><font color="#804000">"Owner"
</font>Form Owner <font color="#000080">Win_0, </font><font color="#800000">frm </font>= <font color="#804000">"Owned"</font><font color="#000080">, </font><font color="#404040">150</font><font color="#000080">, </font><font color="#404040">170</font><font color="#000080">, </font><font color="#404040">300</font><font color="#000080">, </font><font color="#404040">200
</font>Do : Sleep : Until <font color="#000080">Me Is Nothing
</font></pre>
<p>There are advantages and disadvantages of using a parent-owner relationship. </p>
<ul>
<li>The owned form (<em>frm)</em> is always displayed on top of the non-owned window (<strong>Win_0</strong>). It is therefor mostly used for forms that behave as dialog boxes. </li>
<li>When one of the windows is activated the other is activated automatically. </li>
<li>When the parent window is closed the owned window is closed as well. Not the other way around. When you close form <em>frm</em> the <strong>Win_0</strong> form is not closed and <strong>Me</strong> does not become <strong>Nothing</strong>. The message loop is not ended. When you close <strong>Win_0</strong> the form <em>frm</em> is closed as well and <strong>Me</strong> will become <strong>Nothing</strong>.</li>
<li>The owned window is not disabled (for input) if the parent is disabled. When a program displays a modal dialog box (a form with Ocx controls that disables all other windows while on screen) all other forms have to be disabled explicitly. </li>
</ul>
<p>Suppose a program wants to display an About box in a modal dialog box. In GB32 a modal dialog box (form) is simulated by showing an owned form and then disabling input for the other forms using the <strong>Disable</strong> property. Then, after closing the modal dialog box form the other forms are enabled again using the <strong>Enable</strong> property. Like this:</p>
<pre>OpenW <font color="#404040">0</font><font color="#000080">, </font><font color="#404040">100</font><font color="#000080">, </font><font color="#404040">100</font><font color="#000080">, </font><font color="#404040">300</font><font color="#000080">, </font><font color="#404040">300 </font><font color="#000080">: </font>TitleW <font color="#404040">0</font><font color="#000080">, </font><font color="#804000">"Owner"
</font>Ocx Command <font color="#800000">cmd </font>= <font color="#804000">"About"</font><font color="#000080">, </font><font color="#404040">10</font><font color="#000080">, </font><font color="#404040">10</font><font color="#000080">, </font><font color="#404040">100</font><font color="#000080">, </font><font color="#404040">24
</font>Form Owner <font color="#000080">Win_0, </font><font color="#800000">frm </font>= <font color="#804000">"Owned"</font><font color="#000080">, </font><font color="#404040">150</font><font color="#000080">, </font><font color="#404040">170</font><font color="#000080">, </font><font color="#404040">300</font><font color="#000080">, </font><font color="#404040">200
</font>Do
Sleep
Until <font color="#000080">Me Is Nothing
</font>Sub <font color="#800000">cmd_Click
</font><font color="#008000">' Display frm1 (owned by Win_0) created using the Form-Editor
</font>LoadForm <font color="#800000">frm1</font><font color="#000080">, Win_0.Left + PixelsToTwipX(</font><font color="#404040">50</font><font color="#000080">), Win_0.Top + PixelsToTwipY(</font><font color="#404040">50</font><font color="#000080">)
</font>Win_0<font color="#800000">.</font><font color="#000080">Disable </font><font color="#008000">' no input allowed
</font><font color="#800000">frm.Disable </font><font color="#008000">' no input allowed
</font>Sub <font color="#800000">frm1_Destroy </font><font color="#008000">' frm1 is being destroyed
</font><font color="#800000">frm.Enable </font><font color="#008000">' enable input
</font>Win_0<font color="#800000">.</font><font color="#000080">Enable </font><font color="#008000">' enable input
</font>Win_0<font color="#800000">.</font><font color="#000080">Activate </font><font color="#008000">' activate
</font></pre>
<p>In the form-editor the <strong>Owned</strong> property is set to True. The form only has one Ocx control; a label with an enlarged font. The <strong>LoadForm</strong> command uses the current active form as the owner for the About box. The result is this, only the About box is active and enabled: </p>
<p><a href="https://drive.google.com/uc?id=1UfoiIsaVXNEUMKJs6F2egNPz_5iZdwIC"><img title="Screenshot 2021-06-28 121116" style="display: inline; background-image: none;" border="0" alt="Screenshot 2021-06-28 121116" src="https://drive.google.com/uc?id=15ujWexxND7fE82_2MdJQ3F40S0bKYi0D" width="398" height="329" /></a></p>
<p><strong>The message loop</strong>
<br />To interact with forms the application needs a message loop. The most common message loop uses <strong>Sleep</strong> and ends with <strong>Until</strong> <strong>Me</strong> <strong>Is</strong> <strong>Nothing</strong> (Do : Sleep : Until Me is Nothing). When all windows are closed <strong>Me</strong> – the current active form - becomes <strong>Nothing</strong> and the program will end.
<br /><strong>Sleep</strong> waits for a queued message; a message that is posted to the window’s message queue. The OS posts only a limited amount of messages, most messages are sent to the window-procedure directly. In general, the posted messages include the input messages for keyboard and mouse, the WM_PAINT and WM_TIMER message.</p>
<p>After <strong>Sleep</strong> detects a new message it dispatches (relays) the message to the window’s window-procedure. So, in the end all messages (posted or sent) end up in the window procedure of the window. The window procedure is responsible for executing the event subs.</p>
<p><strong>Sleep</strong> is not the only command that reads the message queue, others are the (also new) <strong>DoEvents</strong>, and the older 16-bit GFA-BASIC compatible commands <strong>GetEvent</strong>, and <strong>PeekEvent</strong>. <strong>Sleep</strong> is the preferred command to <u>wait </u>for and handle a message. When the <strong>Sleep</strong> command executes it first processes all pending (waiting) messages and then puts the program to sleep using <em>WaitMessage()</em>. When a new message arrives <strong>Sleep</strong> processes all new message(s) before it returns back to the program. Schematically, from left to right <strong>Sleep</strong> executes:</p>
<table cellspacing="0" cellpadding="4" width="100%" border="1"><tbody>
<tr>
<td valign="top"><em>If any: Handle All Messages + Sleep(0)</em></td>
<em></em>
<td valign="top"><em>WaitMessage</em></td>
<em></em>
<td valign="top"><em>Handle All
<br />Messages + Sleep(0) </em></td>
<td valign="top">=> return to program (loop)</td>
</tr>
</tbody></table>
<p align="left">As part of <em>Handle All Events </em>the <strong>Sleep</strong> command invokes the Windows API <em>Sleep(0)</em>, giving up the remainder of the time slice that the scheduler assigned to the thread (process).
<br />
<br />The other command that <u>waits</u> for a message is <strong>GetEvent</strong>, but this works a bit different. Upon entering the <strong>GetEvent</strong> handles one event if there is a message present in the queue. Without any pending messages <strong>GetEvent</strong> invokes <em>WaitMessage()</em> and halts the program. After obtaining a message it continues by processing exactly one event. If more messages are present <strong>GetEvent</strong> will process them the next time it is executed. Schematically, there are two situations:</p>
<table cellspacing="0" cellpadding="4" width="100%" border="1"><tbody>
<tr>
<td valign="top"><em>Message In queue?</em></td>
<em></em>
<td valign="top"><em>Handle One Message</em></td>
<td valign="top">=> return to program (loop)</td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top"><em>No pending messages?</em></td>
<em></em>
<td valign="top"><em>WaitMessage</em></td>
<em></em>
<td valign="top"><em>Handle One Message</em></td>
<td valign="top">=> ret to prog</td>
</tr>
</tbody></table>
<p align="left">Because <strong>GetEvent</strong> handles only one message a time it is able to place GFA-BASIC 16 compatible message-info in the <strong>MENU()</strong> -array. An application can respond to the values of the <strong>MENU()</strong> array inside the <strong>GetEvent</strong>-message loop. The <strong>GetEvent</strong> command does not invoke <em>Sleep(0)</em>. With multiple messages pending the <strong>GetEvent</strong> loop will run until all messages are handled without giving up time, which is not a real problem. After all, the <strong>Sleep</strong> command does not call <em>Sleep(0)</em> before it handled all pending messages.</p>
<p><strong>PeekEvent</strong> is like <strong>GetEvent</strong>: it fills the <strong>MENU()</strong> array, but it <u>doesn’t wait</u> for a message, it returns immediately to the program. </p>
<table cellspacing="0" cellpadding="4" width="100%" border="1"><tbody>
<tr>
<td valign="top"><em>Handle One Message (if any)</em></td>
<td valign="top">=> return to program (loop)</td>
</tr>
</tbody></table>
<p>Because <strong>PeekEvent</strong> is usually placed in a (message) loop, it is likely that the CPU will be overloaded and will be running at 100%. You will need some mechanism to give up some processor time, for instance by using the <em>Sleep(ms)</em> API or the GB32 command <strong>Sleep ms </strong>inside the message loop. </p>
<p><strong>DoEvents</strong> is a bit like <strong>PeekEvent</strong>: it <u>doesn’t wait</u> for a message. However, rather than processing only one message at a time, <strong>DoEvents</strong> handles all pending messages in a row before it returns to the program. </p>
<table cellspacing="0" cellpadding="4" width="100%" border="1"><tbody>
<tr>
<td valign="top"><em>Handle All Messages + Sleep(0)</em></td>
<td valign="top">=> return to program</td>
</tr>
</tbody></table>
<p>This does not mean that <strong>DoEvents</strong> - when used in a loop - will let the processor run at 100%. Before returning to the program <strong>DoEvents</strong> invokes <em>Sleep(0)</em> to give up CPU time to other processes. <strong>DoEvents</strong> is often used in a time-consuming loop to keep the GUI responsive.</p>
<p>All these commands <strong>Sleep, GetEvent, PeekEvent</strong>, and <strong>DoEvents</strong> handle the keyboard navigation between Ocx controls on the form. However before the keyboard navigation is applied GB32 invokes the <strong>Screen_Preview</strong> event sub if it is present. This event sub allows the program to intercept queued keyboard messages (WM_KEYFIRST – WM_KEYLAST) to respond to a key and/or cancel the message if it wants to.</p>
<pre>Sub <font color="#800000">Screen_KeyPreview</font><font color="#000080">(</font><font color="#800000">hWnd%</font><font color="#000080">, </font><font color="#800000">uMsg%</font><font color="#000080">, </font><font color="#800000">wParam%</font><font color="#000080">, </font><font color="#800000">lParam%</font><font color="#000080">, </font><font color="#800000">Cancel?</font><font color="#000080">)
</font></pre>
<p>Set the <em>Cancel?</em> parameter to True when a keyboard message is handled and you don’t want to pass it on to the Ocx-control keyboard-navigator or to the window-procedure.</p>
<p><strong>Event Subs</strong>
<br />All message retrieval commands, including <strong>GetEvent</strong> and <strong>PeekEvent</strong>, execute event subs. (To be precise, the window procedure invokes the event subs.) Using event subs is the preferred way to respond to a message taking away the need to distinguish between posted and sent messages as in previous versions of GFA-BASIC. To handle a form-message simply add an event sub to the program. Note that when a form is being created it executes event subs while the form’s object variable isn’t initialized yet. In particular, the <strong>_Paint</strong> and <strong>_Resize</strong> events are invoked without having access to the form’s variable. This behavior is discussed in the previous blog post: <a href="http://gfabasic32.blogspot.com/2021/06/forms-base-of-app-part-1.html">Forms, the base of an app</a>.</p>
<p><strong>The _MessageProc sub event
<br /></strong>A powerful event sub is the <strong>_MessageProc</strong> sub event. If defined, it is called for each and every message that is relayed to the window-procedure, including the posted messages.</p>
<pre><font color="#008000">' Called for all messages
</font>Sub <font color="#800000">Win_0_MessageProc</font><font color="#000080">(</font><font color="#800000">hWnd%</font><font color="#000080">,</font><font color="#800000">Mess%</font><font color="#000080">,</font><font color="#800000">wParam%</font><font color="#000080">,</font><font color="#800000">lParam%</font><font color="#000080">,</font><font color="#800000">retval%</font><font color="#000080">,</font><font color="#800000">ValidRet?</font><font color="#000080">)
</font></pre>
<p>You need to know what to do if you handle a message in the <strong>_MessageProc</strong> event sub. This knowledge is acquired through the Windows SDK (<a href="https://docs.microsoft.com/en-us/windows/win32/api/">now available on line</a>). For the sent messages the program needs to specify a return value in the by reference variable <em>retval%</em> and set the <em>ValidRet? </em>variable to True. This is necessary; if the program sets <em>ValidRet?</em> the message is considered handled and any event subs that would otherwise be invoked will not be executed. When <em>ValidRet?</em> is set the form’s window procedure will return to the caller (Windows OS) immediately. To handle a posted message – one that doesn’t require a return value - you needn’t set <em>retval%</em>, but to prevent further handling you should set <em>ValidRet?</em> though.</p>
<p><strong>The _Message event sub is for posted messages</strong>
<br />The <strong>_Message</strong> event sub is intended to process queued (posted) messages only. However, the <strong>_Message</strong> event sub is called for <em>all messages</em> (like the <strong>_MessageProc</strong> event sub) except for WM_PAINT and WM_ERASEBKGND (!?). Because of its syntax – it misses <em>retval%</em> and <em>ValidRet?</em> - it can only be used to process posted messages, the messages that don’t require a return value: </p>
<pre><font color="#008000">' Process posted messages only
</font>Sub <font color="#800000">Win_0_Message</font><font color="#000080">(</font><font color="#800000">hWnd%</font><font color="#000080">, </font><font color="#800000">Mess%</font><font color="#000080">, </font><font color="#800000">wParam%</font><font color="#000080">, </font><font color="#800000">lParam%</font><font color="#000080">)
</font></pre>
<p>Even when a program handles a message in the <strong>_Message</strong> event sub the event sub for that message is invoked as well. For instance, if WM_LBUTTONDOWN is handled in the <strong>_Message</strong> event sub and the <strong>_Click</strong> event sub is defined as well, the <strong>_Click</strong> event is also executed. If both <strong>_Message</strong> and <strong>_MessageProc</strong> subs are used both subs are invoked, first the <strong>_Message</strong> event sub followed by the <strong>_MessageProc</strong>. If a program responds to a (posted) message in the <strong>_Message</strong> event sub, it shouldn’t process it in <strong>_MessageProc</strong> again, or in some other event sub.
<br />The practical use of the <strong>_Message</strong> event sub is limited, it is intended to port GB16 code that uses the MENU()-array or <strong>_hWnd, _Mess, _wParam, _lParam</strong> to GFA-BASIC 32. Because the <strong>_Message</strong> event sub is called from the window-procedure a program can handle all posted messages when the message loop uses <strong>Sleep</strong> or <strong>DoEvents</strong>. </p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-47992534768062944892021-06-30T10:11:00.002+02:002021-07-01T10:09:15.757+02:00Forms, the base of an app (Part 1)<p>A Windows program usually has one or more windows to interact with the user. In GB32 the windows are called forms. A <strong>Form</strong> is actually a normal window created with the Windows API function <em><a href="https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowexa">CreateWindowEx()</a></em>. However, a GB32 form adds additional features to the window. For instance, a form supports keyboard tabbing from one Ocx control to the other, it’s settings are accessible through properties and methods, and a form is able to execute event subs. A <strong>Form</strong> is a normal window with a COM-wrapper. A <strong>Form</strong> is accessible through a COM object variable; you either provide your own name to a form like <em>frmMain</em>, or you use a predefined form variable like <strong>Win_x</strong> or <strong>Dlg_x</strong>. The name of the form-variable depends on the command used to create the form.</p> <p><strong>Creating a Form</strong><strong> with OpenW <br /></strong>There are several ways to create a form. You might want to use one of the ‘good old’ GFA-BASIC commands <strong>OpenW</strong>, <strong>ParentW</strong>, and <strong>ChildW</strong>. Or you could use the new <strong>Form</strong> statement to create a <strong>Form</strong> in code. To load a form created in the Form Editor use the <strong>LoadForm</strong> statement. In addition, you could use the <strong>Dialog</strong> command to convert dialogs from older GB versions to GB32 forms. </p> <table border="0" cellpadding="8" cellspacing="0"><tbody> <tr> <td valign="top">Note</td> <td valign="top">The <strong>ParentW</strong> and <strong>ChildW</strong> commands allow you to create a multiple-document-interface (MDI) program, but this type of program isn’t very popular anymore. These days, multiple documents programs are single windows that display a <strong>TabStrip</strong> Ocx control with multiple tabs that have an <strong>Ocx</strong> <strong>Form</strong> child window attached to each tab. I won’t discuss these window types in this post.</td> </tr> </tbody></table> <p>As in previous versions of GFA-BASIC the <strong>OpenW</strong> takes a window number from 0 to 31 to identify the window. <em>After</em> creating the window GB32 wraps the window in a <strong>Form</strong> object and assigns it to one of the predefined form-variables <strong>Win_0</strong> to <strong>Win_31</strong>. This does not mean that you are limited to 32 windows. The <strong>OpenW </strong>command accept numbers larger than 31 but these forms are accessed using the form-array syntax <strong>Form(n)</strong>, where <em>n</em> is the number used in the window creation command. For example:</p> <pre>OpenW Center <font color="#404040">50</font><font color="#000080">, </font><font color="#404040">0</font><font color="#000080">, </font><font color="#404040">0</font><font color="#000080">, </font><font color="#404040">300</font><font color="#000080">, </font><font color="#404040">300</font><font color="#404040">
</font>Form<font color="#000080">(</font><font color="#404040">50</font><font color="#000080">).AutoRedraw </font>= <font color="#404040">1
</font></pre>
<p>Note that the forms created with a number from 0 to 31 can be accessed using the <strong>Form()</strong> array syntax as well. So, there are two ways to access the <strong>Form</strong> object for a window with number 1: <strong>Win_1</strong> and <strong>Form(1)</strong>. This is practical in situations where a <strong>Form</strong> must be accessed through an index rather than through a fixed Form variable like <strong>Win_x</strong>. </p>
<p>One of the advantages of using <strong>OpenW </strong>is the easy way of defining the window-styles. To create an overlapped unowned window <strong>OpenW</strong> provides the following syntax (without the MDI and <strong>Owned</strong> options):</p>
<ul>
<li>
<div align="left"><strong>OpenW</strong> [options] [#]n [, x, y, w, h][, attr] </div>
</li>
</ul>
<p>If you omit the <em>attr</em> argument GB32 creates a default window – visible, sizeable, and with a caption and a system menu – using the following window styles for the dwStyle parameter of <em>CreateWindowEx</em>: WS_OVERLAPPED, WS_CAPTION, WS_CLIPSIBLINGS, WS_CLIPCHILDREN, WS_THICKFRAME, WS_SYSMENU, WS_MINIMIZEBOX, WS_MAXIMIZEBOX, and WS_VISIBLE. Some of these default styles can be disabled by using the <em>options</em> argument as we’ll see.</p>
<p>The <em>attr</em> argument is an integer whose bits determine the window styles. The next table shows the possible attributes. Note that the meaning of the bits are inherited from the very first GFA-BASIC versions, and may look a bit strange or appear missing (bit 8):</p>
<table border="1" cellpadding="8" cellspacing="0"><tbody>
<tr>
<td valign="top"><strong>Bit </strong></td>
<td valign="top"><strong>Value</strong></td>
<td valign="top"><strong>Description</strong></td>
<td valign="top"><strong>Property</strong></td>
</tr>
<tr>
<td valign="top">0, 1</td>
<td valign="top">1, 2</td>
<td valign="top">Set one of these bits for a vertical scrollbar, sets WS_VSCROLL</td>
<td valign="top">ScrollBars = basVert</td>
</tr>
<tr>
<td valign="top">2, 3</td>
<td valign="top">4, 8</td>
<td valign="top">Set one of these bits for a horizontal scrollbar, sets WS_HSCROLL</td>
<td valign="top">ScrollBars = basHorz</td>
</tr>
<tr>
<td valign="top">4</td>
<td valign="top">16</td>
<td valign="top">Displays a caption bar, sets the WS_CAPTION style</td>
<td valign="top">Caption = “Title”</td>
</tr>
<tr>
<td valign="top">5</td>
<td valign="top">32</td>
<td valign="top">Adds a system-menu, sets the WS_SYSMENU style</td>
<td valign="top">ControlBox = True</td>
</tr>
<tr>
<td valign="top">6</td>
<td valign="top">64</td>
<td valign="top">Displays the minimize button in the title bar, sets the WS_MINIMIZEBOX style. With WS_SYMENU the button is dimmed only.</td>
<td valign="top">MinButton = True</td>
</tr>
<tr>
<td valign="top">7</td>
<td valign="top">128</td>
<td valign="top">Displays the maximize button in the title bar, sets the WS_MAXIMIZEBOX style. With WS_SYMENU the button is dimmed only.</td>
<td valign="top">MaxButton = True</td>
</tr>
<tr>
<td valign="top">9</td>
<td valign="top">512</td>
<td valign="top">Sets the WS_THICKFRAME to make the window sizeable</td>
<td valign="top">Sizeable = True</td>
</tr>
</tbody></table>
<p>When <em>attr</em> = –1 all bits are set and the form is created with the following styles: WS_OVERLAPPED, WS_VSCROLL, WS_HSCROLL, WS_CAPTION, WS_CLIPSIBLINGS, WS_CLIPCHILDREN, WS_THICKFRAME, WS_SYSMENU, WS_MINIMIZEBOX, WS_MAXIMIZEBOX, and WS_VISIBLE. In short, the same styles as used when the <em>attr</em> argument is omitted, except it now includes the scrollbar styles. These styles can be changed at runtime using the Form’s properties <strong>Visible </strong>(or <strong>Hide/Show</strong>)<strong>, ScrollBars, Caption, ControlBox, MinButton, MaxButton, and Sizeable</strong><em>.</em></p>
<p>With the introduction of GB32 the syntax of <strong>OpenW</strong> is changed so that even more window-styles (<em>options</em>) may be specified. For instance, in the example above the option <strong>Center</strong> is used to position the form in the center of the (main) screen. GB32 supports the following <em>options</em> that maybe combined:</p>
<strong></strong><table border="1" cellpadding="8" cellspacing="0"><tbody>
<tr>
<td valign="top"><strong>Option</strong></td>
<td valign="top"><strong>Description</strong></td>
<td valign="top"><strong>Property/Method</strong></td>
</tr>
<tr>
<td valign="top"><strong>Center</strong></td>
<td valign="top">Centers the form on the main(!) display.</td>
<td valign="top">Center</td>
</tr>
<tr>
<td valign="top"><strong>Hidden</strong></td>
<td valign="top">Does not show the form, removes the WS_VISIBLE style from the dwStyle parameter.</td>
<td valign="top">Hide or Visible = False</td>
</tr>
<tr>
<td valign="top"><strong>Full</strong></td>
<td valign="top">Creates a maximized window on the main(!) display, excludes <strong>Hidden. </strong>Sets the WS_MAXIMIZE bit of the dwStyle parameter of the <em>CreateWindowEx()</em> API. </td>
<td valign="top">FullW</td>
</tr>
<tr>
<td valign="top"><strong>Fixed</strong></td>
<td valign="top">Removes the WS_THICKFRAME dwStyle</td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top"><strong>Client3D</strong></td>
<td valign="top">Sets the WS_EX_CLIENTEDGE bit of the dwExStyle parameter of the <em>CreateWindowEx()</em> API</td>
<td valign="top">Appearance, set bit 1</td>
</tr>
<tr>
<td valign="top"><strong>Tool</strong></td>
<td valign="top">Sets the WS_EX_TOOLWINDOW bit of the dwExStyle parameter of the <em>CreateWindowEx() </em>API</td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top"><strong>Top</strong></td>
<td valign="top">Sets the WS_EX_TOPMOST bit of the dwExStyle parameter of the <em>CreateWindowEx()</em> API</td>
<td valign="top">OnTop = True</td>
</tr>
<tr>
<td valign="top"><strong>Help</strong></td>
<td valign="top">Sets the WS_EX_CONTEXTHELP bit of the dwExStyle parameter of the <em>CreateWindowEx()</em> API</td>
<td valign="top">HelpButton = True</td>
</tr>
<tr>
<td valign="top"><strong>Palette</strong></td>
<td valign="top">Sets the WS_EX_PALETTEWINDOW bit of the dwExStyle parameter of the <em>CreateWindowEx()</em> API</td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top"><strong>NoCaption, NoTitle</strong></td>
<td valign="top">Excludes a title bar that otherwise would be created. </td>
<td valign="top">ControlBox = False, Caption = “”</td>
</tr>
<tr>
<td valign="top"><strong>Default</strong></td>
<td valign="top">Sets the x, y coordinates to CW_USEDEFAULT (-127) </td>
<td valign="top"> </td>
</tr>
</tbody></table>
<p>The different options may also be set at runtime after the form has been created using properties or methods, see table.</p>
<p>There is another command to create a form: the <strong>Dialog</strong> command, but it is primarily used to convert dialog boxes from older GB sources to GB32 forms. Syntax:</p>
<ul>
<li><strong>Dialog</strong> [#]n, x, y, w, h, tit$ [,flag [,height, font$] ]</li>
</ul>
<p>The <strong>Dialog</strong> command is followed by a sequence of Ocx control definitions that make up the user-interface of the dialog box. The dialog definition is ended with an <strong>EndDialog</strong> statement. The meaning of the arguments of <strong>Dialog</strong> depend on the settings specified with the <strong>DlgBase</strong> command. There are only 32 dialog definitions allowed (0 <= n <= 31) and the predefined form variables are <strong>Dlg_0</strong> … <strong>Dlg_31</strong>. When a form is created using <strong>Dialog</strong>, the <strong>IsDialog</strong> property returns True.</p>
<p><strong>The Form command</strong>
<br />The <strong>Form</strong> command is an alternative to <strong>OpenW</strong> and allows you to assign any name to the form.</p>
<ul>
<li><strong>Form</strong> [options] fname [= title$, x, y, w, h ]</li>
</ul>
<p>There is a disadvantage though. The <strong>Form</strong> command does not allow you to specify the window attributes (the window styles), you can only set the <em>options</em> as summarized in the previous table. The form gets the same default window styles as <strong>OpenW</strong>: WS_OVERLAPPED, WS_CAPTION, WS_CLIPSIBLINGS, WS_CLIPCHILDREN, WS_THICKFRAME, WS_SYSMENU, WS_MINIMIZEBOX, WS_MAXIMIZEBOX, and WS_VISIBLE. Using the <em>options</em> argument some of these can be modified, see table.</p>
<p>The <strong>Form</strong> command does not support the scrollbar window style, because it does not support the <em>attr</em> argument. To add scrollbars use the <strong>ScrollBars</strong> property after the form has been created:</p>
<pre>Debug<font color="#800000">.</font><font color="#000080">Show
</font>Form Center <font color="#800000">frm </font>= <font color="#804000">"Title" </font><font color="#000080">, </font><font color="#404040">4</font><font color="#000080">, </font><font color="#404040">8 </font><font color="#000080">, </font><font color="#404040">200 </font><font color="#000080">, </font><font color="#404040">300
</font><font color="#800000">frm.</font><font color="#000080">ScrollBars </font>= <font color="#000080">basBoth
</font>Do
Sleep
Until <font color="#000080">Me Is Nothing
</font>Sub <font color="#800000">frm_ReSize
</font>Debug <font color="#804000">"size event"
</font>Sub <font color="#800000">frm_Paint
</font>Debug <font color="#804000">"paint event"
</font></pre>
<p>Some of the form properties that change a window (ex)Style can not be applied dynamically to an existing window. In this case the form has to be destroyed and then recreated with the new window-styles. So, the window is actually created twice. As a consequence the <strong>ReSize</strong> and <strong>Paint</strong> event subs are invoked twice before the main message loop is entered, see below “Hidden DoEvents while creating a form”.</p>
<p><strong>The LoadForm command</strong>
<br />This command is used to load a form defined using GFA-BASIC 32’s Form Editor.</p>
<ul>
<li><strong>LoadForm</strong> frm [options] [, x, y] (x and y in Twips)</li>
</ul>
<p>The options specify the same settings as with the other commands. In addition, you can specify the position of the form in pixel coordinates. All the window styles (attributes and options) can be selected using the Properties listbox in the sidebar. Still, you can override some of these properties using the <em>options</em> argument. For instance, using the option <strong>Hidden</strong> a form can be loaded without making it visible. <br />This command initializes its form object variable during execution; the variable is accessible in the events that are executed while <strong>LoadForm</strong> loads the form.
<br />This is the only command that initiates a <strong>Load</strong> event that can be used to initialize the Ocx controls of the form or to do any other initialization. </p>
<pre>LoadForm <font color="#800000">frm1</font>
Do
Sleep
Until <font color="#000080">Me Is Nothing
</font>Sub <font color="#800000">frm1_Load
</font><font color="#008000">' Do initialization here
</font>EndSub
</pre>
<p><strong>Hidden DoEvents while creating a form</strong>
<br />The commands that create a form invoke a hidden <strong>DoEvents</strong> message loop to process all pending (posted) messages that are a result of the creation of the window. In particular, if the program contains <strong>Paint</strong> and <strong>ReSize</strong> event subs, the subs may be called when the hidden <strong>DoEvents</strong> is executed. In this case, <em>the form’s object variable is not yet initialized</em> (except for the <strong>LoadForm</strong> command, see above). For instance, trying to access the <strong>Win_1</strong> variable in a Win_1_Paint event sub will cause a runtime error, because the first time the Paint event sub is called the variable is still <strong>Nothing</strong>. The form’s object variable Win_1 is not initialized before <strong>OpenW</strong> has finished. Fortunately, The <strong>Me</strong> form variable is valid as soon as the actual window has been created and can be used in the event subs, even when called from the hidden <strong>DoEvents</strong>.</p>
<p><strong>What is Me?</strong>
<br /><strong>Me</strong> is a global form-variable that references the current ‘active’ form, or the form that is currently being processed. In the event subs <strong>Me</strong> references the form for which the event sub is invoked. In the message loop <strong>Me</strong> references the latest form for which a message is received. With multiple windows <strong>Me</strong> might reference an inactive window, because <strong>Me</strong> is set to the window that receives a message and it can not be predicted in what order messages are sent or posted. However, <strong>Me</strong> always references a form, whether it is the top (active) window or some other window. So, do not expect <strong>Me</strong> to reference the active form in the message loop. When all windows are closed <strong>Me</strong> becomes <strong>Nothing</strong> and the main message loop is ended. </p>
<p><strong>Who has the focus?</strong>
<br />When a form contains Ocx controls that can have the focus (<strong>Command</strong>, <strong>TextBox</strong>, etc) the focus should be set to the first Ocx control in the tabstop (or creation)-order before entering the message loop. Windows will automatically set the focus to a control when the window is being used (resized, (de-)activated, minimized, etc). GB32 does not set the focus to the first control after creating the form, but to conform to the behavior of Windows, set the focus explicitly at the start of the application.</p>
<p><strong>Conclusion</strong>
<br /><strong>OpenW</strong> and <strong>Form</strong> are much alike, although <strong>OpenW</strong> gives more control over the window styles through the attributes argument. During the creation of a form some event subs will be invoked without the form-variable being initialized, but <strong>Me</strong> is valid. Only <strong>LoadForm</strong> invokes the <strong>Load</strong> event sub. The <strong>Dialog</strong> command is used for porting older sources.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-33594609555933737272021-04-25T11:10:00.001+02:002021-04-25T11:10:42.036+02:00The gfawinx library<p>It’s been a while since GFA Software Technologies GmbH released GFA-BASIC 32. At that time (2001) it could not be foreseen how Windows - and PC-use in general - would evolve. Consequently, GB32 misses runtime functions to coop with the latest Windows developments and the introduction of better hardware. To fill that gap <em>gfawinx.lg32</em> comes with a set of commands and functions to access and use the newer features. The name <em>gfawinx</em> stands for “GFA-BASIC 32 expansion” library, <em>gfawinx</em> contains several categories. When you load the <em>gfawinx.g32</em> code file in the editor the Procs sidebar shows the current groups:</p> <a href="https://drive.google.com/uc?id=1LET_cHO2sMX4h4HEkK1L155u9EVUVt0n"><img title="Screenshot 2021-04-23 112115" style="display: inline; background-image: none;" border="0" alt="Screenshot 2021-04-23 112115" src="https://drive.google.com/uc?id=1054cdYCtMAz4SACCUjXrPoiuPboGmC6S" width="556" height="306" /></a> <p><strong>Download latest version</strong> <br />Previous <em>gfawinx</em> versions – until and including the version of 16 Feb 2021 - contain an error that may lead to problems when loading the library into a program. If you are planning to use <em>gfawinx</em> make sure you have a version later than 16 Feb 2021. Please check the date of the file in the Include directory. </p> <p align="center">Download a newer version if necessary <a href="https://1drv.ms/u/s!Al02NHZQ3k6diKAhzCd8a3_YUHqN6g?e=wiGV4L">here</a> and unzip the file to the Include directory. </p> <p>What’s the problem? One of the library functions uses a DLL function declared using the <strong>Declare</strong> command. However, when a lg32 library uses a declared function it must also export that DLL function using an <strong>$Export Decl</strong> command.The program that is importing the library must be able to add that declared function to the program’s table of DLL functions. <em>Gfawinx</em> used a declared function, but did not export it. The current version of gfawinx doesn’t use <strong>Declare</strong> anymore, but uses <em>GetProcAddress()</em> to obtain the function’s address and calls it using <strong>StdCall()().</strong> Something to remember when you are developing your own libraries.</p> <p><strong>The String functions</strong> <br />The <strong>Wide</strong> and <strong>Ansi</strong> functions are mainly used with Windows API functions that take a UNICODE string. An example of both functions was discussed in <a href="http://gfabasic32.blogspot.com/2019/05/task-dialog-as-replacement-for-alert.html">Task Dialog as a replacement for Alert</a>, which demonstrates the use of a Windows API taking UNICODE strings as parameters. This blog post also contained an example of <strong>StrToArr,</strong> which is used to convert a string, containing sub-strings separated with any character, to an array. <strong>StrToArr</strong> is an addition or replacement for the <strong>Array</strong> ar$() = $ command. <br />The <strong>Replace</strong> string function is a VB(A) compatible function, much easier to use then the Split command of GB32. The <strong>Replace</strong> function is optimized for speed and takes the string arguments by reference if the arguments are string variables. Only in case a string literal is passed GB32 will pass the string parameter by value (making a copy first and then pass that copy). This is achieved by making <strong>Replace</strong> a <strong>FunctionVar</strong> rather than a <strong>Function</strong>. </p> <table cellspacing="0" cellpadding="8" border="1"><tbody> <tr> <td valign="top"><strong>FunctionVar and Sub anonymous String and Variant parameters <br /></strong>When a parameter of a <strong>FunctionVar</strong> or <strong>Sub</strong> does not explicitly specify <strong>ByVal</strong> or <strong>ByRef</strong> the parameter is anonymous. In this case the compiler decides how to pass the parameter to the <strong>FunnctionVar</strong> or <strong>Sub</strong>. If possible, the compiler generates code to pass the <strong>String</strong> or <strong>Variant</strong> by reference, otherwise the parameter is passed by value. To be able to pass by reference the caller must pass a variable; a literal is always copied to a temporary locally variable which is then passed by reference. Note that a <strong>ByVal</strong> parameter always gets a copy of the data that is passed, which requires the compiler to insert additional code to create a copy first. Passing by reference is almost always faster. Using anonymous parameters can speed up the execution of a procedure or function considerably.</td> </tr> </tbody></table> <p>An example that shows the difference:</p> <pre>$Library <font color="#804000">"gfawinx"
</font>Dim <font color="#800000">src$</font><font color="#000080">, </font><font color="#800000">find$</font><font color="#000080">, </font><font color="#800000">new$</font><font color="#000080">, </font><font color="#800000">result$
result$ </font>= <font color="#000080">Replace(</font><font color="#800000">src$</font><font color="#000080">, </font><font color="#800000">find$</font><font color="#000080">, </font><font color="#800000">new$</font><font color="#000080">) </font><font color="#008000">' variables, fast
</font><font color="#800000">result$ </font>= <font color="#000080">Replace(</font><font color="#804000">"GFA-BASIC"</font><font color="#000080">, </font><font color="#804000">"A"</font><font color="#000080">, </font><font color="#804000">"x"</font><font color="#000080">) </font><font color="#008000">' literals, slower
</font></pre>
<p><strong>ErrStr</strong> is a convenient function to obtain the relevant <strong>Err</strong>-properties as a string. Usually, <strong>ErrStr</strong> will be used in a <strong>Try</strong>/<strong>Catch</strong> handler to present information about the trapped error to the user. The problem is to decide which <strong>Err</strong>-properties contain the relevant error information. <strong>ErrStr</strong> examines the properties and only returns the properties that contain the actual error information. <strong>ErrStr</strong> takes one string parameter that is added to the error information. This parameter is perfectly suited for the current proc-name, which is easily inserted using the keyboard short cut App+P. Here App+P inserts “main” into text:</p>
<pre>$Library <font color="#804000">"gfawinx"<a href="https://drive.google.com/uc?id=1pVHbXDM60yNTYmHkNuDYVkxkdK4NUB48"><img width="187" height="141" title="Screenshot 2021-04-23 131437" align="right" style="float: right; display: inline; background-image: none;" alt="Screenshot 2021-04-23 131437" src="https://drive.google.com/uc?id=16S3aPEbNpVVYLYrkDgQ0k9ojrRI3lRKB" border="0" /></a>
</font>Try
Error <font color="#404040">3
</font>Catch
MsgBox <font color="#000080">ErrStr(</font><font color="#804000">"main"</font><font color="#000080">)
</font>EndCatch
</pre>
<p>The program produces the following message box:</p>
<p>The $ = <strong>HexDump</strong>(addr%, size%) string function returns a memory dump starting from the specified address addr% and with a length of size%. The result of this debugging aid can easily be displayed in the Debug Output window or a <strong>MsgBox</strong>.</p>
<p><strong>The Windows functions</strong>
<br />Here we find the Windows API and form-windows related commands and functions. Let’s first examine the <strong>WinVer</strong> function which returns the Windows OS version. In the latest version of <em>gfawinx</em> it returns the value obtained using the <em>RtlGetVersion()</em> API in a hexadecimal format $XXYY, where XX represents the major version and YY the minor version:</p>
<pre>$Library <font color="#804000">"gfawinx"
</font>Print <font color="#000080">Hex(WinVer()) </font><font color="#008000">// A00 (Win 10)
</font></pre>
<p>There is a lot of information to be found on how to obtain the Windows version. The method used by <strong>WinVer()</strong> does not depend on the manifest file as other methods do and should be safe to use with future releases of Windows. (Note - only the latest version of <em>gfawinx</em> - later than 16 Feb 2021- contains this method.)</p>
<p><strong>GetWorkArea</strong> is a useful command when using multiple monitors where the <strong>Screen.Work*</strong> properties don’t work. <strong>GetWorkArea</strong> returns the work area of the monitor containing the largest area of a given window.
<br /><strong>GetProcAddr</strong> returns the address of a function from a specified DLL. It works a little different than the <em>GetProcAddress()</em> API, because it first checks if the required DLL is already loaded.
<br />The <strong>GetClientSize</strong> command returns the size of the client area, useful if <strong>_X</strong> and <strong>_Y</strong> are not available (in API windows).
<br /><strong>ModifyStyle</strong> and <strong>ModifyExStyle</strong> make it easy to change the windows Style or ExStyle on the fly. They allow to both set and remove a windows-style simultaneously.
<br />The <strong>Assoc()</strong> function returns system information associated with files, extensions or Prog IDs. For instance to obtain the full path of the default application that is associated with the .txt extension use:</p>
<pre>$Library <font color="#804000">"gfawinx"
</font>Print <font color="#000080">Assoc(</font><font color="#804000">".txt"</font><font color="#000080">) </font><font color="#008000">// full path of default app
</font></pre>
<p><strong>SaveFormPos</strong> and <strong>LoadFormPos</strong> save and load the form’s position respectively. For single monitor apps these are simple functions to store and retrieve the form’s current position in and from the registry. They are especially useful when used with multiple displays and DPI-aware applications. For detailed information see the help file.
<br /><strong>MemStat</strong> is is a helper function to obtain memory statistics. If the argument is omitted (or is 0) it returns the memory used by the application. It is possible to trap a possible memory leak by using <strong>MemStat</strong>() when the program starts and compare the returned values at each start of the program.</p>
<p><strong>The DPI-related functions</strong>
<br />When you want to write DPI-aware applications these helper functions will be very useful. For more information on writing DPI-aware programs please see the English CHM helpfile: in the Contents section see <em>Creating an application</em>. Programming DPI aware programs is beyond the scope of this blog post. The gfawinx library provides the following functions. </p>
<p><strong>WinDpi</strong> returns the DPI of the display for a window or form.
<br /><strong>DpiAwareness</strong> set the DPI mode for the program.
<br /><strong>ScaleToDpi(Sng)</strong> helps to scale coordinates.
<br /><strong>ScaleXYWHToDpi</strong> scales <strong>ScaleLeft</strong>, <strong>ScaleTop</strong>, <strong>ScaleWidth</strong>, and <strong>ScaleHeight</strong> to a form's DPI.</p>
<p><strong>The TimerQ function</strong>
<br />The <strong>TimerQ</strong> function creates a high-resolution timer wrapped in a (minimal) COM object. This is the <em>gfawinx</em> implementation of the discussion in the blog <a href="http://gfabasic32.blogspot.com/2020/01/high-resolution-timer-wrapped-in-com.html">High Resolution Timer</a> . By using a COM object for a resource it can be guaranteed that the resource is freed when the program ends – either normally or through a runtime error.</p>
<p><strong>Conclusion</strong>
<br />The <em>gfawinx</em> library provides functions and commands that are not included in the GB32 runtime. The commands and functions are displayed in the GB32 syntax color for statements and GB32 functions. The procedures that implement the additions are optimized for speed, when possible the procedures are Naked. It is recommended that you – sometime - take a look at the code, it contains comments on implementation details you might find interesting. The library will grow over time when more ‘missing’ features will be added.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-33254458900313296212021-03-23T11:26:00.001+01:002021-03-23T11:26:19.791+01:00Update version 2.59<p>Note: </p> <p align="center"><font color="#800000">After releasing update version 2.59 on 18 March 2021 a new version was released at 22 March 2021. To check if you have installed the latest release select the About-box in the menu-item Help | About and look at the version of GfaWin32.gll; it should be version 2.590.</font></p> <p><strong>Introduction</strong> <br />A new update is necessary because it fixes two major bugs in the runtime. After the last update (version 2.58 in December 2020) I found the time to investigate and fix a long-standing bug where the <strong>Ocx Form</strong> child control crashes the IDE. While fixing the bug I stumbled upon another runtime bug: the <strong>Item</strong> property of the <strong>Controls</strong> collection did not work and could crash the IDE as well. Besides these fixes, version 2.59 improves auto-complete and comes with an update of the Direct2D library. <br />The rest of the blog explains the runtime bugs and introduces Direct2D version 1.1.</p> <p><strong>About the fixed runtime bugs</strong> <br />The <strong>Ocx Form-</strong>control-bug presented itself as a crash of the IDE after one or two times running the program. For a long time, it was unclear what caused the bug. If a form contained an <strong>Ocx Form</strong> child control the program executed fine unless the <strong>Ocx Form</strong> child control was assigned to <strong>Me</strong>, or when the program iterated over the form’s controls using <strong>For Each ctrl in Form.Controls</strong>, or when the <strong>Ocx Form</strong> was used in a <strong>With</strong> statement. There were other symptoms of the bug, for instance setting the <strong>Ocx Form’</strong> s scrollbar properties might cause a floating-point stack error. In the end it turned out that the bug was caused by the runtime when it wrongly released the <strong>Ocx Form </strong>(COM) object prematurely. </p> <p>After a COM object is assigned to another object (variable) the reference count of the COM object is increased. When a COM object is set to <strong>Nothing</strong> the reference count is decreased. When the reference count is zero all resources of the COM object are freed and the variable referencing the object becomes <strong>Nothing</strong>. However, when the <strong>Ocx Form</strong> child control is referenced twice or more and is then released, the object’s underlying resources are completely freed <em>as if the the reference count has become zero</em>. The next time the <strong>Ocx Form</strong> object is released (for instance automatically at the end of the program) it’s resources are already freed and memory pointers have become invalid resulting in access violation errors in the runtime. GB32 tried to recover from these corrupted pointers but could not prevent an IDE crash.</p> <p>As you can see, the symptoms of the <strong>Ocx Form</strong> bug were an indication of this wrong behavior. When assigning the <strong>Ocx Form</strong> <em>frx</em> to <strong>Me</strong>, both <em>frx</em> and <strong>Me</strong> reference the <strong>Ocx Form</strong> and more than one reference to the <strong>Ocx Form</strong> would eventually crash the IDE. Before knowing the cause of the bug I advised not to assign an <strong>Ocx Form</strong> to <strong>Me</strong>, now it can be done without any problem. </p> <pre>OpenW <font color="#404040">1
</font>Ocx Form <font color="#800000">frx </font>= <font color="#804000">""</font><font color="#000080">, </font><font color="#404040">10</font><font color="#000080">, </font><font color="#404040">10</font><font color="#000080">, _X - </font><font color="#404040">20</font><font color="#000080">, _Y - </font><font color="#404040">20
</font>Set <font color="#000080">Me </font>= <font color="#800000">frx </font><font color="#008000">' OK now
</font></pre>
<p>The same problem occurred with <strong>With</strong> <em>frx</em>. <strong>With</strong> creates a hidden temporary object variable to which <em>frx </em>is assigned. So, after executing <strong>With,</strong> two object variables reference the <strong>Ocx Form</strong> <em>frx</em>. <strong>EndWith</strong> will release the hidden variable by setting the hidden variable to <strong>Nothing</strong>, which – with the bug present - would destroy the <em>frx</em> object completely, but not anymore.</p>
<pre>With <font color="#800000">frx </font><font color="#008000">' assigns frx to a hidden local object variable
' use properties and methods
</font>EndWith <font color="#008000">' releases the hidden variable
</font></pre>
<p>The <strong>For Each</strong> loop mentioned before shows the same behavior:</p>
<pre>Local Control <font color="#800000">ctrl
</font>For Each <font color="#800000">ctrl </font>In <font color="#000080">Win_1.Controls
</font><font color="#008000">' use Control properties/methods
</font>Next
</pre>
<p>Each iteration assigns a new Ocx child control object to the <em>ctrl</em> variable. In the process the object that is currently assigned to <em>ctrl</em> is released (set to <strong>Nothing</strong>). When <em>ctrl</em> is assigned the <strong>Ocx Form</strong> child control the next iteration will release <em>ctrl</em> and thus release the <strong>Ocx Form</strong> object. Due to the bug all it’s resources are freed. As said, this is now fixed in runtime (GfaWin23.ocx) version 2.38.</p>
<p>While investigating the <strong>Ocx Form</strong> bug I stumbled upon two other bugs, which are fixed also. First, autocomplete didn’t show the properties for <em>Win_1.Controls</em> and secondly, the <strong>Item</strong> property of the <strong>Controls</strong> collection failed.</p>
<pre>Local Control <font color="#800000">ctrl
</font>Set <font color="#800000">ctrl </font>= <font color="#000080">Win_1.Controls.Item(</font><font color="#404040">1</font><font color="#000080">) <font color="#008000">' OK now </font>
</font></pre>
<p><strong>The Direct2D library version 1.1</strong>
<br />The new Direct2D library contains several new commands and functions. The purpose of this release was to fill the gaps that were left by the previous version. Therefor, the following commands are extended to provide the same functionality as the GFA-BASIC 32 built-in drawing commands. The D2 circle and ellipse commands now support arc- and pie drawing, which required a new syntax:</p>
<p><strong>D2(P)Circle</strong> x!, y!, r! [, w1%][, w2%][, Figure%] [,D2Brush]  <br /><strong>D2(P)Ellipse</strong> x!, y!, rx!, ry! [, w1%][, w2%][, Figure%] [,D2Brush]</p>
<p>The library supports the polygon commands in the same manner as the GB32 commands <strong>D2PolyLine</strong> and <strong>D2PolyFill</strong> draw a polygon directly into the render target. There is also a <strong>D2DefPoly</strong>() function to create and cache a polygon to be drawn later on when the render target is updated. The implementation of the polygon commands required the Direct2D <em>geometries</em>. There is whole set of commands and functions to create and draw into a geometry. Check out the help file and the examples in Samples\Direct2D directory. Many D2 help file topics contain a link to the Microsoft online SDK for further information on Direct2D issues. The examples directory also contains two SDK examples converted to GB32; D2ClockSDK.g32 and D2PathGeometry.g32.</p>
<p>In addition, it is important to know that the <strong>D2GetRT</strong>() syntax has changed. It won’t be noticeable if you use the default settings: <strong>Set RT = D2GetRT()</strong>, which creates a DC-render target. However, when you do use arguments, for instance to create a window render target, you need to update your code. See the help file for more information on the syntax.</p>
<p>This isn’t the latest Direct2D update, I will continue to work on the Direct2D library. Regularly check this site for more information.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-84464678525448088352021-02-23T11:47:00.001+01:002021-02-23T11:47:41.329+01:00The Include directory<p>After installing GFA-BASIC 32 you’ll find four directories in the installation path: <em>Bin, Doc, Include, and Samples.</em></p> <a href="https://drive.google.com/uc?id=14n6mlJp0hGj6-Ue6HVhabtCp45ktcrwP"><img title="image" style="display: inline; background-image: none;" border="0" alt="image" src="https://drive.google.com/uc?id=1x9BaRmjsIxWpzHHHtwl5ooCqNg8y0mgP" width="186" height="94" /></a> <p>The <em>\Bin</em> directory contains the GB32 binaries, the <em>\Doc</em> contains the original (German) doc-files that came with GFA-BASIC 32 back in 2001 (now obsolete because everything can be found in the English CHM helpfile), the <em>\Include</em> contains the Windows API include files, and the <em>\Samples</em> directory the samples g32 files, including the new Direct2D example programs.This time we’ll focus on the <em>\Include</em> directory only.</p> <p><strong>What is the \Include directory for?</strong> <br />The purpose of the <em>\Include</em> directory is to collect all Windows API definitions and declarations in one directory. Because of the huge amount of Windows APIs the definitions and declarations are split into multiple smaller include library files. These GB32 Windows API include-files come both with the source code and the compiled library (lg32) file. The organization of the GB32 include files follows the way the Windows SDK presents the C/C++ include header files. For instance, the C/C++ header file <em>winuser.h</em> has an equivalent GB32 include file <em>winuser.inc.lg32</em>. All include files follow this naming convention: <em>name.inc.lg32</em>. <br />You import a GB32 include library file using the <strong>$Library</strong> command, for instance:</p> <pre>$Library <font color="#804000">"winuser.inc" </font><font color="#008000">' .lg32 may be omitted
</font></pre>
<p>By default, the line doesn’t need to specify the full path, because the location of the <em>\Include</em> directory is pre-selected in the Properties | Extra tab dialog box.</p>
<p><a href="https://drive.google.com/uc?id=1Fw3VUDOa85GW8m9an4U5O7BqsiS3NToo"><img title="image" style="display: inline; background-image: none;" border="0" alt="image" src="https://drive.google.com/uc?id=1jkWQoDNNbhuc2P31Y1Q-EGPuCGzdlY0j" width="365" height="480" /></a> </p>
<p>You can easily add your own paths that contain your own library files. The entire string with the specified paths is stored in “lg32paths”registry key. To add a path first type a semicolon ; after the existing path and then specify the full path after the semicolon. Once a path is part of <em>Library paths</em> you do no longer need to type the full path in the <strong>$Library</strong> statement. Note that libraries are searched for (1) in the current program's directory, (2) in My Documents\lg32, and (3) in the paths stored in the registry key "lg32paths". </p>
<p>Note The <em>\Include</em> directory also contains the libraries <em>gfawinx.lg32</em>, <em>direct2d.lg32</em> and <em>variants.lg32</em>. These are not include files and don’t have the <em>.inc</em> clause in their names. These are libraries that are part of the GFA-BASIC 32 updates and need an easily accessible path.</p>
<p><strong>Why multiple include files?</strong>
<br />Each include file contains only a part of the Windows API, that way you don’t need to include a single large file with many APIs just to have a few declarations. The GB32 include files only provide the APIs that are not built-in by GFA-BASIC32. (Note that the Win32API.g32 that originally came with GB is incomplete and full of errors.) Due to the amount of new APIs that come with each new Windows version, the include files in the <em>\Include</em> files aren’t complete either. They do however provide more declarations and definitions than the original Win32API.g32. Some of the include files are updated with the latest APIs (most specifically APIs supported by Win7 and Windows 10) like, for instance, <em>winuser.inc.lg32.</em> However, many haven’t been updated for a while. They tend to get an update on a ad hoc basis; when I need new APIs I add them to the include files. It is a boring job and, because of the translation from C/C++, errors are easily made. If you need an API that isn’t in one of the include library files yet, let me know (<a href="mailto:gfabasic32@gmail.com">gfabasic32@gmail.com</a>).</p>
<p><strong>Contents of an include library</strong>
<br />By default, the GB32 Windows include files only provide function declarations (<strong>Declare</strong> statements), constant definitions, and user-defined type definitions. They don’t contain executable code and besides the <strong>Declare</strong>’s they do not contribute to the size of the program. You should know that <strong>Declare</strong>-ed DLL functions are collected in a DLL-import table that do become part of the program (executable). By spreading the <strong>Declare</strong>’s over multiple include files the DLL-import table can remain small.
<br />There is one “include” file that does contain executable code: <em>winmacros.lib.lg32</em> (note the lacking <em>.inc</em> clause in the name). This library contains functions for often used Windows macros that are used as functions in C/C++, but are defined as macros in the C/C++ header files. Some of these function macros are collected into <em>winmacros.lib.lg32.</em> Among others, the library provides (Naked) functions for <strong>GET_X_PARAM</strong>, <strong>GET_Y_PARAM</strong>, <strong>MakeLParam</strong>, <strong>MakeIntResource</strong>, etc. Please take a look at the source code in <em>winmacros.lib.g32</em> for an overview of the supported functions/macros.</p>
<p><strong>How to locate a specific API</strong>
<br />How do you know in which include file a specific API (type, constant, or function) is located? It might be that GB32 already supports the API as a built-in API, only function declarations and constant definitions. GB32 does not have built-in API support for user-defined API type definitions, they always have to be defined by the program or imported from an include library. The easiest way to check if GB32 supports a specific API is by using the auto-complete feature. Just type the first letters of the function or constant and check if the auto-complete pops up with the required name. If it isn’t provided by GB32 you’ll need to check the Windows SDK documentation to see which C/C++ include file provides the declaration or definition for that API and load the equivalent GB32 .<em>inc</em> library file. </p>
<p><strong>An example of using an API</strong>
<br />Each topic in the Windows SDK specifies in which C/C++ header file an API function, type, or constant is declared. For instance, if and API is located in the <em>winuser.h</em> C/C++ header file you have a big chance of finding it in the <em>winuser.inc.lg32</em> file. Let’s look at an example. Suppose your program wants to process the WM_GETMINMAXINFO message. After looking up the documentation for this message, it tells you to obtain the  MINMAXINFO structure from the <em>lParam</em>. However, GB32 itself does not provide a definition for the MINMAXINFO user-defined type, and you need to import the type. When you go to the SDK page that describes this type you’ll find at the bottom of the page the location of the definition of this structure: the <em>winuser.h</em> C/C++ header file. Now you know which GB32 include library you need: <em>winuser.inc </em>and the program can import that library. As it happens this structure contains members of the API type POINT, which is defined in <em>wingdi.inc. </em>However, you won’t need to include <em>wingdi.inc</em> in your program, because it is imported by <em>winuser.inc</em> (otherwise it couldn’t be compiled). After importing <em>winuser.inc</em> in your program the constants and user-defined types from <em>wingdi.inc</em> are available as well. So, the POINT structure is available as a user-defined type in your program.</p>
<p>Note <em>winuser.inc</em> exports the constants and type definitions of <em>wingdi.inc</em>, but not the function declarations. If you need an API function declared in <em>wingdi.inc</em> you’ll need to import <em>wingdi.inc</em> as well. Importing both include files won’t collide with each other.</p>
<pre>$Library <font color="#804000">"winuser.inc"
</font>$Library <font color="#804000">"wingdi.inc"
</font></pre>
<p>Although both include files export the same constants and user-defined types they are added only once to the program. Now if <em>winuser.inc</em> would also export the function declares from <em>wingdi.inc</em> the internal database of GB32 may become corrupted. Therefor, <em>winuser.inc</em> exports all constants and types using the <strong>$Export Const *</strong> and <strong>$Export Type *</strong> statements, but the exported <strong>$Export Decl</strong> <em>name</em> statements must specify each exported declare separately. This is easily done using the App+E shortcut, it inserts <strong>$Export Decl</strong> lines for each <strong>Declare</strong> in the library file.</p>
<p><strong>Conclusion</strong>
<br />You can use the Windows API <em>inc</em> files to import Windows APIs easily. Because the (compiled) user-defined types are imported from a library the autocomplete function has direct access to their members and is fully operational without first compiling your program.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-49584594760826882732020-12-10T10:53:00.001+01:002020-12-10T10:53:58.885+01:00Version 2.58 December 2020 Update<p>A new version of GFABASIC 32 is available now. It has a better auto complete that comes with a little help box for the listbox elements. In addition, version 2.58 has support for Direct2D, for developing multiple monitor applications, and comes with a new <em>gfawinx</em> library with new commands and functions. James Gaite did a good job by making the English CHM helpfile up-to-date with the latest information.</p><p><strong>Auto complete</strong><br>Version 2.58 improves on auto complete by doing a better job in showing relevant elements and by providing a little help box.</p><p><img src="data:image/png;base64,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">This (optional) help for auto complete displays the syntax and a small description of the GFABASIC 32 commands and functions. The syntax is also copied to the statusbar and remains visible to help in using the correct syntax even after the auto complete listbox has disappeared. The help is also displayed for the program’s procedures and functions, the lg32 procedures and functions, and the declared DLL functions. Their prototypes are both visible in the help box and in the statusbar.<br>New parsing routines made it possible to display real time help for variables in the auto complete listbox. The help box shows whether the constant or variable is local or global and constants display their current value. While most of information is obtained while editing, the only structure that needs compiling is a type (UDT) definition. The <strong>Type</strong> name and members need to present in the internal GB database before auto complete can show its members.</p><p><strong>Ditect2D support</strong><br>Windows’ Direct2D, which is implemented as COM objects, are encapsulated in
GFA-BASIC as GB32 - like commands. All the Direct2D command names start with <strong>D2</strong>, like <strong>D2Color</strong>, <strong>
D2Line</strong>, <strong>D2Brush,</strong> etc. To use Direct2D include the GFA-BASIC 32 library <em>
direct2d.lg32</em> in your program. The library is located in the <em>Include</em> directory and exports GFA-BASIC like commands and
functions that correspond to the set of graphic commands GFA-BASIC already
offers. For instance, the syntax of <strong>D2Line</strong> mimics the behavior of the <strong>Line</strong> command, <strong>D2DefFill</strong>
selects a new fill brush as <strong>DefFill</strong> does, etc. <br>The new English CHM helpfile plays an important role in developing Direct2D applications.</p><p><img src="data:image/png;base64,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"></p><p>The new help provides an introduction to Direct2D programming and discusses the <strong>D2</strong> command's. The example code presented in the help-topics are stored in the <em>Samples/Direct2D</em> directory. You
are encouraged to step through the samples, but you should
start reading with the <strong>D2GetRT</strong> topic in the help-file. <strong>D2GetRT</strong> is the base in each
program to initialize Direct2D and to provide a render target (canvas) to draw
on. So, it is a good place to start reading.</p><p><strong>DPI-aware applications</strong><br>To develop DPI-aware apps you'll need two monitors, one regular 96 dots-per-inch
display to run the GFABASIC 32 IDE and one high-resolution display to run and
test the program. In addition, the manifest of <em>GfaWin32.exe</em> must include the
<dpiawareness> tag. For this purpose the <em>Bin</em> directory contains a separate
dpi-manifest file that needs to be renamed to <em>GfaWin32.exe.manifest</em>. You can
accomplish this by saving or renaming the current manifest
(<em>GfaWin32.exe.manifest</em>) and then rename the <em>GfaWin32.exe.dpiawaremanifest</em> to <em>
GfaWin32.exe.manifest</em>. See the help-file for more information on creating DPI-aware applications. It provides information for new <em>gfawinx</em> DPI-scaling commands that will help developing high-resolution apps, like <strong>ScaleToDpi</strong>, <strong>ScaleToDpiSng</strong>, <strong>ScaleXYWHToDpi, and WinDpi, </strong>but also<strong> LoadFormPos and SaveFormPos </strong>to handle loading and saving the application’s main form on multiple monitors.</p><p><strong>The Large Address Aware command</strong><br>When the <strong>$LargeAddressAware</strong> compiler directive is used in the code, the compiled EXE is modified to handle memory addresses above 2 GB,
theoretically allowing access to up to 4 GB of virtual memory. Normally, a
32-bit application can address only the first 2 GB of memory, however on 64-bit operating systems and when the application is large
address aware it can access the additional 2 GB memory that isn’t used by the OS.</p><p><strong>The gfawinx library</strong><br>The <em>gfawinx</em> library is the source for new GB32 commands and functions. To stress the importance of these additions they have the same syntax-color in the editor as regular GB32 commands. When a new program is started, the first thing to do is to import this library as follows:</p><pre>$Library <font color="#804000">"gfawinx"
</font></pre><p>Besides the string functions, <em>gfawinx</em> contains several commands to support developing multiple monitor programs. A brief overview of the new commands and functions:</p><table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top"><strong>HexDump</strong></td>
<td valign="top">A debugging aid to show the contents of a piece of memory.</td>
</tr>
<tr>
<td valign="top"><strong>ErrStr</strong></td>
<td valign="top">Converts the information from the <strong>Err</strong> object in a single string.</td>
</tr>
<tr>
<td valign="top"><strong>Wide</strong>, <strong>Ansi</strong> </td>
<td valign="top">Allows conversion between UNICODE and ANSI formatted strings.</td>
</tr>
<tr>
<td valign="top"><strong>Replace</strong></td>
<td valign="top">Replaces a string in a given string.</td>
</tr>
<tr>
<td valign="top"><strong>StrToArr</strong></td>
<td valign="top">Separates a delimited – any delimiter character - string into a string array.</td>
</tr>
<tr>
<td valign="top"><strong>Assoc</strong></td>
<td valign="top">Retrieves a file association-related string from the registry.</td>
</tr>
<tr>
<td valign="top"><strong>GetWorkArea</strong></td>
<td valign="top">Retrieves the work area of the monitor containing the largest area of a given
window.</td>
</tr>
<tr>
<td valign="top"><strong>GetClientSize</strong></td>
<td valign="top">Retrieves the width and height (in pixels) of any window's client area.</td>
</tr>
<tr>
<td valign="top"><strong>ModifyStyle</strong>, <strong>ModifyExStyle</strong></td>
<td valign="top">Modifies the style or extended-style of a window.</td>
</tr>
<tr>
<td valign="top"><strong>SaveFormPos</strong>, <strong>LoadFormPos</strong></td>
<td valign="top">Saves and loads the form's position on the screen to and from the registry.
Especially useful with multiple-monitor systems.</td>
</tr>
<tr>
<td valign="top"><strong>ScaleToDpi</strong>, <strong>ScaleToDpiSng</strong></td>
<td valign="top">Converts pixels based on a 96 dot-per-inch resolution to DPI physical pixels of
the Form's display.</td>
</tr>
<tr>
<td valign="top"><strong>ScaleXYWHToDpi</strong></td>
<td valign="top">Scales ScaleLeft, ScaleTop, ScaleWidth, and ScaleHeight to a form's DPI.</td>
</tr>
<tr>
<td valign="top"><strong>WinDpi</strong></td>
<td valign="top">Returns the dots per inch (dpi) value of the display for the specified form.</td>
</tr>
<tr>
<td valign="top"><strong>GetProcAddr</strong></td>
<td valign="top">Returns the address of an exported function or variable from the specified
dynamic-link library (DLL).</td>
</tr>
<tr>
<td valign="top"><strong>WinVer</strong></td>
<td valign="top">Retrieves version information about the currently running operating system (preferred way to obtain Windows’ version).</td>
</tr>
<tr>
<td valign="top"><strong>TimerQ</strong></td>
<td valign="top">Creates a high-resolution timer wrapped in a (minimal) COM object.</td>
</tr>
</tbody>
</table>
<p><strong>The Include directory</strong><br>The <em>Include</em> directory contains Windows API library files ready to import in your program using the <strong>$Library</strong> command. Several include files are modified to export their Declares explicitly by their name. This was necessary because a bug in GB causes a corruption of the Declare-database if the program declared DLL-functions as well. <br>Their is also a <em>winmacros.inc.lg32</em> file with commonly used Windows API macros. The include file provides optimized GB functions to mimic the macros from C/C++ header files.</p><p>You can download the new update <a href="http://gfabasic32.blogspot.com/p/download.html">here</a>.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-8574354725533520302020-11-26T10:14:00.001+01:002020-11-26T10:14:05.921+01:00The Naked attribute in practice<p>In the previous posts <a href="http://gfabasic32.blogspot.com/2018/11/anatomy-of-procedure-1.html">The Anatomy of a Procedure (1)</a> and <a href="http://gfabasic32.blogspot.com/2018/12/anatomy-of-procedure-2.html">The Anatomy of a Procedure (2)</a> I discussed the effect of the <strong>Naked</strong> attribute on the code generated by the compiler. Everything you want to know about the <strong>Naked</strong> attribute can be found in these posts, but – unfortunately – the posts are rather technical. If you lack any experience in assembly it might be hard to understand, so I will recap on the use of the <strong>Naked</strong> attribute in ‘layman’s’ terms here.</p><p><strong>Naked explained</strong><br>A <strong>Naked</strong> procedure is fully optimized, both in size and in performance. This comes with a penalty though, a naked procedure lacks support for dynamic variables types (<strong>String</strong>, <strong>Object</strong>, <strong>Variant</strong>, array and hash), structured exception handling, and runtime debugging (<strong>Tron</strong>, <strong>Trace</strong>). The reason for this is the lack of ‘procedure-housekeeping’ that GFA-BASIC 32 inserts in each regular procedure. In a regular procedure GB starts of by inserting a 80 bytes stackframe (68 in an EXE) to store all information necessary for housekeeping of the procedure. At the end of the procedure in insert code to restore the stack to automatically release all (dynamic) variables (even in case of a runtime error). The housekeeping code is missing in a naked procedure. Consequently, a naked procedure can execute faster, in certain cases up to 50% faster than a regular procedure. Only short procedures benefit from the <strong>Naked</strong> attribute; the executable code must be relative small compared to the code necessary to setup a stackframe of 80 bytes, as we will see. The example procedure from the previous post is a good example of a candidate for <strong>Naked</strong>, it executes 50% faster:</p><pre><font color="#800000">TestMul</font><font color="#000080">(</font><font color="#404040">2</font><font color="#000080">, </font><font color="#404040">3</font><font color="#000080">)
</font>Proc <font color="#800000">TestMul2</font><font color="#000080">(</font><font color="#800000">x </font><font color="#000080">As </font>Int<font color="#000080">, </font><font color="#800000">y </font><font color="#000080">As </font>Int<font color="#000080">) </font>Naked
Local <font color="#800000">tmp </font>As Int
<font color="#800000">tmp </font>= <font color="#800000">x </font><font color="#000080">Mul </font><font color="#800000">y
</font>EndProc
</pre><p>When the procedure grows and contains more executable code the relevance of <strong>Naked</strong> disappears. The next example shows two things. First, it declares a local dynamic string variable (which needs to be released explicitly by setting it to the ‘empty-string’). Secondly, the assignment of data to the string will allocate memory and produce code to copy the data to that memory. This is a relatively expensive operation and will reduce the possible performance gain of <strong>Naked</strong>.</p><pre>Dim <font color="#800000">i%</font><font color="#000080">, </font><font color="#800000">t#
t# </font>= <font color="#000080">Timer
</font>For <font color="#800000">i% </font>= <font color="#404040">0 </font>To <font color="#404040">100000 </font><font color="#000080">: </font><font color="#800000">TestMul</font><font color="#000080">(</font><font color="#404040">2</font><font color="#000080">, </font><font color="#404040">3</font><font color="#000080">) : </font>Next
Debug <font color="#804000">"Normal: "</font><font color="#000080">; Timer - </font><font color="#800000">t#
t# </font>= <font color="#000080">Timer
</font>For <font color="#800000">i% </font>= <font color="#404040">0 </font>To <font color="#404040">100000 </font><font color="#000080">: </font><font color="#800000">TestMul2</font><font color="#000080">(</font><font color="#404040">2</font><font color="#000080">, </font><font color="#404040">3</font><font color="#000080">) : </font>Next
Debug <font color="#804000">"Naked: "</font><font color="#000080">; Timer - </font><font color="#800000">t#
</font>Proc <font color="#800000">TestMul</font><font color="#000080">(</font><font color="#800000">x </font><font color="#000080">As </font>Int<font color="#000080">, </font><font color="#800000">y </font><font color="#000080">As </font>Int<font color="#000080">)
</font>Local <font color="#800000">tmp </font>As Int<font color="#000080">, </font><font color="#800000">s </font>As String = <font color="#804000">"Something"
</font><font color="#800000">tmp </font>= <font color="#800000">x </font><font color="#000080">Mul </font><font color="#800000">y
</font>EndProc
Proc <font color="#800000">TestMul2</font><font color="#000080">(</font><font color="#800000">x </font><font color="#000080">As </font>Int<font color="#000080">, </font><font color="#800000">y </font><font color="#000080">As </font>Int<font color="#000080">) </font>Naked
Local <font color="#800000">tmp </font>As Int<font color="#000080">, </font><font color="#800000">s </font>As String = <font color="#804000">"Something"
</font><font color="#800000">tmp </font>= <font color="#800000">x </font><font color="#000080">Mul </font><font color="#800000">y
s </font>= <font color="#804000">""
</font>EndProc
</pre><p>The measured time for calling TestMul() and TestMul2() a 10000 times is</p><p>TestMul: ca 0.021 seconds<br>TestMul2: ca 0.019 seconds. </p><p>In this example, the time to execute the naked procedure is almost the same as executing the regular procedure. Adding a dynamic variable – and assigning it a value - to a naked procedure negates the benefit almost entirely. The code to execute is drastically increased, assigning a value to a string causes the execution of <em>malloc()</em> and <em>memcopy(),</em> and these take so much time the advantage of naked is almost gone. In addition, the string must be released which leads to an extra call of <em>mfree()</em>. All in all, just by adding one dynamic variable the procedure contains too much code to really benefit from <strong>Naked</strong>.</p><p><strong>Other issues</strong><br>Another disadvantage of using <strong>Naked</strong> is the issue of runtime error trapping. In case of an error the IDE stops running the program and puts the the error-line-marker on the line that calls the procedure and not inside the naked procedure. </p><p>A non-naked, regular procedure will not only trap the error, but also clears the contents of the (dynamic) local variables automatically. With naked-procedures the dynamic variables must be released explicitly. The local variables can be released using the following commands.</p><strong>
</strong><table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top"><strong>Local dynamic variable </strong></td><td valign="top"><strong>Release command</strong> </td>
</tr>
<tr>
<td valign="top">String</td>
<td valign="top">s$ = “” or <strong>Clr</strong> s$</td>
</tr>
<tr>
<td valign="top">Variant</td>
<td valign="top">var = Empty</td>
</tr>
<tr>
<td valign="top">Object (any COM)</td>
<td valign="top"><strong>Set</strong> obj = <strong>Nothing</strong></td>
</tr>
<tr>
<td valign="top">Hash</td>
<td valign="top"><strong>Hash Erase</strong> hs[]</td>
</tr>
<tr>
<td valign="top">Array (not allowed, unless static) </td>
<td valign="top">If static: <strong>Erase</strong> ar()</td>
</tr>
</tbody>
</table>
<p>A local array cannot be used in a naked-procedure. A local array declaration allocates an array-descriptor plus the memory required to store the array elements. Using the <strong>Erase</strong> command on a local array only releases the memory for the data, not the array-descriptor. Each time the procedure is executed a new descriptor is allocated without being released. Consequently, the program will leak memory. If you need a local array it must be static, then the descriptor is allocated only once. This is not a problem in regular procedures, of course.</p><p><strong>Conclusion</strong><br>Only short procedures that don’t use local dynamic variables are candidates for the <strong>Naked</strong> attribute.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-61342999457267368902020-08-27T10:02:00.001+02:002020-08-27T10:02:40.455+02:00New features: my personal top 5<p>The past years GFA-BASIC 32 received some updates; bugs were fixed and new IDE features were added. If you checkout the readme25.rtf file that comes with the updates you might be overwhelmed by the number of (small) new features. To help you find your way I discuss my personal top 5 of the new IDE additions.</p><p><strong>5 Print a Procedure</strong><br>In a large program with many subroutines it is likely you want to print a single procedure rather than the entire program. To print the current subroutine – the one that contains the caret - choose the Procs button on the toolbar and select Print:</p><p><img src="data:image/png;base64,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"></p><p>After selecting Print you will be presented the Windows Print dialog to select a printer and other options. Note that this is another fix, since the original GB only printed to the default printer.</p><p><strong>4 Run As Exe</strong><br>When developing a (new) program you should test the EXE version of the program on a regular basis. To make the process of compiling and testing a lot easier the toolbar offers the Run As Exe button. This button is enabled for a normal program and disabled when the editor contains a GLL or LG32. When you select the Run As Exe button the program is saved and compiled to exe. The first time you will be presented with the GFA-BASIC’s compile dialog box to specify the name and icon for the exe. If the program is compiled before and the exename is already specified the code is compiled with that name immediately and the dialog box is not shown. Also note that the dialog box contains a default icon for the exe. </p><p><img src="data:image/png;base64,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"></p><p>When the compiling process did not generate any errors the EXE is executed directly. However, before executing the presence and version of of the GfaWin23.ocx runtime in the program’s directory is checked. In case there is a newer version of the runtime or if it is missing a message box will popup to inform you about the copying of the GfaWin23.ocx to the program’s directory. These days a DLL is no longer placed in the System32 directory, but accompanies the EXE in its own directory.</p><span lang=""><p>The new default icon for a GFA-BASIC standalone EXE contains 9 images to conform to the latest SDK requirements. A full set of icons includes images for 16x16, 32x32, 48x48, and 256x256. Windows selects the appropriate icon for the current DPI and Explorer View setting. The icons are taken from the multi-image <em>app.ico</em> file, which is located in the GFA-BASIC directory and is loaded when a program is compiled for the first time. The app.ico adds a resource of 41 KB to your program. Of course, a different .ico file can be loaded, but you should make sure to conform to UI-guidelines; an .ico format file of 766 Bytes is no longer the standard. Note - You can also use app2.ico (only 4 KB) from the GFA-BASIC directory which holds the same images but in a packed format. We did not encounter any problems with the packed version so far, so you could try it instead.</p><span lang=""><p>To support visual styles in your own programs the EXE must include a manifest file, either as a resource or as a stand-alone file. <span lang="">When Add Manifest Resource is checked the <em>GfaWin32.exe.manifest</em> is included as a resource after compiling automatically<em>. </em>The checkbox is only checked if the IDE is run with a manifest file. The checkbox setting isn’t stored in the program and is reset each time. To prevent the automatic inclusion of the manifest resource you should include the <b>$ManifestOff </b>directive in your code.</span></p></span></span><p><strong>3 Insert miscellaneous text</strong> <br>Sometimes you want to store the program’s name and date into a comment line. By pressing <strong>App+I</strong> a popup menu appears that allow you to insert several kinds of information into the program’s code. These are the possible text items:</p><p><img src="data:image/png;base64,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"></p><p>To easily insert the current procname into the code you can also use <strong>App+P</strong>. Inserting a procedure’s name is useful when displaying an error message box in a <strong>Try/Catch</strong> handler. The gfawinx function <em>ErrMsg()</em> is created with this feature in mind. <em>ErrMsg</em> returns the relevant properties of the <strong>Err</strong>-object in a single string ready to be displayed in a message box (see gfawinx.g32 in the Include directory for more info). The following picture shows when to press <strong>App+P</strong> to insert the proc’s name:</p><p><img src="data:image/png;base64,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"></p><p><strong>2 Grouping procedures</strong><br>Actually this feature is my favorite, but I don’t use it as often as my number 1 favorite. <span lang="">To get a better overview of a large code file the procedures and functions can be grouped in collapsible groups. For this to happen a new editor command <b>$Group </b>has been implemented. To collect a series of procedures into a group add the <b>$Group </b>"title" statement just above a procedure in your code. As a result, the Procs tab in the sidebar will contain a collapsible group named “title” holding all procedures until the next <b>$Group </b>statement. A group can be removed by typing <b>$GroupOff </b>at the line with the <b>$Group </b>statement.</span></p><p><img src="data:image/png;base64,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"></p><p><span lang="">The picture above shows my grouping in the GfaWin32.gll program. Grouping allows me to collect related procedures into one section. It makes navigating the code very simple. <br>By right clicking in the Procs-tab listview you can fine tune the displaying of groups. For instance, the grouping can be (temporarily) disabled to display the procedures in the default manner. By default, groups outside the current the group are collapsed. This automatic collapsing of non-active groups can be disabled. </span></p><p><span lang=""><span lang="">
Hoovering over a procedure name (a Procs Listview-item) brings up a scrollable tooltip<i>.</i> The tooltip displays the code of that Proc. Use the mousewheel to show more or less lines. This also works in the editor. Hoover the mouse over a procedurename and Proc-PeekView pops up.</span></span></p><p><strong>1 Edit history</strong><br>My number one feature is Edit History, simply because I use it all the time without even realizing it. Edit History works in the background and saves the line last edited to the top of a stack. By using <strong>Esc</strong> or <strong>Ctrl+minus</strong> or the toolbar button <strong><</strong> you are taken back to the lines you just edited. When stepping backwards, the steps are saved in a ‘forward stack’ so you can return easily to the last edited line using <strong>Ctrl+Shift+minus</strong>, or by clicking the appropriate <strong>></strong> button in the toolbar.<br>The toolbar button for walking back has a collapsible menu that shows the line numbers and procnames you last edited. This way you can easily jump back to some line previously stored on the stack.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-92093170602284137612020-07-27T11:51:00.001+02:002020-07-27T11:51:22.906+02:00Where are variables stored?<p>In the past months I got some questions that are perfectly suited for a blog post. One of those questions expressed a curiosity in the storage location of variables. In other words, where are the variables stored?<br>The location of variables depends on several things. First, there are global and local variables and they are handled differently. Second, there are non-dynamic variables – like simple numeric data types - and dynamic variables like strings, arrays and objects.</p><p><strong>Global variables</strong><br>To the compiler a variable name references a memory address. The declaration statements like <strong>Dim</strong> and <strong>Global</strong> enter the specified variable name(s) into a database which holds information about the declared global variables. At the same time, the compiler allocates some memory for the variable and when the compiler encounters the same variable again the variable is replaced by its memory address.</p><p>The compiler allocates a <em>data section </em>to store the global variables. When more global variables are entered in the database the data section will grow. When a program is run inside the IDE the compiler uses a simple <em>malloc</em> to allocate the data section. When a program is compiled to EXE the data section is saved with the EXE.</p><p>The amount of memory reserved for a variable depends on its data type. A Long (Integer32) variable is assigned a block of 4 bytes, a Word variable gets 2 bytes, etc. The following table describes the amount of memory that is reserved for non-dynamic variables.</p><strong>
</strong><table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top"><strong>Non-dynamic type </strong></td><td valign="top"><strong>Memory requirement</strong> </td>
</tr>
<tr>
<td valign="top">Bool</td>
<td valign="top">1 byte</td>
</tr>
<tr>
<td valign="top">Byte</td>
<td valign="top">1 byte</td>
</tr>
<tr>
<td valign="top">Word, Card</td>
<td valign="top">2 bytes</td>
</tr>
<tr>
<td valign="top">Integer</td>
<td valign="top">4 bytes</td>
</tr>
<tr>
<td valign="top">Single</td>
<td valign="top">4 bytes</td>
</tr>
<tr>
<td valign="top">Double</td>
<td valign="top">8 bytes</td>
</tr>
<tr>
<td valign="top">Currency</td>
<td valign="top">8 bytes</td>
</tr>
<tr>
<td valign="top">Date</td>
<td valign="top">8 bytes</td>
</tr>
<tr>
<td valign="top">Large</td>
<td valign="top">8 bytes</td>
</tr>
<tr>
<td valign="top">String * n</td>
<td valign="top">n bytes</td>
</tr></tbody>
</table><p>The location of a variable of a primary data type can be obtained with <strong>VarPtr, ArrPtr, V:</strong>, or the <strong>*</strong> – operator. These functions return the fixed memory address of the global variables. The contents of the global data section is cleared so that the value of each variable is zero.</p><p>The dynamic variables allocate their desired memory at runtime, for instance a string is dynamically allocated when it is assigned a value. However, for the compiler to handle a string it must be entered in the database and have some memory address assigned to it. In general, dynamic variables are assigned a Long (4 bytes) in the global data section to store the address of the – at runtime - dynamically allocated memory. This is also called a <em>pointer</em>. The data of a dynamic variable is stored elsewhere, not at the variable’s memory address. To obtain the storage address of the pointer use <strong>ArrPtr</strong> or the <strong>* </strong>– operator. The location of the data is only known at runtime and can be obtained using <strong>VarPtr</strong> or <strong>V:</strong>. These functions actually read the memory address returned from <strong>ArrPtr</strong>. <br>An OCX or Object variable receives a 4 byte pointer in the global data section and is initially zero (Nothing). The <strong>VarPtr</strong> function does not return the address of the object, but the location of the Object variable like <strong>ArrPtr</strong>.</p><p>An array is handled differently. A global array allocates an array descriptor with a size of 124 bytes in the global data section which contains information about the data type, number of dimensions (if specified in the declaration) and upper and lower bounds. The address of the descriptor can be obtained with <strong>ArrPtr</strong>, the actual memory locations of the array’s elements can be obtained with <strong>VarPtr</strong>. </p><p>The following table specifies the number of bytes required to store a pointer or descriptor for dynamic variables.</p><strong>
</strong><table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top"><strong>Variable type </strong></td><td valign="top"><strong> Memory requirement</strong></td>
</tr>
<tr>
<td valign="top">String</td>
<td valign="top">4 bytes</td>
</tr>
<tr>
<td valign="top">Array</td>
<td valign="top">124 bytes (descriptor)</td>
</tr>
<tr>
<td valign="top">Hash</td>
<td valign="top">8 bytes (descriptor: pointer + data type)</td>
</tr>
<tr>
<td valign="top">Object</td>
<td valign="top">4 bytes</td>
</tr>
<tr>
<td valign="top">Variant</td>
<td valign="top">16 bytes</td>
</tr>
</tbody>
</table>
<p>For all dynamic variables the runtime uses <em>malloc()</em> to obtain the required memory. The <em>malloc()</em> function uses the Windows API <em>HeapAlloc()</em>, so the data for the dynamic variables is stored on the heap.</p><p><strong>Local variables</strong><br>Almost the same can be told for local variables, except that they are stored on the stack. When the compiler encounters a local variable declaration it calculates the offset to the stack pointer, which is then entered in the variable-database. Any reference to a local variable is then replaced with this offset value. The location of a variable of a primary data type can be obtained with <strong>VarPtr, ArrPtr, V:</strong>, or the <strong>*</strong> – operator. These functions return the calculated absolute memory address – relative to the stack pointer - of the local variables at runtime.</p><p>The only difference with global variable creation is the local array declaration. The compiler does not reserve a 124 byte descriptor relative to the stack pointer, but only a 4-byte pointer. When the program is executing the <strong>Dim</strong> statement allocates the descriptor and the required array memory. An array declaration without specifying a dimension only allocates a dynamic descriptor of 124 bytes at runtime. Note that the <strong>Erase</strong> command only releases the array elements, the dynamically allocated array-descriptor is not released. This conforms to the functionality of <strong>Erase</strong> for a global array where the descriptor is static and stored in the global data section. </p><p>Note – In GFA-BASIC 32 versions before 2.52 the automatic release of local arrays and local hashes did not work and the program suffered from memory leaks. The local hash could be freed using <strong>Hash Erase</strong> though, but there was no way to free an array-descriptor. Since then, the automatic release of arrays and hashes is fixed.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-65348567138345898652020-04-30T12:16:00.001+02:002020-04-30T12:16:27.742+02:00Float to Integer–CInt & CintRZ<p>In the previous post <a href="http://gfabasic32.blogspot.com/2020/03/converting-float-to-integer.html">Converting float to integer</a> I discussed several possibilities to assign a floating-point value to an integer. The post discussed how the GFA-BASIC 32 compiler handles the different types of conversions; either with or without conversion functions. We saw that GB uses a default conversion that rounds to the nearest even number. When the fractional part of the number is exactly 0.5 the value is rounded down one time and up another time. For instance, 2.5 is rounded down to 2 and 3.5 is rounded up to 4. An application can change this behavior by using an explicit conversion function like <strong>Int()</strong>, <strong>Trunc()</strong>, <strong>Floor()</strong>, <strong>Round()</strong>, and <strong>QRound().</strong> The blog post did not discuss <strong>CInt()</strong> and <strong>CIntRZ()</strong>, new functions added to GB 32 to easily convert VB(A) and C/C++ code.</p><p><strong>CInt()</strong> converts and rounds to the nearest event number; the argument is converted using GB’s default setting of the FPU’s control register. Consequently, for floating-point arguments <strong>CInt()</strong> is equal to simply assigning a float to an integer:</p><pre>Dim <font color="#800000">i </font>As Int<font color="#000080">, </font><font color="#800000">f </font>As Float = <font color="#000080">-3</font><font color="#404040">.5
</font><font color="#800000">i </font>= <font color="#800000">f </font><font color="#006000">' assign directly, same as
</font><font color="#800000">i </font>= <font color="#000080">CInt(</font><font color="#800000">f</font><font color="#000080">) </font><font color="#006000">' explicit conversion, i becomes -4
</font></pre><p><strong>CIntRZ()</strong> rounds the argument down to zero and does what <strong>Trunc()</strong> does (for compatibility with C/C++). </p><pre>Dim <font color="#800000">i </font>As Int<font color="#000080">, </font><font color="#800000">f </font>As Float = <font color="#000080">-</font><font color="#404040">3.5
</font><font color="#800000">i </font>= <font color="#000080">CIntRZ(</font><font color="#800000">f</font><font color="#000080">) </font><font color="#006000">' round towards zero, i becomes -3
</font></pre><p><strong>A Variant argument</strong><strong><br></strong>The conversion functions like <strong>Int()</strong>, <strong>Trunc()</strong>, <strong>Floor()</strong>, <strong>Round()</strong>, and <strong>QRound()</strong> only accept numeric data types and variants for their arguments. The value passed is loaded into the FPU’s ST0 register and then rounded. (These functions also accept integer data types, but that won’t lead to anything useful.) <br>In case the argument is a variant it’s value is first converted to a floating-point data type (double), which is then loaded into ST0 and rounded. Since these standard GB functions now accept variants as well, the functions get to handle variants containing strings. The process is the same as with numeric variants, the variant-string must first be converted to a floating-point value as is required by these functions. This variant-string to double conversion uses the OLE function <em>VariantChangeTypeEx()</em> API from oleaut32.dll. The <em>VariantChangeTypeEx()</em> function handles coercions between the
fundamental types including numeric-to-string and string-to-numeric coercions. One of the parameters of this function is the LCID value to use for the coercion. A LCID value is the locale identifier and specifies how dates, times, and currencies are
formatted. The variant-string-to-double coercion uses the GFA-BASIC’s current LCID value. GB sets the LCID value to the user’s ‘Language and Regional’ settings when a program is started. For proper conversions the variant-string must contain a numeric value according to the locale settings. For instance, some European languages separate the integral and fractional part with a comma rather than a point. For instance, the following works with Dutch regional settings:</p><pre>Dim <font color="#800000">i </font>As Int<font color="#000080">, </font><font color="#800000">v </font>As Variant = <font color="#804000">"2,5"
</font><font color="#800000">i </font>= <font color="#000080">Trunc(</font><font color="#800000">v</font><font color="#000080">) </font><font color="#006000">' result is 2
</font></pre><p>If the variant v would contain a dot rather than a comma (“2.5”) the OLE conversion function ignores the dot and returns 25. </p><p>Note - you can change GFA-BASIC’s LCID value GB uses with the <strong>Mode Lang</strong> command.<br>Note - if you disabled the compiler setting <em>‘Don’t autoconvert numeric strings to values’</em> you could even pass a string data type to these standard GB functions. In this particular case the string is first copied to a hidden variant and then converted with <em>VariantChangeTypeEx()</em> to double. In most cases the compiler setting to <em>not autoconvert</em> is enabled (default setting) and the string data type is not accepted by the compiler for these functions.</p><p><strong>The arguments of CInt() and CIntRZ()<br>CInt()</strong> and <strong>CIntRZ()</strong> are capable of handling more data types than just numeric arguments as the other functions do. The documentation explicitly states that <strong>CInt()</strong> and <strong>CIntRZ()</strong> use an OLE function to convert the argument passed to the function. This is not entirely true, it depends on the data type of the argument. <em>The OLE conversion is only applied if the argument is not numeric, ie String or Variant.</em> For numeric arguments <strong>CInt()</strong> behaves exactly as the direct assignment of a float to an integer and <strong>CIntRZ()</strong> behaves exactly as <strong>Trunc()</strong>. </p><p>As said, on the lowest level <strong>CInt()</strong> and <strong>CIntRZ()</strong> only accept floating-point values. Consequently, a string or variant argument must first be converted to a double (the default data-type for these functions). For numeric-variants GB extracts the value (to load in ST0 for conversion to integer) exactly as it handles the non-variant numeric values. In other words, GB does not use an OLE conversion function to extract a numeric value from a variant to coerce it to the floating-point data type.</p><p><strong>Using a string argument</strong><br>Interesting enough, <strong>CInt()</strong> and <strong>CIntRZ()</strong> accept the string data type for input. Before these functions process the float-to-int conversion the string must be converted to a floating-point data type. Because of VB(A) compatibility the string must be converted according the ‘Language and Regional’ settings; the conversion must use the LCID value. GB accomplishes this by first copying the string to a hidden temporary variant and than call <em>VariantChangeTypeEx()</em> to convert to double as input for <strong>CInt()</strong> and <strong>CIntRZ()</strong>.</p><p><strong>CInt()</strong> and <strong>CIntRZ()</strong> complement the standard GB function <strong>ValInt()</strong>. <strong>ValInt()</strong>converts a string to an integer according the <strong>Mode Val</strong> setting, <strong>CInt()</strong> and <strong>CIntRZ()</strong> use the regional settings for conversion. This is true for all C* conversion functions (<strong>CFloat</strong>, <strong>CDbl</strong>, etc) taking a string as input, the string is converted using the regional settings.</p><pre><font color="#800000">i% </font>= <font color="#000080">ValInt(</font><font color="#804000">"2.5"</font><font color="#000080">) </font><font color="#006000">' = 2
</font><font color="#800000">i% </font>= <font color="#000080">CInt(</font><font color="#804000">"2,5"</font><font color="#000080">) </font><font color="#006000">' = 2
</font></pre>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0tag:blogger.com,1999:blog-19326029.post-52123842323948220792020-03-24T09:17:00.001+01:002020-03-24T09:17:09.289+01:00Converting a float to an integer<p>Without giving it another thought we often convert a floating-point value to an integer by simply assigning a float to an integer data type variable. We assume the compiler knows what’s best and we trust the compiler does the proper conversion for us. Time for a look behind the scenes.<p><strong>The FPU and the control register</strong><br>The FPU is independent of the main processor and contains its own set of registers to perform its task. The FPU registers include eight 80-bit data registers (ST0-ST7), and three 16-bit registers called the <em>control</em>, <em>status</em>, and <em>tag</em> registers. We will ignore the <em>status</em> and <em>tag</em> registers and focus on the <em>control</em> register which is used to access the features of the FPU. The <em>control</em> register controls the floating-point functions within the FPU. The control register uses a 16-bit register where each bit defines a specific setting such as the exceptions to produce, the precision the FPU uses to calculate floating-point values, and the method used to round the floating-point results. The bits are shown below:</p><p>
</p><strong>
</strong><table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top"><strong>Control bits </strong></td><td valign="top"><strong>Description</strong></td>
</tr>
<tr>
<td valign="top">0-5</td>
<td valign="top">Exception masks</td>
</tr>
<tr><td valign="top">6-7</td><td valign="top">Reserved</td></tr><tr>
<td valign="top">8-9</td>
<td valign="top">Precision control</td>
</tr>
<tr>
<td valign="top">10-11</td>
<td valign="top">Rounding control </td>
</tr><tr><td valign="top">12</td><td valign="top">Infinity control</td></tr>
</tbody>
</table>
<br>For the conversion from float to integer we are only interested in bits 10 and 11. The x87 FPU implements four rounding methods in hardware. The possible settings of the rounding control bits are as follows:
<p>00 - Round to nearest (even)
<br>01 - Round down, towards negative infinity
<br>10 - Round up, towards positive infinity
<br>11 - Round toward zero <p>The "Round to nearest (even)" method is used by default by GFA-BASIC 32, so there's a high chance you're already using it. The current rounding mode of the x87 can be obtained using the <strong>fstcw</strong> assembler command, as shown in the following sample:<p><pre><font color="#006000">' Status of bits 10 and 11 of control word
</font>Dim <font color="#800000">cf </font>As Word
. fstcw <font color="#000080">[</font><font color="#800000">cf</font><font color="#000080">]
</font>Debug <font color="#000080">Bin(</font><font color="#800000">cf </font><font color="#000080">%& </font><font color="#404040">%110000000000</font><font color="#000080">, </font><font color="#404040">2</font><font color="#000080">) </font><font color="#006000">' = 00
</font></pre><p>By default, GB clears both rounding bits and converts floating-point values to integers using the “Round to nearest (even)”. For this to happen, GB initializes the FPU with the value 0x372, which clears the rounding bits. The way of rounding can be changed and set to a new value by setting the control word to a new value using the <strong>fldcw</strong> instruction. GB changes the rounding bits when it rounds a floating-point value using one of the truncation/rounding functions like <strong>Int</strong>, <strong>Trunc</strong>, <strong>Floor</strong>, <strong>Ceil</strong>, etc. as we’ll see later in this post.<p>By default, the rounding control is set to rounding to the nearest (even) which seems to be correct for most calculations. However, this might cause an unexpected behavior, for instance 2.5 is not rounded to 3, but rounded to 2. The FPU prefers the nearest even value when the decimal part is exactly .5. For the same reason 3.5 is rounded to 4. This is useful in case of statistical analyzing where you want to spread numbers evenly when they are exactly in the middle of two integers. However, this might not always be what you want. For instance, by default C/C++ compilers always convert floating point values by truncating them down towards zero (cast to Int). <p>If you don’t care and if you are happy with the GB’s default rounding, you can easily convert a floating point value to integer by simply assigning the one to the other:<p><pre>Dim <font color="#800000">f </font>As Float = <font color="#404040">2.5</font><font color="#000080">, </font><font color="#800000">i </font>As Int
<font color="#800000">i </font>= <font color="#800000">f </font><font color="#006000">' assign float to int
</font>Debug <font color="#800000">i </font><font color="#006000">' = 2
</font></pre><p> This is the fastest possible conversion, it takes only one assembler instruction (<strong>fistp</strong>) to convert a floating point as shown in the disassembly (without the Debug command). See for more details of disassembling GB-code the blogpost <a href="http://gfabasic32.blogspot.com/2018/11/anatomy-of-procedure-1.html">Anatomy of a procedure</a>.<p><font face="Courier New" size="1">-------- Disassembly -----------------------------------<br>0 - (Sub Main) (Lines=2)<br>0559C350: B8 2E 00 00 00 mov eax,0x0000002E<br>0559C355: FF 15 40 1A 4D 00 scall INITPROC0 ; Ocx: $180277CB<br>0559C35B: F8 clc <br>0559C35C: FF 55 B4 call dpt -76[ebp] ; @Tron<br>0559C35F: C7 05 10 A7 5C 06 00 00 20 40 mov dpt [0x065CA710],0x40200000<br>0559C369: FF 55 B4 call dpt -76[ebp] ; @Tron<br><font color="#c0504d">0559C36C: D9 05 10 A7 5C 06 fld dpt [0x065CA710]<br>0559C372: DB 1D 14 A7 5C 06 fistp dpt [0x065CA714]</font><br>0559C378: 8B 4D F0 mov ecx,dpt -16[ebp]<br>0559C37B: 64 89 0D 00 00 00 00 mov dpt fs:[0x00000000],ecx<br>0559C382: 8B E5 mov esp,ebp<br>0559C384: 5D pop ebp<br>0559C385: 5B pop ebx<br>0559C386: 5F pop edi<br>0559C387: 5E pop esi<br>0559C388: C3 ret</font> <br><p>The interesting commands are <strong>fld</strong> and <strong>fistp</strong>. First <strong>fld</strong> loads the floating-point value into ST0 – the top of the stack - and then the <strong>fistp</strong> instruction pops the value off the floating-point stack. <strong>fistp</strong> converts it to an integer, and then stores it at the address specified. This instruction uses the rounding control settings to determine how they will convert the floating point data to an integer during the store operation. <p><a name="1000789"></a>There is one other assembler instruction that rounds to integer. The <strong>frndint</strong> instruction rounds the value in ST0 (the top of the stack) to the nearest integer using the rounding algorithm specified in the control register. The result remains in ST0 as a floating point value, it simply does not have a fractional component. GB uses the <strong>frndint</strong> instruction for its truncation functions <strong>Int(), Fix()</strong> and others. </p><p><strong>The truncation functions</strong><br>The function <strong>Trunc</strong> (or <strong>Fix)</strong> round towards zero. The <strong>Int</strong> (or <strong>Floor)</strong> function round towards negative infinity and <strong>Ceil</strong> rounds to positive infinity. Let’s start with the most often used truncation function <strong>Int(),</strong> or its synonym <strong>Floor(). </strong>We’ll use this simple program to look at it’s disassembly.</p><pre>Dim <font color="#800000">f </font>As Float = <font color="#404040">2.5</font><font color="#000080">, </font><font color="#800000">i </font>As Int
<font color="#800000">i </font>= <font color="#000080">Int(</font><font color="#800000">f</font><font color="#000080">) </font><font color="#006000">' truncate down to negative infinity
</font></pre><p>The disassembly of the <strong>Int()</strong> function (without the surrounding commands):</p><p><font face="Courier New">0559C4EC: D9 05 10 A7 5C 06 fld dpt [0x065CA710]<br>0559C4F2: D9 2D 1C 1A 4D 00 fldcw V_RNDMINUS<br>0559C4F8: D9 FC frndint<br>0559C4FA: D9 2D 14 1A 4D 00 fldcw V_RNDNEAR<br>0559C500: DB 1D 14 A7 5C 06 fistp dpt [0x065CA714]</font><br></p><p>First ST0 is loaded with the value in variable<em> f</em>, then the control word of the FPU is loaded with the value from a variable called V_RNDMINUS, which is 0x77. This value sets the rounding bits of the control word to %01. By executing <strong>frndint</strong> the value in ST0 is rounded to an integer using the setting “Round down towards negative infinity”. <strong>Int()</strong> rounds 2.5 to 2 and –2.5 to -3. After rounding, the control word is reset to the default value 0x372, which is stored in the runtime variable V_RNDNEAR. Finally, the value in ST0 is moved to the variable <em>i</em> with <strong>fistp</strong>, </p><p>Note Technically <strong>fld</strong> and <strong>fistp</strong> aren’t part of the <strong>Int()</strong> function. How a value ends up in ST0 depends on the code of the program. Similarly, <strong>fistp</strong> is only inserted if the result of <strong>Int()</strong> is to be stored in a variable. If <strong>Int()</strong> is used inside an expression the value remains in ST0.</p><p>In the same way you can create samples for the other truncation functions <strong>Trunc(), Fix(),</strong> and <strong>Ceil()</strong> and then examine their disassembly output. <strong>Trunc()</strong> and its synonym <strong>Fix()</strong> load the control word with the value stored in V_RNDZERO ( = 0xF72). This value sets the rounding bits to %11 to round towards zero. For <strong>Ceil()</strong> the rounding bits are set to %10, the value for the control word is obtained from the variable V_RNDPLUS ( = 0xB72), and <strong>frndint</strong> then rounds to positive infinity.</p><p><strong>The QRound function</strong><br>The <strong>QRound</strong> function is an addition to the truncation/rounding functions. The compiler generates only one instruction for this function: the <strong>frndint</strong> instruction to round the value in ST0. The compiler does not load the control word prior to executing the rounding. <strong>QRound</strong> uses the current control word setting (0x372) and “Round to nearest (even)”. <strong>QRound</strong> is useful inside a mathematical expression where some interim outcome needs to be rounded (converted) to integer using the current control word setting. Since the interim outcome remains in ST0 (without the fractional part) a (complex) expression can be evaluated more quickly. In short the steps for <em>variable = <strong>QRound</strong>(float)</em> are:</p><p><font face="Courier New">fld float<br>frndint<br>fistp variable</font></p><p>Again, <strong>fld</strong> and <strong>fistp</strong> are not part of the function itself. Since <strong>QRound</strong> is mostly used with the default control word setting rounding is the same as when a float is assigned to an integer variable directly, as demonstrated at the beginning of this blogpost.</p><p>Note that using the assembler instruction <strong>fldcw</strong> prior to <strong>QRound</strong> you can determine your own float-to-integer conversion. Do not forget to return the value of the control word back to 0x372 afterwards.</p><p><strong>Use Round for proper rounding</strong><br>The <strong>Round</strong> function generates the same assembler instructions as <strong>Int()</strong>. However before <strong>frndint</strong> is executed the value in ST0 is increased with 0.5. The value in ST0 is then rounded towards negative infinity. In short, these steps are:</p><p><font face="Courier New">fld value<br>fadd 0.5 / fldcw 0x772 / frndint / fldcw 0x372<br>fistp variable</font></p><p>If your program wants “proper rounding” it should use <strong>Round()</strong> to convert a floating-point value to an integer.</p>Sjouke Hamstrahttp://www.blogger.com/profile/17490567785357245752noreply@blogger.com0