Messagebox Numeric Field

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Messagebox Numeric Field

Beitrag 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
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Beitrag 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
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hi Karolus,

da bin ich aber beruhigt.
Das hatte ich auch ausprobiert. :(

Ich hatte auch schon ausprobiert:

Code: Alles auswählen

if m = "" then
     msgbox("bitte einen Wert eintragen") 
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.

Code: Alles auswählen

m = oDialog1.GetControl("TextField").Text
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
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
ykcim
*****
Beiträge: 324
Registriert: Di, 29.07.2003 15:22
Wohnort: Neu-Isenburg
Kontaktdaten:

Beitrag 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
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hallo Michael,

danke für den Hinweis.
Das hatte ich auch schon versucht. Dann kommt aber eine Fehlermeldung bei:

Code: Alles auswählen

m =sZahl1 -1
"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
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
ykcim
*****
Beiträge: 324
Registriert: Di, 29.07.2003 15:22
Wohnort: Neu-Isenburg
Kontaktdaten:

Beitrag 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
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag 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:

Code: Alles auswählen

m = CInt(sZahl1) - 1
Würde ich aber nicht machen. Bleib direkt beim Wert des Feldes.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag 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

Code: Alles auswählen

m = oDialog1.GetControl("NumericField").value 
nicht funktioniert. Ich hatte aber auch angegeben:

Code: Alles auswählen

m =m -1 
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. :wink:
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
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag 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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hi Thomas,

schön das Du nochmal nachfragst.

Das Problem war, dass ich mit

Code: Alles auswählen

m = oDialog1.GetControl("NumericField").Text
nicht rechnen konnte.

Ich aber mit

Code: Alles auswählen

m = oDialog1.GetControl("NumericField").value
nicht überprüfen konnte ob eine Eingabe erfolgt ist.

Code: Alles auswählen

m =m -1
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". :oops:

Danke im voraus.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag 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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag 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. :oops:
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag 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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Danke Thomas, :D

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
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Antworten