[gelöst] Eingabefeld auslesen und ändern mit inputbox

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

Moderator: Moderatoren

Ibanez
**
Beiträge: 40
Registriert: Fr, 25.07.2008 09:50

[gelöst] Eingabefeld auslesen und ändern mit inputbox

Beitrag von Ibanez »

Hallo All,

ich bin recht neu im makroschreiben unter open office. Nach langen fuddeln habe ich den unten stehenden Code geschrieben. Leider funktioniert er nicht so wie ich es möchte.

Problemstellung:
Ich habe ein writer Dokument mit Textelementen und verschiedenen Eingabefeldern (einfügen/feldbefehl/andere/funktion/eingabefeld). Die Eingabefelder möchte ich manuel verändern. Dazu habe ich mir gedacht, dass ich die Eingabefelder anlege und spezifisch benenne (einfügen/feldbefehl/andere/funktion/eingabefeld=hinweis). Das Makro soll gestartet werden wenn ich das erste Textfeld anklicke, was prinzipiell funktioniert.
Nun soll die Abfrage der Eingabefleder erfolgen. Dazu benutze ich die "Inputbox".
Bild

Beispiel:
Schritt 1 (erstmaliges öffnen des Dokuments): Klicke ich auf das erste im Text enthalten Eingabefeld, soll die oben angezeigte Inputbox erscheinen, wobei "name" die spezifische Bezeichnung des Eingabefelds darstellt und die Eingabe "hello" im Eingabefeld nach Eingabe erscheinen soll. Dannach folgen alle weiteren Abfragen, wie z.B. nach der Straße (sAdress) und Hausnummer (sNo.) usw. Alle Eingaben sollen im am Ende in den jeweiligen Eingabefeldern erscheinen. Dann kann ich das Dokument ausdrucken und gut.

Die nächsten Schritte: Da ich dieses Dokument manchmal ändern muss sollte beim nächsten öffnen, die Inputbox den Eintrag aus Schritt 1 beinhalten. Ich kann ihn also mit OK stehen lassen oder ändern.

Lösungsansatz
Mein Ansatz schaft es zwar eine Textpassage ("TextField1") zu erkennen und zu ersetzen, jedoch kein Eingabefeld. Den Befehl dazu habe ich nicht gefunden (???). Alles was ich probiere klappt irgdenwie nicht.

Fragen
Geht das überhaupt was ich mir vorstelle? Wenn ja wie, wenn nein, was kann ich dann alternativ machen?

Ziel
Derzeit gebe ich jedes Eingabefeld auch manuel ein, muss mich aber durch das gesamte Formular klicken, was enorm müsig ist.

Danke im vorraus

p.s. die Errorabfrage ist nur eine Spielerei, die ich gefunden habe, aber nicht unbedingt brauche.

Code: Alles auswählen

REM  *****  BASIC  *****

Sub getInfo

Dim sName as String
Dim sAddress as  String
Dim sNo as String
Dim vDescriptor, vFound

On Error GoTo Error_Handler

GetName:
sName = inputbox ("whats you name", "name")
If sName = "" Then
   sVar = MsgBox("You must enter a name",1)
   ' If Cancel was hit, stop macro
   If sVar = 2 Then
      Exit Sub
   Else
      GoTo GetName
   End If
End If
' Search for [TextField1]
  vDescriptor = ThisComponent.createSearchDescriptor()
  With vDescriptor
    .SearchString = "[TextField1]"
    .SearchWords = false
    .SearchCaseSensitive = False
    .ReplaceString = sName
  End With
  vFound = ThisComponent.replaceAll(vDescriptor)
 
  If vFound <> 1 Then
     MsgBox("Error: [TextField1] Not Found")
  End If
 
GetAddress: 
sAddress = inputbox ("whats your address", "address")
If sAddress = "" Then
   sVar = MsgBox("You must enter an address",1)
   ' If Cancel was hit, stop macro
   If sVar = 2 Then
      Exit Sub
   Else
      GoTo GetAddress
   End If
End If
' Search for [TextField2]
  vDescriptor = ThisComponent.createSearchDescriptor()
  With vDescriptor
    .SearchString = "[TextField2]"
    .SearchWords = false
    .SearchCaseSensitive = False
    .ReplaceString = sAddress
  End With
  vFound = ThisComponent.replaceAll(vDescriptor)
  If vFound <> 1 Then
     MsgBox("Error: [TextField2] Not Found")
  End If

GetNo:
sNo = inputbox ("whats your telephone number", "number")
If sNo = "" Then
   sVar = MsgBox("You must enter a telephone number",1)
   ' If Cancel was hit, stop macro
   If sVar = 2 Then
      Exit Sub
   Else
      GoTo GetNo
   End If
End If
' Search for [TextField3]
  vDescriptor = ThisComponent.createSearchDescriptor()
  With vDescriptor
    .SearchString = "[TextField3]"
    .SearchWords = false
    .SearchCaseSensitive = False
    .ReplaceString = sNo
  End With
  vFound = ThisComponent.replaceAll(vDescriptor)
  If vFound <> 1 Then
     MsgBox("Error: [TextField3] Not Found")
  End If

Exit Sub
Error_Handler:
MsgBox(Error)

End Sub 
Zuletzt geändert von Ibanez am Mo, 29.09.2008 15:57, insgesamt 1-mal geändert.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von komma4 »

Abschliessend (?) beantwortet im englischen Forum
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von turtle47 »

Hallo Ibanez ,
Ibanez hat geschrieben:Derzeit gebe ich jedes Eingabefeld auch manuel ein, muss mich aber durch das gesamte Formular klicken, was enorm müsig ist.
Dann erstelle Dir doch eine Eingabemaske wo Du direkt alles eingeben kannst. :lol:
Die Eingabemaske wird direkt beim Dokumentenstart aufgerufen.
Beispiel ist beigefügt.
FB_lesen_schreiben.odt
(11.06 KiB) 426-mal heruntergeladen
Hilft das weiter?

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
Ibanez
**
Beiträge: 40
Registriert: Fr, 25.07.2008 09:50

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von Ibanez »

Hallo Jürgen,
Hilft das weiter?

Jürgen
Prinzipiell wäre das in etwa das was ich such. Mmmh könntest Du mir mal kurz erläutern wie ich so was für meine Zwecke verändere, da wäre ich Dir sehr dankbar und ich erspare mir die Suche.

Wobei die Frage sich auf die Eingabmaske bezieht. Egal was ich ändere, es bleibt immer die selbe (3 Abfragen)!

Gruß und Dnake
Ibanez
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von turtle47 »

Hi Ibanez,
Ibanez hat geschrieben:Egal was ich ändere, es bleibt immer die selbe (3 Abfragen)!
Du musst zuerst den Dialog entsprechend anpassen. Diesen findest Du, wenn Du den Reiter "Dlg_FB" unten
auf der Seite wo der Code steht anklickst. :)
Über die "Kontrollfeld_Eigenschaften" kannst Du den Objekten die entsprechenden Namen vergeben
die Du dann in dem Code verwendest.

Schau Dir das erst mal an und dann reden wir weiter.

Viel Erfolg.

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
Ibanez
**
Beiträge: 40
Registriert: Fr, 25.07.2008 09:50

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von Ibanez »

Hi Jürgen, dass war der Denkanstoß den ich brauchte. Jetzt klappts, wenn auch etwas mühsam.

Wenn noch was unklar ist melde ich mich.

Grüße und vielen Dank
Ibanez
Ibanez
**
Beiträge: 40
Registriert: Fr, 25.07.2008 09:50

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von Ibanez »

Hallo Jürgen,

so jetzt bin ich soweit, dass ich nicht mehr weiter weiß.

Ich habe jetzt die Datei etwas verändert unter anderem habe ich im das Textfeld NameV benannt. Das ist wichtig, da es auch noch ein NameS geben soll. Das Problem ist, dass der Text perfekt ausgelesen wird, ich aber keinen entsprechenden Eintrag erhalte wenn ich es im Dialogfenster ändere. Das Problem liegt also im "Felbefehl_schreiben", aber wo?

Interessanterweise passiert der Fehler auch nur bei meinem Dokument. In Deinem Dokument funktioniert es.

Code: Alles auswählen

Dim MyDlg as Object
Dim String_NameV as String
Dim oDoc as Object
Dim oTextFieldMasters as Object
Dim TxtUserfield as String
Dim TxtName as String

Sub Dlg_FB
	Dialoglibraries.Loadlibrary("Standard")
	MyDlg= CreateUnoDialog(Dialoglibraries.Standard.Dlg_FB)
	Felbefehl_lesen

	Ctl_Name = MyDlg.GetControl("TextField_NameV")
		
	Ctl_Name.Model.Text = String_NameV
		
	Ctl_Name.setfocus()
	MyDlg.execute()
end Sub

Sub Felbefehl_lesen
	oDoc = thisComponent
	strUserfield_NameV = "NameV"
	On Error Resume Next
	oTextFieldMasters = oDoc.TextFieldMasters
	TxtUserfield_NameV="com.sun.star.text.FieldMaster.User." + StrUserfield_NameV
	String_NameV=oTextFieldMasters.getByName(TxtUserfield_NameV).content
	
Sub Felbefehl_schreiben
	oDoc = thisComponent

	strUserfield_NameV = "NameV"    
	Ctl_Name = MyDlg.GetControl("TextField_NameV")
	String_NameV = Ctl_Name.Model.Text	
	strContent_NameV = String_NameV
	
	On Error Resume Next
	oTextFieldMasters = oDoc.TextFieldMasters
		
	TxtUserfield_NameV="com.sun.star.text.FieldMaster.User." + StrUserfield_NameV
	oTextFieldMasters.getByName(TxtUserfield_NameV).content = StrContent_NameV
	
	oDoc.getTextFields().refresh()
	MyDlg.endexecute()
End Sub
merci vielmals

Fehlermeldung: "Basic-Laufzeitfehler. Objektvariable nicht belegt".
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von turtle47 »

Hi Ibanez,
Ibanez hat geschrieben:Fehlermeldung: "Basic-Laufzeitfehler. Objektvariable nicht belegt".
Es ist immer wichtig zu wissen an welcher Stelle die Fehlermeldung kommt.
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
Ibanez
**
Beiträge: 40
Registriert: Fr, 25.07.2008 09:50

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von Ibanez »

Es ist immer wichtig zu wissen an welcher Stelle die Fehlermeldung kommt.
Sorry, siehe Markierung

Sub Felbefehl_schreiben
oDoc = thisComponent

strUserfield_NameV = "NameV"
Ctl_Name = MyDlg.GetControl("TextField_NameV")
String_NameV = Ctl_Name.Model.Text
strContent_NameV = String_NameV

On Error Resume Next
oTextFieldMasters = oDoc.TextFieldMasters

TxtUserfield_NameV="com.sun.star.text.FieldMaster.User." + StrUserfield_NameV
oTextFieldMasters.getByName(TxtUserfield_NameV).content = StrContent_NameV

oDoc.getTextFields().refresh()
MyDlg.endexecute()
End Sub
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von turtle47 »

Zunächst fallen mir zwei Möglichkeiten ein.

1. Das Textfield mit dem Namen "TextField_NameV" existiert nicht in dem Dialog.
2. Der Dialog wird in einem anderen Modul aufgerufen und steht nicht zur Verfügung.
Abhilfe > Public MyDlg as Object

Hilft das weiter?

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
Ibanez
**
Beiträge: 40
Registriert: Fr, 25.07.2008 09:50

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von Ibanez »

Hallo Jürgen,

nochmals vielen dank, habe den Fehler gefunden, war nur ein Buchstabendreher an einer Stelle es funktioniert jetzt.

Ein frage habe ich aber noch :) gibt es die Möglichkeit mehrere Dialogfenster nacheinander einzublenden. Momentan erscheint beim öffnen der Datei das Dlg_FB. Ich möchte nun z.B. danach dass eine Dlg_FB1 (was ich noch erstellen muss) weitere Sachen abfragt, wie z.B. Geburtsdaten oder andere persönliche Dinge, erscheint. Wie binde ich denn sowas dann ein?

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

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von turtle47 »

Ibanez hat geschrieben:gibt es die Möglichkeit mehrere Dialogfenster nacheinander einzublenden.
Ja, mit einem mehrseitigen Dialog.

http://www.starbasicfaq.de/mehrseitiger.html
http://www.ooowiki.de/MehrseitigeDialoge

Viel Erfolg.

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:

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von ykcim »

Hallo Jürgen,

http://www.starbasicfaq.de/mehrseitiger.html
http://www.ooowiki.de/MehrseitigeDialoge

Ein link von beiden langt. Steht bei beiden der gleiche Inhalt.

mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
Ibanez
**
Beiträge: 40
Registriert: Fr, 25.07.2008 09:50

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von Ibanez »

@Jürgen,

so an dieser Stelle ein riesen Lob und einen herzlichen Dank für die Hilfestellung. Soweit klappt jetzt alles. Die links sind überaus hilfreich.

Eine letzte Frage sei jedoch gestattet. Ich habe mir an einer Stelle überlegt, eine Wahlmöglichkeit einzubauen. Dafür habe ich jetzt im Dialogfeld 2 Optionsfelder eingebaut
Bild
Ist es irgendwie möglich die Antwort auf mein Dokument zu Übertragen? D.h. je nach dem welche Option ich anklicke soll ein Haken auf meinem Dokument erscheinen. Ich habe viel versucht, gelesen und gesucht, nichts gefunden wie ich das einstellen soll. Vielleicht hat jemand einen Link oder eine Idee...

Ach ja hier noch ein Bildausschnitt meines Dokuments
Bild

Grüße
Ibanez
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Eingabefeld auslesen und ändern mit inputbox

Beitrag von turtle47 »

Hallo Ibanez,

auslesen des Optionsbuttons aus einem Dialog erfolgt so:

Code: Alles auswählen

Sub Auslesen_Optionsbutton
	Opt_Button1 = MyDialog.getControl("OptionButton1")
	State_Opt1 = Opt_Button1.model.State 
	msgbox State_Opt1
End Sub
Ansprechen einer Checkbox in einem Dokument erfolgt so:

Code: Alles auswählen

Sub Checkbox_ansprechen
	oDoc = thisComponent
	oController = oDoc.getCurrentController()
	oform = odoc.drawpage.forms.getbyindex(0)
	CtrlCheckBox = oForm.getByName("CheckBox1")'Achtung: Namen anpassen
	oKView = oController.getControl(CtrlCheckBox)
	CtrlCheckBox.State= 1 'State 1 = setzen / 0 = abwählen
	Myctrl= oKView.model.State 'Status auslesen
	msgbox "Die Checkbox hat jetzt den Status: " & Myctrl
End Sub[
Schöne Grüsse.

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