Aufruf von Funktionen schlägt fehl

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Aufruf von Funktionen schlägt fehl

Toxitom - Du hast recht! Danke :D

von keyboard-billy » Do, 01.03.2007 15:07

@Toxitom

Hi Thomas,

mir fliegt das Blech weg! Das is'n Ding ! Ohauerha - daran wär ich im Leben nicht d'rauf gekommen :oops: .

Vielleicht liegt's daran, dass ich Dein Buch "Makros in OpenOffice.org 2.0" noch nicht ganz gelesen habe :roll: . Übrigens ein klasse Buch, sehr zu empfehlen :!:

Aber vielleicht kannst Du dieses Problem in der nächsten Auflage gleich mit ins Kapitel 1.2 aufnehmen :?:

Du hast natürlich absolut recht:
Ich hab' mir bereits einen Teil des DevelopersGuide reingezogen und da steht's ja auch geschrieben, dass praktisch alles ab dem Desktop ein Objekt - ggf. mit Unterobjek(en) ist(sind). Somit ist natürlich klar, dass ein Modul ebenfalls ein Objekt sein muss. Und das darf natürlich nicht den gleichen Namen wie eine verwendete Variable haben.
Aber wenn man so davor sitzt, denkt man im ersten Moment nicht daran...

Ich glaub , das wird mir nun nicht mehr so schnell passieren :oops:

Herzlichen Dank für Deine schnelle Hilfe - jetzt kann ich wenigstens mit meinem Projekt weitermachen.

P.S.: Ich verwende OOo 2.1 auf W2k SP4 und XP SP2

Viele Grüsse,
keyboard-billy

von Toxitom » Do, 01.03.2007 14:31

Hey Billy,
Vielleicht hast Du ja noch 'nen heißen Tipp für mich?
Leider nein, zu dem es eigentlich korrekt ist und funktionieren müsste (tut es übrigens bei mir auch....)

Bleibt die Frage: Welches BS verwendest du, welche OOo Version?

Viele Grüße
Thomas

Edit: Doch einen Fehler gefunden! Du hast ja die Variabennamen doppelt verwendet - dann kann es nicht gehen! Die Module kanst du natürlich nicht genauso benennen wie deine Funktionen, Module sind Objekte und das ist spätestens bei Modulübergreifenden Funktionen ein Namenskonflikt!
Nenn mal Dein Modul "printGreetz" in "Mod_printGreetz" um, dann funktioniert es auch bei dir :-)

@Toxitom - Leider auch kein Erfolg :-(

von keyboard-billy » Do, 01.03.2007 12:54

@Toxitom

Hallo Thomas,

ich hab' Deinen Vorschlag befolgt. Im Stepmodus wir die Variable documentName$ nicht belegt.

Stellt man die Sub und die Functions in ein Modul, dann wird die Variable belegt und alles läuft optimal.

Ich hab' nun einen einfacheren Test gemacht:
Zunächst hab ich ein Modul names "printGreetz" mit folgendem Code erstellt:

Code: Alles auswählen

Option Explicit

Sub test1
 MsgBox (printGreetz$("Billy"), 0, "test1")
End Sub

Function printGreetz$(name$)
  name$ = "Hallo " & name$ & "!" & chr$(13) & _
          "Wie geht's?"
  printGreetz$ = name$
End Function
Wenn ich die Sub starte erhalte ich ein Korrekte Ausgabe :D :

Bild

Als nächstes habe ich das Modul "printGreetz" auf folgenden Code reduziert:

Code: Alles auswählen

Option Explicit

Function printGreetz$(name$)
  name$ = "Hallo " & name$ & "!" & chr$(13) & _
          "Wie geht's?"
  printGreetz$ = name$
End Function
... und den Aufruf der Funktion printGreetz$() über die Sub test1 in ein extra Modul namens "Module1" kopiert:

Code: Alles auswählen

Sub test1
 MsgBox (printGreetz$("Billy"), 0, "test1")
End Sub
Ich starte nun Sub test1. Anschließend passiert folgendes:

Bild

... nach betätigen des OK-Buttons :x :

Bild

Something strange seems to be happen .... :evil:

Vielleicht hast Du ja noch 'nen heißen Tipp für mich?

Greets,
keyboard-billy

von keyboard-billy » Do, 01.03.2007 11:37

@stbuerg

also, es geht in diesem Thread nicht um die Frage, wie man Funktionen behandelt und warum.

Aber zu Deiner Info: Die Funktion hat ja einen ÜbergabeParameter - nämlich den Dateinamen eines bestimmten Dokumentes.
Wenn ich in meinem Programmablauf zunächst ein paar Parameter aus einer externen Datei einlesen möchte um mit diesen Parametern weiterarbeiten zu können, nutze ich eine Funktion. Funktionen können Rückgabewerte erhalten, müssen aber nicht.

In Old-Style-Basic hätte man geschrieben:

Code: Alles auswählen

sub test
  goto getFileLocations
  Fortsetzung:
'...weiterer Code
  exit sub

  getFileLocations:
'....Code
  goto Fortsetzung
end sub
Die sicher besserer Alternative ist:

Code: Alles auswählen

sub test
  getFileLocations$([arg])
' .... weiterer Code
end sub

function getFileLocations$([arg])
' .... weiterer Code
end function
Das ist ganz einfach ein übersichtlicherer Programmierstil. Außerdem kann die Funktion in einem eigenen Modul abgelegt werden. Dieses Modul kann man dann in eine x-beliebige Bibliothek einbinden, und die Funktion kann dann quasi "von überall her" verwendet (=aufgerufen) werden.

Weiterer Vorteil: Der Code muß nur ein mal geschrieben werden.

So, ich hoffe dass Du nun den "Holzweg" wieder verlassen kannst ... :wink:

Greetz,
keyboard-billy[/code]

von stbuerk » Do, 01.03.2007 10:40

Vielleicht bin ich ja ganz auf dem Holzweg.
Aber warum werden hier FUNKTIONEN definert, und nachher wie SUBs behandelt, also erwartet OO nicht so etwas wie
x = getFileLocations$("Repertoire.odb")
anstatt nur
getFileLocations$("Repertoire.odb")

Wundert mich nur, vielleicht hat das ja auch einen tieferen Sinn und mit dem Fehler nichts zu tun?

von Toxitom » Do, 01.03.2007 08:38

Hey billy,

hmm, also ich finde nichts dramatisches. Sollte so funktionieren. Warum deien Variablen leer sind, kann ich dir nicht sagen, aber nimm doch mal deine Basic-IDE, füge die Varaiblen den Beobachter zu (Debug-Modus), und gehen dann einmal schrittweise dein Makro durch (Step into). Dann siehst du doch genau, welchen Wert die Varaiblen wann annehmen - und erkennst auch, ob die Schleifen überhaupt ausgeführt werden.
Ich denke, das sollte dir zur Fehlersuche helfen.

Viele Grüße
Thomas

Aufruf von Funktionen schlägt fehl

von keyboard-billy » Mi, 28.02.2007 21:57

Hallo Leutz,

ich habe 2 Funktionen in verschiedenen Modulen:

1. Modul heißt getCurDir, die Funktion darin heißt getCurDir$()
2. Modul heißt getFileLocations, die Funktion darin heißt getFileLocations$()

Die Funktion im 1. Modul wird von der Funktion im 2. Modul aufgerufen.
getFileLocations$() wird von einer Testroutine (Sub test), die sich einem 3. Modul Modul1 befindet, gestartet.

Problem:
Wenn ich alle Funktionen zusammen mit der Sub in einem Modul habe, klappt alles prima.
Wenn ich die Funktionen und die Sub auf verschiedene Module verteile klappt nichts mehr.

Ich habe die o.g. Module in eine Bibliothek namens HTML_Code_Generator eingehängt.
Die Bibliothek hängt an einem Formular einer Datenbank.

Der Code von Modul "getCurDir":

Code: Alles auswählen

'----------------------------------------------------------------
' Function:    getCurDir$()
' Author:      keyboard-billy
' Version:     1.00
' Date:        28.02.2007
' Description: Die Funktion emittelt unabhängig vom genutzen 
'              Betriebssystem das aktuelle Programmverzeichnis.
'              Der Rückgabewert erfolgt in URL-Notation.
'----------------------------------------------------------------

Option Explicit

Function getCurDir$(fileName$)
  GlobalScope.BasicLibraries.LoadLibrary("Tools")

  Dim oDocs As Object, oDoc As Object, oComponents As Object
  Dim FileN$, DirName$, URL$
  Dim found As Boolean : found = false

  oComponents = StarDesktop.getComponents()                               'Alle geöffneten Komponenten ermitteln
  oDocs = oComponents.createEnumeration()                                 'Index für alle geöffneten Komponenten erstellen
    Do While oDocs.hasMoreElements()                                      'Suchroutine
    oDoc = oDocs.nextElement()
    On Error Goto go_on
    URL$ = oDoc.getURL()
    FileN$ = FileNameoutofPath(URL$)                                      'Funktion der Globalen Bibliothek "Tools"
    If FileN$ = fileName$ Then
      DirName$ = DirectoryNameoutofPath(URL$, "/")                        'Funktion der Globalen Bibliothek "Tools"
      found = true
    End If
  go_on:
  Loop
  If found = false Then
     MsgBox ("Die Datei """ & fileName$ & """ ist zur Zeit nicht geöffnet!", 48, "Fehler")
  End If
  getCurDir$ = DirName$
End Function
Der Code von Modul "getFileLocations":

Code: Alles auswählen

'----------------------------------------------------------------
' Function:    getFileLocations$()
' Author:      keyboard-billy
' Version:     1.00
' Date:        28.02.2007
' Description: Die Funktion sucht im aktuellen 
'              Programmverzeichnis nach einer Template-Datei
'              {Dokumentname}.ini
'              Anschliessend wird die ini-Datei nach
'              den Parametern "Template_Path", "Template_File"
'              "Output_Path" und "Output_File" abgesucht.
'              Die zugehörigen Parameter werden ausgelesen und
'              in den öffentlichen Variablen "templatePath$",
'              "templateFile$", "outputPath$" und "outputFile$"
'              abgelegt.
'----------------------------------------------------------------

Option Explicit

'Global documentName$
'Global templatePath$, templateFile$
'Global outputPath$, outputFile$

Public documentName$
Public templatePath$, templateFile$
Public outputPath$, outputFile$

Function getFileLocations$(documentName$)
  Dim fileP$, iniFile$, recordLine$, text$
  Dim tmp$(2)
  Dim fileMask%, inputFileHandle%
  Dim pos% : pos% =1
  Dim lPos%, uPos%

  iniFile$ = Left((documentName$),Len("documentName$")-3) & ".ini"        'Dateiname der Datei {documentName$}.ini

  If getCurDir$(documentName$) <> "" Then
    fileP$ = getCurDir$(documentName$)
    If FileExists(fileP$ & "/" & iniFile$) Then                           'Verzeichnis-Separator ist "/" in URL-Notation!
      'ini-Datei einlesen
      inputFileHandle% = Freefile()
      Open fileP$ & "/" & iniFile$ For Input As #inputFileHandle
      Do While Not EOF(#inputFileHandle)
        Line Input #inputFileHandle, recordLine$
        'Parser
        If InStr(pos%, recordLine$,"Template_Path=") <> 0 Then
          tmp$ = Split(recordLine$, "=", 2)
          templatePath$ = tmp$(1)
        End If
        If InStr(pos%, recordLine$,"Template_File=") <> 0 Then
          tmp$ = Split(recordLine$, "=", 2)
          templateFile$ = tmp$(1)
        End If
        If InStr(pos%, recordLine$,"Output_Path=") <> 0 Then
          tmp$ = Split(recordLine$, "=", 2)
          outputPath$ = tmp$(1)
        End If
        If InStr(pos%, recordLine$,"Output_File=") <> 0 Then
          tmp$ = Split(recordLine$, "=", 2)
          outputFile$ = tmp$(1)
        End If
      Loop 
      Close #inputFileHandle
    Else
      'ini-Datei nicht vorhanden
      MsgBox("Datei """& iniFile$ & """ in Pfad """ & _
             ConvertFromURL(fileP$) & """ nicht vorhanden!", 48, "Fehler")
    End If
  End If
End Function
der Code von Modul "Modul1":

Code: Alles auswählen

Sub test
  getFileLocations$("Repertoire.odb")                        'getFileLocations$({Dateiname des Dokuments})
  MsgBox("Template_Path=""" & templatePath$ & """" & chr$(13) & _
         "Template_File=""" & templateFile$ & """" & chr$(13) & _
         "Output_Path=""" & outputPath$ & """" & chr$(13) & _
         "Output_File=""" & outputFile$ & """" & chr$(13))
End Sub
Warum sind in der MsgBox die Variablen templateFile$, templateFile$, outputPath$ und outputFile$ alle samt leer?

Ich hab' die Variablen im Modul "getFileLocations" auch schon als Global deklariert. Aber das bringt auch nix.

Ich mach hier bestimmt was ganz elementares falsch
:? . Aber ich komm einfach nicht weiter, woran's liegt....

Greetz,
keyboard-billy

Nach oben