Page 2 of 2

Re: [BASIC] Object-Oriented Programming

PostPosted: Wed Feb 13, 2019 5:57 pm
by eminkovitch
Hello!

Now that I've coded successfully :bravo: using the object-oriented methodology, naturally a question arises :?: - can I export classes so that they can be shared between applications? It seems that copying and pasting a class into MyMacros / Standard library, where subs and functions are visible to all applications, does not work for classes. Can anyone share any insight on this?

Thanks in advance,
Eliot

Re: [BASIC] Object-Oriented Programming

PostPosted: Wed Feb 13, 2019 6:19 pm
by Zizi64
Can you upload your sample code here??

Re: [BASIC] Object-Oriented Programming

PostPosted: Wed Feb 13, 2019 6:25 pm
by eminkovitch
This is a class that works inside a CALC application, I am looking to make it available to all CALC applications:
Code: Select all   Expand viewCollapse view
REM ****************************************************************************
REM *** Class Cell Annotations
REM ***
REM *** Purpose: (a) Creates comments in a selected CALC cell
REM ***          (b) deletes a comment from selected CALC cell
REM ***
REM *** Parent Class: PracticeTime
REM *** Child Class(es): N/A
REM ***
REM ****************************************************************************

Option Compatible
Option ClassModule

Option Explicit


REM ============================================================================
REM === Private variables

private _AnnotationText as string


REM ============================================================================
REM === Constructor & Destructor
REM ===

private sub Class_Initialize()
   _AnnotationText = getCellComment()
end sub

private sub Class_Terminate()
   _AnnotationText = ""
end sub


REM ============================================================================
REM === Set private variables

Public Property Let AnnotationText (ByVal pValue As String)
   _AnnotationText = pValue
End Property


REM ============================================================================
REM === Get private variables

Public Property Get AnnotationText As String
   AnnotationText = _AnnotationText
End Property


REM ============================================================================
REM ===  Public  Methods
REM ===

REM ----------------------------------------------------------------------
REM --- Set text, shape, transparency and color of _Annotation (comment)
REM ---   for a selected cell
REM --- Project# P002m
REM ---
public Sub setCellComment
   
   dim oDoc,oSheet,oCell,oCellAddr,oAnnotations,_
      oAnnotation,oAnnotationShape as object
   dim lenComment,widthBox as integer
   
   oDoc = ThisComponent 
   oSheet= oDoc.getcurrentcontroller.activesheet
   oCell = oDoc.getCurrentSelection

   lenComment = len( _AnnotationText )
   
   if lenComment > 0 then
   
      select case lenComment
         case > 501:
            widthBox = 12000
         case 251 to 500:
            widthBox = 10000
         case 101 to 250:
            widthBox = 8000
         case 51 to 100:
            widthBox = 6000
         case 0 to 50:
            widthBox = 4000
      end select
      
      oCellAddr = oCell.getCellAddress
      oAnnotations = oSheet.getAnnotations
      
      '/Create a new _Annotation to the active cell
      oAnnotations.insertNew(oCellAddr, _AnnotationText)
      
      '/Get the newly created _Annotation for modify properties
      oAnnotation = oCell.getAnnotation
      
      '/Set it "allways visible":
      oAnnotation.setIsVisible false

      '/Set color, transparence, fill style, inner margin
      oAnnotationShape = oAnnotation.getAnnotationShape
      oAnnotationShape.FillBackground = True
      oAnnotationShape.FillColor = RGB(251, 246, 99)
      oAnnotationShape.FillStyle = 1 '(0: nothing; 1: solid color; 2: gradient; 3: lined)
      oAnnotationShape.FillTransparence = 15
      
      oAnnotationShape.TextLeftDistance  = 200
      oAnnotationShape.TextLowerDistance = 200
      oAnnotationShape.TextRightDistance = 200
      oAnnotationShape.TextUpperDistance = 200
      
      '/Set size of the _Annotation
      Dim aSize As New com.sun.star.awt.Size
      asize.Height = 1000
      asize.Width  = widthBox
      oAnnotationShape.Size = asize
      oAnnotationShape.SizeProtect = False
      
      '/Set absolute position of the _Annotation
      'Dim apoint As New com.sun.star.awt.Point
      'apoint.x = 1000
      'apoint.y = 1000
      
      'oAnnotationShape.setPosition apoint
   else
      deleteComments
   end if

End Sub


REM ============================================================================
REM ===  Private  Methods
REM ===

REM ----------------------------------------------------------------------
REM --- Read the _Annotation from selected cell
REM ---
private function getCellComment()
   getCellComment = ThisComponent.getCurrentSelection().getAnnotation().string
end function

private sub deleteComments
   dim document   as object
   dim dispatcher as object
   document   = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   dim args1(0) as new com.sun.star.beans.PropertyValue
   args1(0).Name = "Flags"
   args1(0).Value = "N"
   dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args1())
end sub

Re: [BASIC] Object-Oriented Programming

PostPosted: Thu Feb 14, 2019 1:34 am
by JeJe
If you mean you want the class instance to be available from another library - you can put a function in a neighbouring module in the library where the class module is. Something like:

function getClassModuleInstance()
dim classinstance as new yourclassname
getClassModuleInstance = classinstance
end function

then you can call it from code in another library with:

classinstance= getClassModuleInstance()

(this is already asked/discussed earlier in this thread)