Date: prev next · Thread: first prev next last
2017 Archives by date, by thread · List index


Hallo Thomas,

das kann ich schon alles nachvollziehen, aber es beantwortet nicht die Frage, für was es denn dann die Anweisung "IsMissing('name')" gibt ?

Lässt man das Komma des weggelassenen Parameters weg, liefert "IsMissing('name')" eine falsche Aussage, behält man das Komma des weggelassenen Parameters bei, liefert "IsMissing('name')" eine richtige Aussage. Dabei ist es egal, ob man im rufenden Makro die Zeile "Dim A1,optB2,optC3,optD4 as Integer" kommentiert oder nicht:

Sub Calling_4
'   Dim A1,optB2,optC3,optD4 as Integer
   A1=1 : optB2=2 : optC3=3 : optD4=4
   Called_4(A1,optB2,optC3,optD4)
End Sub

Sub Called_4(A1 as Integer,Optional optB2,Optional optC3,Optional optD4)
   Dim ZK as String : ZK = ""
   MsgBox("IsMissing(optB2): " & IsMissing(optB2) & Chr(13) &_
          "IsMissing(optC3): " & IsMissing(optC3) & Chr(13) &_
          "IsMissing(optD4): " & IsMissing(optD4) & Chr(13))
   ZK = ZK & "A1=" & A1 & Chr(13)
If (Not IsMissing(optB2)) Then : ZK = ZK & "optB2=" & optB2 & Chr(13) : End IF If (Not IsMissing(optC3)) Then : ZK = ZK & "optC3=" & optC3 & Chr(13) : End IF If (Not IsMissing(optD4)) Then : ZK = ZK & "optD4=" & optD4 & Chr(13) : End IF
   MsgBox (ZK)
End Sub

Ich kann nicht nachvollziehen, warum es richtig sein soll, das Komma des weggelassenen optionalen Parameters auch wegzulassen, wenn dadurch die "IsMissing('name')"-Anweisung eine falsche Aussage über den weggelassenen optionalen Parameter liefert:

[1] Called_4(A1,optB2,,optD4)

IsMissing(optB2): False
IsMissing(optC3): True
IsMissing(optD4): False

A1=1
optB2=2
optD4=4

[2] Called_4(A1,optB2,optD4)

IsMissing(optB2): False
IsMissing(optC3): False
IsMissing(optD4): True

A1=1
optB2=2
optC3=4

Meine offenen Fragen:

Wenn das Komma des weggelassenen optionalen Parameters auch wegzulassen ist, welchen Sinn macht dann die "IsMissing('name')"-Anweisung mit der Möglichkeit, einen konkreten Parameter-Namen anzugeben und abzufragen, wenn sie sich durch das Weglassen des Kommas auf ein falschen Parameter bezieht (siehe [2]) ?

Warum wird in der BASIC-IDE-Hilfe (DEU + ENG) das Komma des weggelassenen optionalen Parameters nicht weggelassen, wenn es Deiner Meinung nach aber richtig wäre ihn wegzulassen ?

Du sagst "Komma weg lassen", die Hilfe sagt "Komma beibehalten" (und in der praktischen Anwendung funktioniert es auch so) - und was ist nun richtig ?

Oder habe ich Dich vielleicht völlig falsch verstanden ?

Grüße
Hans-Werner

------ Originalnachricht ------
Von: "Thomas Krumbein" <Thomas.Krumbein@documentfoundation.org>
An: users@de.libreoffice.org
Gesendet: 07.12.2017 09:18:21
Betreff: Re: [de-users] LO Makro Basic Option ''Optional'' - ''IsMissing'' immer ''False''

Hallo Werner,

siehe es pragmatischer ( und programmtechnisch logisch). Ich kürze mal Deine ausführlichen Tests und Ideen.

Eine Funktion wird mit Parametern aufgerufen. Die Liste der Parameter musst Du nun "parsen" - das würdest Du auch in jedem anderen Programm ganz einfach machen: Den übergebenen Ausdruck (Also die Liste der Parameter) nehmen, am vereinbarten Trenner teilen und dann einzeln auswerten.

Ich versuche es in Basic auszudrücken:

meineFunktion(a,b,c) -> drei Parameter übergeben -> entsprechend Sprache (basic) Komma-separiert.

- nun löse ich den Ausdruck (a,b,c) auf - Parameter = split("a,b,c", ",") - also ich teile am Tennner - und erhalte einen Array (oder eine Liste) mit drei Elementen. Jedes Element wird nun einzeln ausgewertet.

So macht es auch das Programm - ganz egal, was Du übergibst. Und die werden nun entsprechend Ihrer Reihenfolge auch genau so übergeben. An die Funktion, die Parameter übernimmt.

Das "missing" muss sich darauf beziehen, dass ein Parameter fehlt - das kann aus der Logik heraus nur am Ende passieren. d.h. der übergeben Array hat weniger Elemente als die Funktion theoretisch übernehmen kann - und damit es zu keinem Fehler kommt, wird der/die evt. fehlende/n als "optional" gekennzeichent.

Insofern kann auch nur am Ende der Kette Parameter fehlen -> alle anderen werden übergeben! Das ist die Programmlogik.

Es wäre ein ungültiger Ausdruck zu schreiben: sub MeineFunktion(a, optional b, c) - egal ob mit oder ohne Deklaration. In dem Fall wäre ja nur der mittlere Parameter optional - das aber kann die Logik nicht abbilden. Steht auch irgendwo so in der Hilfe: "wird ein Parameter als optional gekennzeichnet, müssen auch alle nachfolgenden als "optional" gekennzeichnet sein".

Wenn Du eine Funktion wie in deinem Beispiel mit funktion(a,,c) aufrufst, übergibst Du drei Parameter! auch wenn der mittlere leer ist - der Array besitzt drei Elemente - die dann auf deine Funktion entsprechend gemappt werden. Die Besonderheit bei Basic ist eben, dass Variablen erst zur Laufzeit von Basic erzeugt werden entsprechend des übergebenen Typs (der Interpreter übernimmt die Konstruktion) - es sei denn , du deklarierst den Typ selbst - dann wird die Variable schon mal erzeugt (mit dem standard-Vorgabewert). Die Unsauberkeit der Sprache ist wahrscheinlich, dass das Konstrukt meineFunktion(a as integer, b, c as integer) bei der Interpretation die Variablen a + c bereits erzeugt entsprechend der Deklaration, b aber erst, wenn der Interpreter den Typ kennt entsprechend der Übergabe-Werte. Wenn dann nix interpretierbar ist (leerer Array-Wert) tut er halt nix... und dann gibt es die Variable b eben noch nicht - und das isMissing(b) wirft true aus, weil die Variable eben noch nicht existiert. Das sind die Unsauberkeiten der Basi-Sprache.

Korrekte Programmierung heisst aber für mich, die Programm-Logik beizubehalten. Der zweite Parameter (b) wird bei Dir eben übergeben- wenn auch "nicht bekannt" "0", oder "-1" - keine Ahnung... das bestimmst Du selbst und musst den Fall abfangen.

Wenn die Hilfe von Basic hier missverständlich ist oder unvollständig... na ja, wird ja auch nur von Menschen geschrieben;)

Viele Grüße

Thomas

Am 07.12.2017 um 08:46 schrieb OoOHWHOoO:
[.. entsorgt..]

-- Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.