Hi,

With all this talk about comments, I thought I would throw another 2¢ into
the conversation.

This is also useful for non components.

I love the fact that 4D now displays tooltips over your methods.  However,
sometimes the first few lines of the method are not too helpful.

If you have anything written in the comments section of the explorer these
are displayed instead (everyone should TURN OFF the automatic comment
feature immediately).

And if your code is in a component that is compiled, then only the Explorer
Comments are displayed.

Recently in Foundation I wrote a method to create comments based on the
method header comments found there.  This was only possible because of the
stick discipline Dave Batton used when creating these headers.

Does anyone else miss Dave B?

Anyway, to wind things up, why not write a 4D Method that reads those
headers and creates the Explorer comments for you?

Use a macro to create the header so it conforms to the pattern as you start
each header and then Bob's your uncle.

Here is what I use, you can modify it for your header pattern perhaps.

NB.  Make sure your code starts below the header.  I use 4D Pop macro to
declare my locals but the macro puts them at the first empty line, I just
need to reposition them to below the header manually.



Example Macro:

<macro name="FHead">
  <text>// ----------------------------------------------------
  // Project Method: <method_name/> --> ReturnType

  // Description

  // Access: Shared

  // Parameters:
  //   $1 : Type : Description
  //   $x : Type : Description (optional)

  // Returns:
  //   $0 : Type : Description

  // Created by Wayne Stewart (<date format="9"/>)
  //     [email protected]
  // ----------------------------------------------------
  </text>
</macro>




Code:

  // ----------------------------------------------------
  // Project Method: FW_WriteComments {(Method Name; Do not use)}

  // This method will create documentation comments
  //   it is based on the assumption that you format your
  //    method header comments in the same manner as Foundation
  //  The first paramater is just used to trigger the method
  //   starting in a new process, you should not pass this parameter

  // Access: Shared

  // Parameters:
  //   $1 : Text : Either pass "" to do all methods or a specific method
name
  //   $2 : Longint : Do not use this

  // Created by Wayne Stewart
  // ----------------------------------------------------

If (False)  //  Copy this to your Compiler Method!
  C_TEXT(FW_WriteComments ;$1)
  C_LONGINT(FW_WriteComments ;$2)
End if

C_TEXT($1)
C_LONGINT($2;$ProcessID_i;$StackSize_i;$NumberOfMethods_i;$CurrentMethod_i;$Position_i)
C_TEXT($MethodCode_t;$FirstChars_t;$MethodName_t)

ARRAY TEXT($MethodNames_at;0)
ARRAY TEXT($MethodCode_at;0)
ARRAY TEXT($MethodComments_at;0)

$StackSize_i:=0

If (Count parameters=2)

  METHOD GET PATHS(Path project method;$MethodNames_at)

  $MethodName_t:=$1

  If (Length($MethodName_t)>0)  //  A method name or prefix has been
specified

    $NumberOfMethods_i:=Count in array($MethodNames_at;$MethodName_t)

    If ($NumberOfMethods_i=1)  // exactly one match (use this specific
method)
      ARRAY TEXT($MethodNames_at;0)
      APPEND TO ARRAY($MethodNames_at;$MethodName_t)
    Else

      $NumberOfMethods_i:=Size of array($MethodNames_at)
      For ($CurrentMethod_i;$NumberOfMethods_i;1;-1)  // Go Backwards
        If ($MethodNames_at{$CurrentMethod_i}=($MethodName_t+"@"))
        Else
          DELETE FROM ARRAY($MethodNames_at;$CurrentMethod_i)
        End if

      End for

    End if



  End if

  $NumberOfMethods_i:=Size of array($MethodNames_at)

  METHOD GET CODE($MethodNames_at;$MethodCode_at)

  ARRAY TEXT($MethodComments_at;$NumberOfMethods_i)

  For ($CurrentMethod_i;1;$NumberOfMethods_i)
    $MethodCode_t:=$MethodCode_at{$CurrentMethod_i}

    $Position_i:=Position("comment added and reserved by
4D.\r";$MethodCode_t)

    $MethodCode_t:=Substring($MethodCode_t;$Position_i+Length("comment
added and reserved by 4D.\r"))

    $MethodCode_t:=Replace string($MethodCode_t;"\r  // Access:
Shared\r";"")
    $MethodCode_t:=Replace string($MethodCode_t;"  //
----------------------------------------------------\r";"")
    $MethodCode_t:=Replace string($MethodCode_t;"//
----------------------------------------------------\r";"")

    $MethodCode_t:=Replace string($MethodCode_t;"  // Project Method: ";"")
    $MethodCode_t:=Replace string($MethodCode_t;"// Project Method: ";"")

    $MethodCode_t:=Replace string($MethodCode_t;"  // ";"")
    $MethodCode_t:=Replace string($MethodCode_t;"// ";"")

    $Position_i:=Position("Created by";$MethodCode_t)

    $MethodCode_t:=Substring($MethodCode_t;1;($Position_i-3))

    $FirstChars_t:=Substring($MethodCode_t;1;2)
    While ($FirstChars_t="\r\r")
      $MethodCode_t:=Substring($MethodCode_t;2)
      $FirstChars_t:=Substring($MethodCode_t;1;2)
    End while

    $MethodComments_at{$CurrentMethod_i}:=$MethodCode_t


  End for

  METHOD SET COMMENTS($MethodNames_at;$MethodComments_at)

Else

  If (Count parameters=1)
    $MethodName_t:=$1
  Else
    $MethodName_t:=""
  End if

    // This version allows for any number of processes
    // $ProcessID_i:=New Process(Current method name;$StackSize_i;Current
method name;0)

    // On the other hand, this version allows for one unique process
  $ProcessID_i:=New process(Current method name;$StackSize_i;Current method
name;$MethodName_t;0;*)

  RESUME PROCESS($ProcessID_i)
  SHOW PROCESS($ProcessID_i)
  BRING TO FRONT($ProcessID_i)
End if


​Finally,

Here is an example comment​ from Cannon's excellent Object module, I
rewrote the headers so I it would work:

OBJ_Get_Real (Object; Key) --> Real

Returns a Real value.

Access: Shared

Parameters:
$1 : Object : The Object we are accessing
$2 : Text : The key we are accessing

Returns:
$0 : Real

And:​

OBJ_Set_Real (Object; Key; Real)

Creates or updates a key with the passed in value

Access: Shared

Parameters:
$1 : Object : The Object we are accessing
$2 : Text : The key we are accessing
$3 : Real : The Real to set​​​​

​Regards​,

Wayne


--
Wayne Stewart
**********************************************************************
4D Internet Users Group (4D iNUG)
FAQ:  http://lists.4d.com/faqnug.html
Archive:  http://lists.4d.com/archives.html
Options: http://lists.4d.com/mailman/options/4d_tech
Unsub:  mailto:[email protected]
**********************************************************************

Reply via email to