Seite 1 von 1
Messagebox Numeric Field
Verfasst: Fr, 18.05.2007 20:09
von turtle47
Hallo Zusammen,
ich habe folgenden Code:
Code: Alles auswählen
Sub NummerEintragen
myDoc = stardesktop.currentcomponent
m = oDialog1.GetControl("NumericField").value
m =m -1
...
Jetzt möchte ich eine MsgBox ausgeben lassen wenn der User das Eingabefeld
nicht ausgefüllt hat.
Habe schon einiges durchprobiert und das Forum durchstöbert, aber leider ohne Erfolg.
Kann mich jemand in die richtige Richtung weisen.
Danke im voraus für die Hilfe.
Jürgen
Verfasst: Fr, 18.05.2007 22:47
von Karolus
Hallo Jürgen
Funktioniert an der Stelle nicht:
Code: Alles auswählen
Sub NummerEintragen
myDoc = stardesktop.currentcomponent
m = oDialog1.GetControl("NumericField").value
if m = 0 then
msgbox("bitte einen Wert eintragen")
end if
m =m -1
.....
?
Gruß Karo
Verfasst: Fr, 18.05.2007 23:13
von turtle47
Hi Karolus,
da bin ich aber beruhigt.
Das hatte ich auch ausprobiert.
Ich hatte auch schon ausprobiert:
hat aber auch nicht geholfen. Das betrifft ja auch nur das Textformat.
Funktioniert an der Stelle nicht:
Wo sonst?
Hier der ganze Code:
Code: Alles auswählen
Sub ZeilenEinfuegenAlleBlaetter
myDoc = stardesktop.currentcomponent
sZahl1 = oDialog1.GetControl("NumericField").value 'Zeilennummer
m =sZahl1 -1
sZahl2= oDialog1.GetControl("NumericField1").value 'Anzahl einzufügender Zeilen
n =sZahl2
myDoc = thisComponent
Anzahl=myDoc.Sheets.count
For i=0 to Anzahl-1
odoc=thiscomponent
mysheet=odoc.sheets(i)
myrows=mysheet.getrows
myrows.insertbyindex(m,n) 'Einfügen: Index und Anzahl.
Next i
oDialog1.endexecute
End Sub
Es muss doch aber doch möglich sein, dass wenn kein Eintrag in das NumericField
eingetragen ist eine Meldung auszugeben.
Wenn alle Stricke reißen werde ich es mit einem TextField versuchen.
Das widerspricht aber der Logik.
Zahl ist nun mal Zahl und nicht Text.
Wenn der User anstelle einer Zahl einen Buchstaben einträgt muss das ja auch
wieder abgefangen werden.
Ich denke es wir sich aber eine Lösung finden.
Karolus, vorerst vielen Dank für Deine Hilfe.
Jürgen
Verfasst: Sa, 19.05.2007 11:26
von ykcim
Hallo Jürgen,
Du mußt die Eigenschaft Text abfragen. Diese ist ohne Eingabe leer und nach einer Eingabe gefüllt.
Code: Alles auswählen
m = oDialog1.GetControl("NumericField").Text
if m = "" then msgbox("bitte einen Wert eintragen")
mfg
Michael
Verfasst: Sa, 19.05.2007 11:43
von turtle47
Hallo Michael,
danke für den Hinweis.
Das hatte ich auch schon versucht. Dann kommt aber eine Fehlermeldung bei:
"Unzulässiger Wert oder Datentyp. Datentypen unverträglich"
Deshalb habe ich ja von .Text auf .Value gewechselt.
Ich gehe davon aus, dass man von einem Text ja keine Zahl abziehen kann. Oder?
Kann man den Datentyp im nachhinein noch ändern?
Vielen Dank.
Jürgen
Verfasst: Sa, 19.05.2007 12:02
von ykcim
Natürlich kannst du mit der Eigenschaft Text nicht rechnen, dazu mußt Du Value nehmen.
Deine Frage war aber wie kann man eine Eingabe prüfen. Und das geht mit der Eigenschaft Text.
Code: Alles auswählen
m = oDialog1.GetControl("NumericField").Text
if m = "" then msgbox "Bitte ..."
else
m2 = oDialog1.GetControl("NumericField").Value
end if
... mit m2 rechnen ....
mfg
Michael
Verfasst: Sa, 19.05.2007 12:05
von Toxitom
Hey Jürgen,
du hast Michael falsch verstanden: Ein numerisches Feld hat sowohl die Text - Eigenschaft (das/die angezeigten Zeichen) als auch den value -Wert (eben den Wert an sich - als Zahl). Beide müssen nicht unbedingt übereinstimmen!
Wurde nichts eingegeben, so sollte die Texteigenschaft leer sein, also ein leerer String. Jetzt kannst du deine Fehlermeldung produzieren.
Rechnen musst du weiterhin mit dem Value-Wert - aber das kommt ja erst zum tragen, wenn die erste Abfrage positiv war
Im übrigen könntest du einen String natürlich auch wieder in eine Zahl verwandeln - zum Beispiel in einen Integer-Typ:
Würde ich aber nicht machen. Bleib direkt beim Wert des Feldes.
Gruss
Thomas
Verfasst: Sa, 19.05.2007 12:34
von turtle47
Hallo Zusammen,
okay, meine Frage war:
Jetzt möchte ich eine MsgBox ausgeben lassen wenn der User das Eingabefeld
nicht ausgefüllt hat.
was ja, warum auch immer mit
nicht funktioniert. Ich hatte aber auch angegeben:
Es war damit ja wohl offensichtlich, dass ich mit dem Wert rechnen wollte.
Jetzt hatte ich mir erhofft, dass die Spezialisten das erkennen würden.
Das Problem ist dank Eurer Hilfe nun gelöst. Vielen Dank.
@Michael
Deine Internetseite zu Basic ist echt klasse. Hat mir neben dem Buch von Thomas schon sehr viel geholfen.
Schönes Wochenende.
Jürgen
Verfasst: Sa, 19.05.2007 13:22
von Toxitom
Hallo Jürgen,
da ich das gerade mal ausprobiert habe - wo war eigentlich das Problem?
Also bei mir liefert das Kontrollelement "0" zurück, wenn nichts ausgefüllt wurde, die ursprüngliche Abfrage funktionierte also. OK, Fehlerquelle, falls jemand "0" eingibt - das ist dann wie wenn nichts drin steht.
Lag die Frage daher mehr im Ablauf? Also, du hast einen Dialog, dort gibt es ein numerisches Eingabefeld. Der Dialog wird über eine "OK" Taste geschlossen. Jetzt läuft die Routine, die Felder auszulesen und wenn jetzt festgestellt wird, dass kein Wert da ist, dann soll der Dialog offenbleiben, eine Fehlermeldung ausgegeben werden und der Cursor in das numerische Feld springen?
War das die Frage?
Gruss
Thomas
Verfasst: Sa, 19.05.2007 13:49
von turtle47
Hi Thomas,
schön das Du nochmal nachfragst.
Das Problem war, dass ich mit
nicht rechnen konnte.
Ich aber mit
nicht überprüfen konnte ob eine Eingabe erfolgt ist.
brauche ich aber da die Zeile 1 den Index 0 hat. Da erzähle ich Dir ja nichts neues.
Lag die Frage daher mehr im Ablauf? Also, du hast einen Dialog, dort gibt es ein numerisches Eingabefeld. Der Dialog wird über eine "OK" Taste geschlossen. Jetzt läuft die Routine, die Felder auszulesen und wenn jetzt festgestellt wird, dass kein Wert da ist, dann soll der Dialog offenbleiben, eine Fehlermeldung ausgegeben werden und der Cursor in das numerische Feld springen?
War das die Frage?
Genau, das ist das worüber ich gerade "Brüte".
Danke im voraus.
Jürgen
Verfasst: Sa, 19.05.2007 19:40
von Toxitom
Hallo Jürgen,
Genau, das ist das worüber ich gerade "Brüte".
Also das fängst du wie folgt ab:
Du hast irgendwo deine Sub, die den Dialog aufruft. Dort steht die Zeile "odialog.execute()". An dieser Stelle wartet das Makro, bis der dialog geschlossen wird - und setzt dann die Abarbeitung fort. Also, Voraussetzung, der Dialog wird geschlossen.
Jetzt schreibst du ein "Schliessmakro", also eine Routine, die du entweder mit dem OK Button (oder wie du sonst den Dialog-Fertig-Button nennest) verbindest oder mit einem bestimmten Ereignis (z.B.Fokuserhalt eines anderen Controlelementes)
Diese Routine macht jetzt deine Überprüfung, setzt den Cursor ins Feld (bei bedarf), übernimmt die Eingabe ins Sheet und schliesst am Ende den Dialog. Die könnte wie folgt aussehen:
Code: Alles auswählen
Sub ZeilenEinfuegenAlleBlaetter
nZahl1 = oDialog1.GetControl("NumericField").value 'Zeilennummer
REM jetzt Abfrage, ob Leer
if nZahl1 = 0 then 'kein Eintrag oder 0 eingetragen
stxt = "Bitte eine Zeilennummer ungleich Null eingeben!"
msgbox (stxt, 16, "Fehler!")
Dialog1.GetControl("NumericField").setFocus()
end sub 'Routine beenden, Rücksprung zum Dialog
end if
REM Zeileneingabe erfolgt und größer Null
m =nZahl1 -1
nZahl2= oDialog1.GetControl("NumericField1").value 'Anzahl einzufügender Zeilen
n =sZahl2
oDoc = thisComponent
Anzahl=myDoc.Sheets.count
For i=0 to Anzahl-1
mysheet=odoc.sheets(i)
myrows=mysheet.getrows
myrows.insertbyindex(m,n) 'Einfügen: Index und Anzahl.
Next i
oDialog1.endexecute 'Dialog beenden, Rücksprung zum ursprünglichen Makro
End Sub
Viele Grüße
Thomas
Verfasst: So, 20.05.2007 07:53
von turtle47
Hallo Thomas,
Code: Alles auswählen
if nZahl1 = 0 then 'kein Eintrag oder 0 eingetragen
stxt = "Bitte eine Zeilennummer ungleich Null eingeben!"
msgbox (stxt, 16, "Fehler!")
das ist schon mal super.
Sorry, wenn ich nerve, aber das Andere funktioniert irgendwie nicht so.
Du hast irgendwo deine Sub, die den Dialog aufruft. Dort steht die Zeile "odialog.execute()".
An dieser Stelle wartet das Makro, bis der dialog geschlossen wird - und setzt dann die Abarbeitung fort.
Also, Voraussetzung, der Dialog wird geschlossen.
Mir stellt sich das anders dar. Der Dialog wird aufgerufen, die Werte werden
eingegeben, die Sub "Ausführen" wird gestartet und am Ende wird der Dialog
mit "odialog.endexecute()" geschlossen.
Jetzt schreibst du ein "Schliessmakro", also eine Routine, die du entweder mit dem OK Button
(oder wie du sonst den Dialog-Fertig-Button nennest) verbindest oder mit einem bestimmten
Ereignis (z.B.Fokuserhalt eines anderen Controlelementes)
Da beißt sich die Katze doch in den Schwanz. Der Dialog wird beendet bevor das Makro
abgearbeitet ist. Oder habe ich da was falsch verstanden?
Kannst Du Dir das bitte mal ansehen?
http://www.office-center-jd.de/download ... fuegen.ods
Vielen Dank für Deine Geduld.
Jürgen
P.S.
Ich muss mal was loswerden.
Bitte entschuldigt wenn manche Fragen nicht direkt so präzise gestellt sind.
Dazu fehlt einem die Erfahrung, sonst würde man ja hier keine Fragen stellen.
Das gilt nicht nur für mich sondern auch für andere "Frager" hier im Forum.
Manchmal entwickeln sich die Dinge dahingehend, woran man vorher überhaupt
noch nicht gedacht hat.
Also: Wir bitten um Nachsicht.

Verfasst: So, 20.05.2007 09:17
von Toxitom
Hallo Jürgen,
Kannst Du Dir das bitte mal ansehen?
Hab ich - und: funktioniert
OK, zwei Kleinigkeiten musst du ändern:
Einmal: Dem Button Ausführen ist ein Makro "DiaEnd" zugewiesen. Das gibt es nicht. Ändere das auf die Routine "ZeilenEinfuegenAlleBlaetter".
Tia und dann - soory, ein Schreibfehler in meiner Routine:
Code: Alles auswählen
Sub ZeilenEinfuegenAlleBlaetter
nZahl1 = oDialog1.GetControl("NumericField").value 'Zeilennummer
REM jetzt Abfrage, ob Leer
if nZahl1 = 0 then 'kein Eintrag oder 0 eingetragen
stxt = "Bitte eine Zeilennummer ungleich Null eingeben!"
msgbox (stxt, 16, "Fehler!")
Dialog1.GetControl("NumericField").setFocus()
end sub 'Routine beenden, Rücksprung zum Dialog
end if
...
es muss natürlich heissen:
Code: Alles auswählen
Sub ZeilenEinfuegenAlleBlaetter
nZahl1 = oDialog1.GetControl("NumericField").value 'Zeilennummer
REM jetzt Abfrage, ob Leer
if nZahl1 = 0 then 'kein Eintrag oder 0 eingetragen
stxt = "Bitte eine Zeilennummer ungleich Null eingeben!"
msgbox (stxt, 16, "Fehler!")
Dialog1.GetControl("NumericField").setFocus()
exit sub 'Routine beenden, Rücksprung zum Dialog
end if
...
Ändere das - und dann funktioniert es
Dein Makro "DialogEnde" brauchst du nicht mehr - du beendest den Dialog ja am Ende der "ZeileEinfuegen" Routine. Das ist ja schon die "Dialog beenden Routine".
IN dem Sinne
Viele Grüße
Thomas
Verfasst: So, 20.05.2007 11:21
von turtle47
Danke Thomas,
ich bin mir zwar fast sicher das ich das mit Exit Sub auch mal probiert hatte,
aber nachher sieht man den Wald vor lauter Bäumen nicht mehr.
Jetzt weiß ich jedenfalls wie man mit keiner oder einer falschen Eingabe umgeht
und nicht einfach aus dem Programm aussteigt. Das ist mir wichtig.
Das Wochenende war für mich jedenfalls sehr lehrreich.
Schönes Restwochenende wünscht
Jürgen