Mehrere Inputbox-Variablen vereinfachen

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: Mehrere Inputbox-Variablen vereinfachen

Re: Mehrere Inputbox-Variablen vereinfachen

von theindless » Di, 17.04.2012 15:00

Hallo Balu,

danke nochmal für deine Ausführungen. Ich sollte deutlicher Schreiben...
Falsch!!!
Als aller erstes deklariere ich die zwei Variablen oDialog1 und oProjektBlatt.
Habe ich schon gelesen und auch erkannt, dass es wichtig ist, es an dieser Stelle (=public) zu deklarieren, damit diese für beide Subs (und alle Module und Bibliotheken) gültig sind.
Nicht richtig.
Es wird die Standard-Bibliothek der Dialoge, und nicht die der Makros, initialisiert und einer Variablen (oDialog1) zugeordnet.
Ok... ist für mich verständlich, da du ja auf den Dialog zugreifen möchtest, den du entworfen hast.
Nicht ganz korrekt, und das ist keine Haarspalterei: Es wird oDialog1.getControl("TextField" & ta+1).text ausgelesen.
Habe ich auch so verstanden und für mich war klar, dass du auf über oDialog1 zugreifst.
Fast richtig.
Die Tabellenspalten werden durch "ta" direkt angesprochen, aber für die Textfelder habe ich einen Korrekturwert "ta+1" angegeben da es kein Textfeld0 gibt.
Ja... war von mir auch so verstanden und gemeint.
Rechtsklick auf den OK-Button in der Dialog-IDE, und dann auf den Reiter "Ereignisse" wechseln.
Vielen Dank!... hätte ich ohne deine Hilfe nicht gefunden.
Und damit ist auch das "Mysterium" der Ausführung für mich geklärt.
Ich hatte nämlich nichts gefunden, wo die Sub "Auswerten" ausgeführt wird. Aber das hat sich mit dem Punkt vorher ja geklärt.

Vielen Dank balu für das anschauliche Beispiel und die Hilfe bei den Fragen!

Re: Mehrere Inputbox-Variablen vereinfachen

von balu » Di, 17.04.2012 14:44

Hallo theindless.
Wenn ich das richtig verstehe lädst du als erstes ...
Falsch!!!
Als aller erstes deklariere ich die zwei Variablen oDialog1 und oProjektBlatt. Das darfst Du auf gar keinen Fall missachten und übersehen! Denn wenn Du das machst, also die deklaration missachtest, dann hagelts Fehlermeldungen. Und es hat auch seinen Sinn warum dies außerhalb der ersten Sub ganz oben geschieht. Zum besseren Verständniss lese dir mal die folgenden Links durch.
http://www.dannenhoefer.de/faqstarbasic ... ml#Zweig76
http://www.dannenhoefer.de/faqstarbasic ... ml#Zweig80
http://www.dannenhoefer.de/faqstarbasic ... ml#Zweig81

die "Standard"-Bibliothek des Dokuments, wo die Macros hinterlegt sind.
Nicht richtig.
Es wird die Standard-Bibliothek der Dialoge, und nicht die der Makros, initialisiert und einer Variablen (oDialog1) zugeordnet.

Du liest über getControl("TextField" & ta+1).text den Text der einzelnen Textfelder (offensichtlich beginnen die mit 1) aus
Nicht ganz korrekt, und das ist keine Haarspalterei: Es wird oDialog1.getControl("TextField" & ta+1).text ausgelesen. Denn es können ja schließlich zich-verschiedene Dialoge mit hunderten verschiedenen Elementen existieren, seiens Textfelder, Listboxen, Datefields oder ähnliches.
Aber es stimmt schon in so fern, das das auslesen in diesem Falle mit getControl geschieht.

Und ja, die Textfelder habe ich chronologisch von 1 bis 6 erstellt und angeordnet.


und schreibst diese in die durch (ta, 3) bezeichneten Zellen.
Fast richtig.
Die Tabellenspalten werden durch "ta" direkt angesprochen, aber für die Textfelder habe ich einen Korrekturwert "ta+1" angegeben da es kein Textfeld0 gibt.

Was ich jedoch nicht verstehe ist, dass die Sub "Auswerten" nirgends aufgerufen wird und dennoch Werte eingetragen werden.
Rechtsklick auf den OK-Button in der Dialog-IDE, und dann auf den Reiter "Ereignisse" wechseln.

Müsste nicht nach Beenden der Sub "Projekt_erfassen_Array" Ende der Ausführung sein?
Warum? Ist doch der Fall.
Es sind 2 verschiedene Subs. Sie haben jeweils einen Anfang und ein Ende. Sie haben auch unterschiedliche Funktionen, und führen von daher unterschiedliche Sachen aus.
Die erste initialisiert und startet den Dialog, und damit ist sie dann fertig. Die zweite "wertet" aus und trägt das in die Zellen ein, und dadurch ist sie dann auch fertig. Und da ja dann nichts anderes mehr gemacht werden muss, wird der Dialog anschließend beendet.



Gruß
balu

Re: Mehrere Inputbox-Variablen vereinfachen

von theindless » Di, 17.04.2012 13:40

Hallo Balu,
Rechtsklick auf diesen Reiter, und dann ->Einfügen -->Basic-Dialog. Dann wird ein neuer blanker Dialog eingefügt. Diesen kannst Du so bearbeiten wie ein Zeichenobjekt.
Daran lags! :)

Ich habe alle Menüs durchsucht und Rechtsklicks an vielen Stellen, aber nicht dem Reiter versucht.
Die Erstellung ist mir soweit glaub ich klar.

Code: Alles auswählen

Sub Projekt_erfassen_Array
	Dim oDoc as Object, oSheet as Object

	DialogLibraries.loadLibrary("Standard")
	oDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog)
	
	oDoc = ThisComponent
	oProjektBlatt = oDoc.Sheets.getByName("Projekte")
	oDialog1.execute
End Sub
Wenn ich das richtig verstehe lädst du als erstes die "Standard"-Bibliothek des Dokuments, wo die Macros hinterlegt sind.
Dann wählst du das Dokument und die Tabelle "Projekte" aus und führst den Dialog aus.

Code: Alles auswählen

sub auswerten
	for ta = 0 to 5
   		oProjektBlatt.getcellByPosition( ta, 3 ).formulalocal = oDialog1.getControl("TextField" & ta+1).text
	next ta
	oDialog1.endexecute
end sub
Verstehe ich prinzipiell auch.
Du liest über getControl("TextField" & ta+1).text den Text der einzelnen Textfelder (offensichtlich beginnen die mit 1) aus und schreibst diese in die durch (ta, 3) bezeichneten Zellen.
Dann beendest du den Dialog.

Was ich jedoch nicht verstehe ist, dass die Sub "Auswerten" nirgends aufgerufen wird und dennoch Werte eingetragen werden.
Müsste nicht nach Beenden der Sub "Projekt_erfassen_Array" Ende der Ausführung sein?

Übersehe ich da was?

Re: Mehrere Inputbox-Variablen vereinfachen

von balu » Di, 17.04.2012 12:49

Hallo theindless.

Ich weiß jetzt nicht wo deine Probleme liegen, da ich aus deiner Schilderung momentan nicht schlau draus werd, deshalb mal ein paar Grundinfos.

- Wenn Du in der Basic-IDE bist, dann siehst Du ja unten die Reiter wo z.B. "Module1" drauf steht.

- Rechtsklick auf diesen Reiter, und dann ->Einfügen -->Basic-Dialog. Dann wird ein neuer blanker Dialog eingefügt. Diesen kannst Du so bearbeiten wie ein Zeichenobjekt.

- Normalerweise ist im Dialog eine ähnliche Symbolleiste zu sehen wie die Formular-Steuerelemente in Calc. Und mit diesen erstellst Du dir dann einen Dialog auf "zeichnerische" Art und Weise. Das ansprechen der einzelnen Elemente geschieht aber nur in den Basic-Modulen.


Jetzt etwas schlauer geworden?


Gruß
balu

Re: Mehrere Inputbox-Variablen vereinfachen

von theindless » Di, 17.04.2012 12:34

Hallo Balu,

vielen Dank für dein Beispiel.

Ich habe mir das mal ansgeschaut und gesehen, dass du den Dialog über Text- und Beschriftungsfelder erstellt hast.
Soweit so klar.

Aber der Grundrahmen, also der ganze Dialog... wie ist der erstellt?

Ich sehe über Eigenschaften, dass es ein "Dialog" ist, aber wo finde ich diesen? Text- und Beschriftungsfelder sind klar!

Oder denke ich da falsch?

Re: Mehrere Inputbox-Variablen vereinfachen

von balu » Di, 17.04.2012 12:23

Hallo theindless.
da Suchen nach "Dialog" in StarBasic-Manuals mich überall hin bringen, aber nicht weiter.
Fragt sich nur was Du dir persönlich unter Dialog vorgestellt hast. Denn Du hast bestimmt das Ziel gesehen, ohne das Du wustest das es das Ziel war. Um verwirrungen nun zu vermeiden habe ich dir mal eben auf die schnelle einen Dialog zusammengeschustert. Klick auf Button "Dialog aufrufen" und Du siehst was germeint ist.



Gruß
balu
Dateianhänge
Simpler_Dialog_anstatt_Inputboxen_0.ods
(10.76 KiB) 221-mal heruntergeladen

Re: Mehrere Inputbox-Variablen vereinfachen

von theindless » Di, 17.04.2012 11:50

Hallo Karo,

muss ich mir mal genauer anschauen, deinen Code!

Wie ich bereits geschrieben habe, habe ich bisher leider nicht herausgefunden, auf was Winfried mit "Dialog" hinweist.

Also dazu fehlt mir noch komplett die Richtung, da Suchen nach "Dialog" in StarBasic-Manuals mich überall hin bringen, aber nicht weiter.

Re: Mehrere Inputbox-Variablen vereinfachen

von Karolus » Di, 17.04.2012 11:25

Hallo
Hier bringt dir die Verwendung von .setDataArray keinen zeitlichen Vorteil, das Makro "wartet" eh die meiste Zeit auf die Benutzereingaben, ausserdem interpretiert .setDataArray die (Datums)-Eingaben als Text, und die Alternative .setFormulaArray berücksichtigt nicht das lokale Datumsformat, daher würde ich vorschlagen:

Code: Alles auswählen

Sub Projekt_erfassen_Array

Dim oDoc as Object, oSheet as Object
Dim oInput as Object
Dim aMeinArray(0,5)

oDoc = ThisComponent
oSheet = oDoc.Sheets.getByName("Projekte")

oRow = oSheet.getRows
oRow.insertByIndex(3,1)

frage = array("Datum","Kurzbezeichnung","Beschreibung","Ziel","Fälligkeit","Notizen")

for c = 0 to 5
	osheet.getcellByPosition( c, 3 ).formulalocal = Inputbox( frage( c ) )
next

End Sub
Besser wäre allerdings ein richtiger Dialog mit entsprechenden Eingabefeldern, wie Winfried bereits vorgeschlagen hat.

Karo

Re: Mehrere Inputbox-Variablen vereinfachen

von theindless » Di, 17.04.2012 10:01

Hallo komma4,

ich habe mich mal an dem Array und der setDataArray()-Anweisung probiert.

Nach wiederholten Fehlermeldungen bei diesem Code:

Code: Alles auswählen

Sub Projekt_erfassen_Array

Dim oDoc as Object, oSheet as Object
Dim oInput as Object
Dim aMeinArray(5)

aMeinArray(0) = Inputbox("Datum")
aMeinArray(1) = Inputbox("Kurzbezeichnung")
aMeinArray(2) = Inputbox("Beschreibung")
aMeinArray(3) = Inputbox("Ziel")
aMeinArray(4) = Inputbox("Fälligkeit")
aMeinArray(5) = Inputbox("Notizen")

oDoc = ThisComponent
oSheet = oDoc.Sheets.getByName("Projekte")

oRow = oSheet.getRows
oRow.insertByIndex(3,1)

oInput = oSheet.getCellRangeByName("A4:F4")
oInput.setDataArray(aMeinArray())

End Sub
Habe ich doch irgendwann herausgefunden, dass mit der Dimension des Array wohl was nicht stimmt.

Folgender Code hat dann funktioniert, wenn auch nur der "Schreib-Block" vereinfacht ist:

Code: Alles auswählen

Sub Projekt_erfassen_Array

Dim oDoc as Object, oSheet as Object
Dim oInput as Object
Dim aMeinArray(0,5)

aMeinArray(0,0) = Inputbox("Datum")
aMeinArray(0,1) = Inputbox("Kurzbezeichnung")
aMeinArray(0,2) = Inputbox("Beschreibung")
aMeinArray(0,3) = Inputbox("Ziel")
aMeinArray(0,4) = Inputbox("Fälligkeit")
aMeinArray(0,5) = Inputbox("Notizen")

oDoc = ThisComponent
oSheet = oDoc.Sheets.getByName("Projekte")

oRow = oSheet.getRows
oRow.insertByIndex(3,1)

oInput = oSheet.getCellRangeByName("A4:F4")
oInput.setDataArray(aMeinArray())

End Sub
Leider habe ich jetzt die Daten zu "Datum" und "Fälligkeit" wieder als String und nicht als Date.

Die Code-Zeile

Code: Alles auswählen

aMeinArray(0,4) = CDate(Inputbox("Fälligkeit"))
(Beispiel) funktioniert leider nicht.
Wie kriege ich hier wieder ein Datum geschrieben?

Der Hinweis auf einen Dialog hat mich leider nicht weiter gebracht, da ich hierzu nichts gefunden habe, was mir helfen würde.

Hast du hier vielleicht noch einen Tip für mich?

DAnke!

Re: Mehrere Inputbox-Variablen vereinfachen

von theindless » Di, 17.04.2012 08:58

Hallo Komma4,

danke für den Wink in die richtige Richtung.

Pitonyak kannte ich schon, die andere Seite ist mir neu. Danke für den Hinweis.
Ich werde mir beide mal anschauen.

Das Problem ist oft nicht, dass ich nicht lernen möchte, aber oft weiß ich einfach nicht, nach WAS ich suchen soll.
Abgesehen davon, dass ich mich noch nicht lange mit Basic-Programmierung beschäftige :)

Vielleicht sollte man mal nen allgemeinen Thread eröffnen, wo Fragestellungen gepostet werden können, auf die als Antwort nur ein "Wink in die richtige Richtung" gewollt ist.
Allerdings kann auch ein fertiger Code zum Lernen sehr hilfreich sein.

Sehr zwiespältig also...

Aber nochmals Dank an dich komma4

Re: Mehrere Inputbox-Variablen vereinfachen

von komma4 » Di, 17.04.2012 08:47

Ja, und ja.

Code: Alles auswählen

Dim aMeinArray( 5 )

aMeinArray( 0 ) = Inputbox("Datum")
'... usw.

Zum Setzen: suche mal nach .setDataArray()


Speziell:
entwickle einen Dialog und frage alle Eingaben auf einmal ab, das ist "flüssiger" und damit "professioneller". Auch kannst Du (durch Einsatz der unterschiedlichen Kontrollelemente) Fehleingaben (bspw. Datum) abfangen.


Allgemein:
lerne durch Code anderer.
Du kennst Andrews Makro-Dokument oder Danny's Basic Library?

Mehrere Inputbox-Variablen vereinfachen

von theindless » Di, 17.04.2012 08:27

Hallo miteinander,

ich habe folgenden Code

Code: Alles auswählen

Sub Projekt_erfassen

Dim oDoc as Object, oSheet as Object

oDoc = ThisComponent
oSheet = oDoc.Sheets.getByName("Projekte")

oRow = oSheet.getRows
oRow.insertByIndex(3,1)

oDate = Inputbox("Datum")
oProjShort = Inputbox("Kurzbezeichnung")
oProjDescription = Inputbox("Beschreibung")
oGoal = Inputbox("Ziel")
oDue = Inputbox("Fälligkeit")
oNotes = Inputbox("Notizen")

oRowDate = oSheet.getCellByPosition(0,3)
oRowDate.value = CDate(oDate)

oRowProjShort = oSheet.getCellByPosition(1,3)
oRowProjShort.String = oProjShort

oRowDescription = oSheet.getCellByPosition(2,3)
oRowDescription.String = oProjDescription

oRowGoal = oSheet.getCellByPosition(3,3)
oRowGoal.String = oGoal

oRowDue = oSheet.getCellByPosition(4,3)
oRowDue.value = CDate(oDue)

oRowNotes = oSheet.getCellByPosition(5,3)
oRowNotes.String = oNotes

End Sub
Gibt es eine Möglichkeit, die diversen Variablen, die ich über Inputbox abfrage, in einem Block (evtl. ein Array) zu speichern?

Gibt es daraus oder anderweitig eine Möglichkeit, die einzelnen Schreibvorgänge in die Zellen, zu vereinfachen bzw. den "Schreib-Block" zu verkürzen?

Vielen Dank für eure Hilfe!

Nach oben