Basic - übergreifende Variablen

Hallo,

Ich versuche im Prinzip folgendes mit einem im Dokument (d.h. nicht
LibreOffice global) gespeicherten Makro:

Private var1

sub sub1
  var1 = "blablabla"
  ....
end sub

sub sub2
  xxx = var1
  ....
end sub

sub1 wird beim Ereignis "Neues Dokument" aufgerufen und lädt eine
Variable var1

sub2 wird später (z.B. nach dem Speichern oder beim Verlassen des
Dokuments) über ein Ereignis aufgerufen und wertet die zuvor gesetzte
Variable aus.

Das Problem:
var1 wird in sub1 richtig geladen. Später beim Aufruf von sub2 ist sie
aber immer leer. Alle meine Versuche (auch mit Public oder Global) haben
fehlgeschlagen, auch ein Umgehungsversuch mit einer STATIC variablen in
einer Hilfs-Subroutine

Vielen Dank für tipps.

mfg
Helmut

Hallo Helmut,

aus meiner Basic-Zeit meine ich noch zu wissen:

PRIVAT = Variable bleibt nur in dem Programmteil erhalten, indem
Sie mit einem Wert belegt wird, hier SUB1. Wird SUB1 beendet (END
SUB) wird die Variable leer (undefiniert).

STATIC = Variable ist statisch und wird einmalig mit einem Wert
belegt und kann dann nicht mehr verändert werden.

Hallo Helmut

Hallo,

Ich versuche im Prinzip folgendes mit einem im Dokument (d.h. nicht
LibreOffice global) gespeicherten Makro:

Private var1

sub sub1
  var1 = "blablabla"
  ....
end sub

sub sub2
  xxx = var1
  ....
end sub

sub1 wird beim Ereignis "Neues Dokument" aufgerufen und lädt eine
Variable var1

sub2 wird später (z.B. nach dem Speichern oder beim Verlassen des
Dokuments) über ein Ereignis aufgerufen und wertet die zuvor gesetzte
Variable aus.

Das Problem:
var1 wird in sub1 richtig geladen. Später beim Aufruf von sub2 ist sie
aber immer leer. Alle meine Versuche (auch mit Public oder Global) haben
fehlgeschlagen, auch ein Umgehungsversuch mit einer STATIC variablen in
einer Hilfs-Subroutine

Das Problem kenne ich. Alle Basic Routinen werden Beendet,
wenn kein Makro mehr läuft.
Dadurch werden auch alle Variablen aus dem Speicher gelöscht.
Das hat den Vorteil, dass kein zusätzlicher Arbeitsspeicher verbraucht wird.

Wenn du eine Variable später wieder Brauchst,
so musst du sie irgendwo zwischenspeichern.
entweder, du speicherst sie irgendwo im Dokument
(z.B. in einem Versteckten CalclSheet), oder in einer temporären Datei,
oder aber einfach in den UserDefinedProperties des Dokuments.

ich habe dir dazu mal zwei nützliche Funktionen geschrieben.

Zum speichern eines Wertes kannst du die Funktion "set_UDPropertyValue" verwenden.
Um dann den Wert wieder auszulesen, kannst du
die Funktion "get_UDPropertyValue" verwenden.

Sub main
If set_UDPropertyValue("sString" ,"Hallo")Then
  MsgBox get_UDPropertyValue( "sString")
else
   MsgBox "Falscher Wert für diese Property"
   'Wird ausgegeben, falls das PropertyValue Schon existiert,
   'und dafor einen anderen Datentyp hatte:
   'Z.B. "double2" War 6,258 (Also ein double wert9
   'Versucht man ihm nun den Wert "Hallo" (also einen string zuzuweisen),
   ' so geht das natürlich nicht.
end if
End sub

Function set_UDPropertyValue(sProperty AS String , vValue as Variant)As Boolean
Dim oUDP As Object
Dim i as Integer
dim aProps
Dim bHasProperty as Boolean
oUDP=ThisComponent.DocumentProperties.getUserDefinedProperties

  aProps()=oUDP.getPropertyValues
  For i=0 To ubound(aProps())
    If aProps(i).Name= sProperty Then
      bHasProperty=True
      Exit for
    end if
  Next
  If bHasProperty then
    On Error goto error_handler
    oUDP.setPropertyValue( sProperty, vValue)
  Else
   oUDP.addProperty( sProperty ,0, vValue)
  End if
set_UDPropertyValue=True

Exit function
error_handler:
set_UDPropertyValue=False
End Function

Function get_UDPropertyValue(sProperty AS String) As Variant
Dim oUDP As Object
Dim i as Integer
dim aProps
Dim bHasProperty as Boolean
oUDP=ThisComponent.DocumentProperties.getUserDefinedProperties
  aProps()=oUDP.getPropertyValues
  For i=0 To ubound(aProps())
    If aProps(i).Name= sProperty Then
      bHasProperty=True
      Exit for
    end if
  Next
  If bHasProperty then
    get_UDPropertyValue=oUDP.getPropertyValue(sProperty)
  Else
    get_UDPropertyValue="No such Property"
  end if
end Function

Gruß Frieder

Hallo Frieder,

ausprobiert -> funktioniert -> kann ich sehr gut gebrauchen !
Welch ein genialer Hinweis !

Gruß Achim

Hallo Frieder,

das mit den Properties ist eine geniale Idee. Das wäre mir nie eingefallen.

Vielen Dank noch mal
Helmut