"Crash-Kurs BASIC und Dialoge"?

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

Moderator: Moderatoren

marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Eingabefelder in Dialog

Beitrag von marcel_at_work »

Hallo Dirk,
Falls Dich das ärgert/ stört soll ich dir dann lieber keine Dateeub senden???
Vielleicht veröffentlichst du einfach den Code, das geht für mich schneller - und andere können dir dann auch helfen! 8)
Kann ich für die Einblendung des Feldes "oMatSt" jetz auch sagen es soll nur das Feld "oMatSt" wieder sichtbar geschaltet werdem (in der Sub EingabeEin_Aus(...) oder muss ich dann eine extra Sub schreiben die nur das Feld "oMatSt" sichtbar macht ??
Hier ist ein Beispiel für die Verwendung von Arrays als Parameter in einer Funktion - auf diese Weise kann man jede Funktion vielseitig und übersichtlich erweitern.
Wenn du den vorhandenen Code wie folgt änderst, kannst du alle nötigen Änderungen zur gleichen Zeit machen:

Code: Alles auswählen

setVisibles(Array(oMatSt, False,_
		  oMatNr, True,_
		  oWasAuchImmer, True,_
		  ..., ...))

'Funktion zum steuern der Sichtbarkeit von Objekten
Public Sub setVisibles(arrValues())
	Dim n As Integer
	
	'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
	For n = 0 To ubound(arrValues()) Step 2
		arrValues(n).Visible = arrValues(n + 1)
	Next
End Sub 
Dieses Array kannst du um weitere Dimensionen erweitern, oder nur weitere Elemente hinzufügen, also statt 2 Elementen pro Zuweisung, dann eben 3 oder 4. Hierzu ist dann der Step-Wert in der Schleife und ggf. der Index von arrValues(...) zu berücksichtigen.

Hast du dir nun diese (oder irgendeine) Dokumentation mal genauer angeschaut?

Viele Grüße,

Marcel
Zuletzt geändert von marcel_at_work am Fr, 13.12.2019 21:17, insgesamt 1-mal geändert.
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Eingabefelder in Dialog

Beitrag von pcdirk91 »

Hallo Marcel,
wünsche Dir erstma einen schönen Rest Sonntag.
Ich habe nun einen Teil des Codes überarbeitet. Erstmal soweit das die Prozedur "P-MatAnlegen" soweit funzt, das der Dialog aufgerufen wird und veim Abbrechen eine entsprechende Meldubg ausgibt. Dabei konnte ich die Anzahl der Var. Im Kopfbereich des Modules Material wesentlich kjürzen.
Habe auch funktion oder Sub für die Einzelnen Felder des DIaloges erstellt . Vielleocht kannst Du mal drüberschauen ob ich Deine Einwände besser verstanden habe und ob Du damit zufriedener bist.
Beim Code habe ich versucht die Bemerkungen raus zu löschen. V ielleicht sollten wir einen Code Editor zum versenden des Codes Benutzen *Wäre vielleicht einfacher Ich habe das Notepadd+++.
Dim oDlg_Dialog as Object
Dim oDlg_Meldung as Object
Dim oOkButton as Object
Dim oAbButton as Object
Dim oMatBez as Object
Dim oMatSt as Object
Dim oMatNr as Object
Dim oTextAnweisg as Object
Dim oTextFehler as Object
Dim oTextSt as Object
Dim oTextEinheit as Object
Dim oTextNr as Object
Dim aMatListe as Object
Dim oControls as Object
Dim oKeyListener as Object
Dim oColumnModel as Object
Dim oDataModel as Object
Dim oGridModel as Object
Dim oGridControl as Object
Dim oMyGrid as Object
Dim Zeile_Id as Integer
Dim Meldung as Integer
Dim ttl as Variant
Dim ttr as Variant
Dim tto as Variant
Dim ttu as Variant
Dim MyGrid as Variant


Sub P_MatAnlegen
oView.setActiveSheet(oTbHin)
oTbEin.GetCellRangeByName("D25").String = "MaterialAnAeLoe"
oTbEin.GetCellRangeByName("E25").String = "Anlegen"
oTbEin.GetCellRangeByName("F25").String = "Material anlegen"
oTbEin.GetCellRangeByName("G25").String = "Material "& chr(126) & "anlegen"
oTbEin.GetCellRangeByName("H25").String = "Nehmen Sie die notwendigen Eingaben vor !!!"
oTbEin.GetCellRangeByName("I25").Value = 10
oTbEin.GetCellRangeByName("J25").Value = 3
oTbEin.GetCellRangeByName("E39").String = "Die Bezeichnung muss mind. 3 Zeichen lang sein, und mit " &_
+ chr(8222) & "ENTER" & chr(8220) &" bestätigt werden."
oTbEin.GetCellRangeByName("F39").String = "Die Stärke muss im Bereich zwischen 1 und 28 mm liegen," _
+ "und mit "& chr(8222) & "ENTER" & chr(8220) & _
+ " bestätigt werden."
oTbEin.GetCellRangeByName("G39").String = "Die Material-Nr wird automatisch aus der Bezeichnung "_
+ "und der Stärke gebildet."
' Die Fehlertexte ins Blatt "Einstellungen" eintragen
oTbEin.GetCellRangeByName("E53").String = "Die Bezeichnung muss belegt sein !!!"
oTbEin.GetCellRangeByName("F53").String = "Die Bezeichnung muss zwischen 3 und 20 Zeichen lang " & _
+ "sein !!!"
oTbEin.GetCellRangeByName("G53").String = "Die Stärke muss zwischen 2 und 28 mm betragen !!!"
oTbEin.GetCellRangeByName("H53").String = "Dieses Material existiert bereits !!!"

' Prozedur zum Erstellen und Einstellen des Dialoges "MaterialAnAeLoe"
Dialog_MatAnAeLoe
' Der Dialog "MaterialAnAeLoe" wird ausgewertet; Rückgabewert "0" mit Button "Abbrechen oder mit "x"
If oDlg_Dialog.Execute = 0 Then
UnregisterKeyListener ' Der Key-Listener wird wieder entladen
oTbEin.getCellRangeByName("R6").Value = 0
oTbEin.getCellRangeByName("S6").Value = 1

' Der Dialog "MaterialAnAeLoe" wurde abgebrochen
Dialog_MatMeldung
If oDlg_Meldung.Execute = 0 Then
' Der Dialog "MaterialAnAeLoe" wurde abgebrochen
AbruchMatAnAeLoe: ' Die Sprungmarke "AbruchMatANAELoe" wurd durchlaufen wenn der Dialog "MaterialANAELoe" abgebrochen wurde
Arg=Array(oTbEin.getCellRangeByName("K6:S6"), oTbEin.getCellRangeByName("D25:J25"),_
+ oTbEin.getCellRangeByName("E39:S39"),oTbEin.getCellRangeByName("E53:S53"))
For i = 0 To UBOUND(arg) ' Die Schleifen solange Argumente vorhanden sund durchlaufen
oBereich = arg(i) ' Die Object Var. "oBereich" mit dem Argument belegen
oBereich.clearContents(com.sun.star.sheet.CellFlags.VALUE _
+com.sun.star.sheet.CellFlags.STRING)
Next i ' Den Zähler "i" um den Wert "1" erhöhen und zum Schleifenbeginn springen
Exit Sub ' Die Prozedur wird vorzeitig beendet
Else
' Der Dialog "MaterialAnAeLoe" wurde mit "Ok" beendet
Goto AbruchMatAnAeLoe ' Weiter an der Sprungmarke "AbruchMatANAELoe"
End If
End If

End Sub

Sub Dialog_MatAnAeLoe
Dim oTitel as Object
Dim DialogBreite as Long
Dim DialogHoehe as Long
Dim BildBreite as Long : BildBreite = oTbEin.getCellRangeByName("E18").String
Dim BildHoehe as Long : BildHoehe = oTbEin.getCellRangeByName("E19").String
Dim DialogName as String : DialogName = oTbEin.getCellRangeByName("D25").String
Dim Gmenu as String : Gmenu = oTbEin.getCellRangeByName("E25").String
Dim Titel as String : Titel = oTbEin.getCellRangeByName("F25").String
Dim TButton as String : TButton = oTbEin.getCellRangeByName("G25").String
Dim Anweisung as String : Anweisung = oTbEin.getCellRangeByName("H25").String
Dim H_MatBez as String : H_MatBez = oTbEin.getCellRangeByName("E39").String
Dim H_MatSt as String : H_MatSt = oTbEin.getCellRangeByName("F39").String
Dim H_MatNr as String : H_MatNr = oTbEin.getCellRangeByName("G39").String

oDlg_Dialog = CreateUnoDialog(oLib.getByName(DialogName))
DialogBreite = oDlg_Dialog.Size.Width
DialogHoehe = oDlg_Dialog.Size.Height
xPos = (BildBreite-DialogBreite)/2
yPos = (BildHoehe-DialogHoehe)/2
oDlg_Dialog.setPosSize(xPos,yPos,DialogBreite,DialogHoehe,com.sun.star.awt.PosSize.POSSIZE)

'Die Button und Eingabefelder in Object Var. aufnehmen
oTitel = odlg_Dialog.model
oOkButton1 = odlg_Dialog.getControl("CommandButton1")
oOkButton = odlg_Dialog.model.controlModels(0)
oAbButton = odlg_Dialog.model.controlModels(1)
oMatBez = odlg_Dialog.getControl("MatBez")
oMatSt = odlg_Dialog.getControl("MatSt")
oMatNr = odlg_Dialog.getControl("MatNr")

'Die Textfelder (Labels) in Object Var. aufnehmen
oTextAnweisg = odlg_Dialog.getControl("Label1")
oTextFehler = odlg_Dialog.getControl("Label2")
oTextBez = odlg_Dialog.getControl("Label3")
oTextSt = odlg_Dialog.getControl("Label4")
oTextEinheit = odlg_Dialog.getControl("Label5")
oTextNr = odlg_Dialog.getControl("Label6")
If Gmenu = "Anlegen" then
oTitel.Title= Titel
oTextAnweisg.Text = Anweisung
SetHelpText(Array(oMatBez,H_MatBez,oMatSt,H_MatSt,oMatNr,H_MatNr))
SetLabelEin_Aus(Array(oMatSt,False,oMatNr,False,oTextFehler,False,oTextSt,False,oTextEinheit,_
+False,oTextNr,False))
SetButtonLabel(Array(oOkButton,TButton,oAbButton,"A~bbrechen"))
SetButtonPositionX(Array(oOkButton,10,oAbButton,57)
SetButtonEin_Aus(Array(oOkButton,False)
SetFocus(oMatBez)
ElseIf Gmenu = "Aendern" then
oTitel.Title= Titel
oTextAnweisg.Text = Anweisung
SetHelpText(Array(oMatBez,H_MatBez,oMatSt,H_MatSt,oMatNr,H_MatNr))
SetLabelEin_Aus(Array(oMatSt,True,oMatNr,True,oTextFehler,False,oTextSt,True,oTextEinheit,_
+True,oTextNr,True))
SetButtonLabel(Array(oOkButton,TButton,oAbButton,"A~bbrechen"))
SetButtonPositionX(Array(oOkButton,10,oAbButton,105)
SetButtonEin_Aus(Array(oOkButton,True)
SetFocus(oOkButton1)
ElseIf Gmenu = "Loeschen" then
oTitel.Title= Titel
oTextAnweisg.Text = Anweisung
SetLabelEin_Aus(Array(oMatSt,True,oMatNr,True,oTextFehler,False,oTextSt,True,oTextEinheit,_
+True,oTextNr,True))
SetLabelDeaktiv_AKtiv(Array(oMatBez,False,oMatSt,False,oMatNr,False,oTextFehler,False,oTextSt,_
+ False,oTextEinheit, False,oTextNr, False))
SetLabelHintergrund(Array(oMatBez,RGB(221,221,221),oMatSt,RGB(221,221,221), _
+ oMatSt,RGB(221,221,221),oMatNr,RGB(221,221,221)))
SetButtonLabel(Array(oOkButton,TButton,oAbButton,"A~bbrechen"))
SetButtonPositionX(Array(oOkButton,10,oAbButton,105)
SetButtonEin_Aus(Array(oOkButton,True)
Else
'Fehlerbehandlung entwickeln
End If
' Den Key-Listener laden
RegisterKeyListener
End Sub

Public Function SetHelpText(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).Model.helptext = arrValues(n + 1)
Next
End Function

Public Function SetLabelText(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).Text = arrValues(n + 1)
Next
End Function

Public Function SetLabelEin_Aus(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).Visible = arrValues(n + 1)
Next
End Function

Public Function SetLabelDeaktiv_Aktiv(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).Enable = arrValues(n + 1)
Next
End Function

Public Function SetLabelHintergrund(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).Model.BackgroundColor = arrValues(n + 1)
Next
End Function

Public Function SetLabelSchriftFarbe(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).Model.TextColor = arrValues(n + 1)
Next
End Function

Public Function SetFocus(o1 as Object)
o1.setFocus
End Function

Public Function SetButtonLabel(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).Label = arrValues(n + 1)
Next
End Function

Public Function SetButtonPositionX(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).Positionx = arrValues(n + 1)
Next
End Function

Public Function SetButtonEin_Aus(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).enableVisible = arrValues(n + 1)
Next
End Function
Sub Dialog_MatMeldung
Dim oTitel as Object
Dim DialogBreite as Long
Dim DialogHoehe as Long
Dim BildBreite as Long : BildBreite = oTbEin.getCellRangeByName("E18").String
Dim BildHoehe as Long : BildHoehe = oTbEin.getCellRangeByName("E19").String
Dim AnzButton as Integer : AnzButton = oTbEin.getCellRangeByName("U6").Value
Dim DialogAbbruch as Integer : DialogAbbruch = oTbEin.getCellRangeByName("R6").Value
Dim TButton as String : TButton = oTbEin.getCellRangeByName("V6").String
Dim TButton1 as String : TButton1 = oTbEin.getCellRangeByName("W6").String
Dim Titel as String : Titel = oTbEin.getCellRangeByName("X6").String
Dim TextZeile1 as String : TextZeile1 = oTbEin.getCellRangeByName("Y6").String
Dim TextZeile2 as String : TextZeile2 = oTbEin.getCellRangeByName("Z6").String
Dim TextZeile3 as String : TextZeile3 = oTbEin.getCellRangeByName("AA6").String
Dim TextZeile4 as String : TextZeile4 = oTbEin.getCellRangeByName("AB6").String

oDlg_Meldung = CreateUnoDialog(oLib.getByName("MeldungAusgeben"))
DialogBreite=oDlg_Meldung.Size.Width
DialogHoehe=oDlg_Meldung.Size.Height
xPos = (BildBreite-DialogBreite)/2
yPos = (BildHoehe-DialogHoehe)/2
oDlg_Meldung.setPosSize(xPos,yPos,DialogBreite,DialogHoehe,com.sun.star.awt.PosSize.POSSIZE)

'Die Elemente im Dialog MeldungAusgeben in die Var. übernehmen
oTitel = odlg_Meldung.model
oOKButton = odlg_Meldung.model.controlModels(0)
oOkButton1 = odlg_Meldung.model.controlModels(1)
oTextZeile1 = odlg_Meldung.getControl("Label1")
oTextZeile2 = odlg_Meldung.getControl("Label2")
oTextZeile3 = odlg_Meldung.getControl("Label3")
oTextZeile4 = odlg_Meldung.getControl("Label4")

If AnzButton = 1 then
oTitel.Title= Titel
SetLabelText(Array(oTextZeile1,TextZeile1,oTextZeile2,TextZeile2,oTextZeile3,TextZeile3,_
+ oTextZeile4,TextZeile4))
SetButtonLabel(Array(oOkButton,TButton))
SetButtonPositionX(Array(oOkButton,40))
SetButtonEin_Aus(Array(oOkButton1,False))
ElseIf AnzButton = 2 then
oTitel.Title= Titel
SetLabelText(Array(oTextZeile1,TextZeile1,oTextZeile2,TextZeile2,oTextZeile3,TextZeile3,_
+ oTextZeile4,TextZeile4))
SetButtonLabel(Array(oOkButton,TButton,oOkButton1,TButton1))
SetButtonPositionX(Array(oOkButton,7,oOkButton1,75))
SetButtonEin_Aus(Array(oOkButton,True,oOkButton1,True))
Else
'Fehlerbehandlung entwickeln
End If
If DialogAbbruch = 0 Then
SetLabelSchriftFarbe(Array(oTextZeile3,""))
ElseIf DialogAbbruch = 1 Then
SetLabelSchriftFarbe(Array(oTextZeile3,16728064))
Else
'Fehlerbehandlung entwickeln
End If
End Sub

Sub RegisterKeyListener
for i=1 to anzFelder
oControls=oDlg_Dialog.tabControllers(0).controls
oKeyListener = createUnoListener("oKey_", "com.sun.star.awt.XKeyListener")
oControls(i).addKeyListener(oKeyListener)
next i
End Sub

Sub UnregisterKeyListener
for i=1 to anzFelder
oControls=oDlg_Dialog.tabControllers(0).controls
oControls(i).removeKeyListener(oKeyListener)
next i
End Sub
Ich hoffe Du erschlägst mich jetzt nicht.

Gruss Dirk
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Eingabefelder in Dialog

Beitrag von marcel_at_work »

Hallöchen Dirk,

danke, hatte ich soweit... 8)
V ielleicht sollten wir einen Code Editor zum versenden des Codes Benutzen *Wäre vielleicht einfacher Ich habe das Notepadd+++.
Zum Veröffentlichen von Programmcode gibt es oben, rechts neben dem "Zitat"-Knopf, den "Code"-Knopf. Diesen einfach drücken und dann den Code aus deinem Programm einfügen - der Code wird anschließend in einem vernünftig zu lesenden Format angezeigt.
Vielleocht kannst Du mal drüberschauen ob ich Deine Einwände besser verstanden habe und ob Du damit zufriedener bist.
Meine Äußerungen wollte ich nur als Gedankenanstoß verstanden haben. Du solltest aus eigenem Interesse endlich diese Dokumentation lesen, weil es dir außerordentlich helfen würde... :shock:

In Ermangelung an Zeit, habe ich jetzt nur den Anfang mal durchgesehen:

1) Funktioniert dieser bestehende Code bei dir ohne Fehler?

Code: Alles auswählen

oTbEin.GetCellRangeByName("F39").String = "Die Stärke muss im Bereich zwischen 1 und 28 mm liegen," _
+ "und mit "& chr(8222) & "ENTER" & chr(8220) & _
+ " bestätigt werden."
Mit "+" oder "&" werden u.a. Strings zusammengefügt und ein "_" erweitert eine Zeile nach unten (entfernt sozusagen den Umbruch). Du benötigst also nur einmal eines dieser Verbindungszeichen, nicht "& _+".

Code: Alles auswählen

For i = 0 To UBOUND(arg) ' Die Schleifen solange Argumente vorhanden sund durchlaufen
oBereich = arg(i) ' Die Object Var. "oBereich" mit dem Argument belegen
oBereich.clearContents(com.sun.star.sheet.CellFlags.VALUE _
+com.sun.star.sheet.CellFlags.STRING)
Next i ' Den Zähler "i" um den Wert "1" erhöhen und zum Schleifenbeginn springen
Auf "Next" folgt kein weiteres Zeichen. Die Syntax der FOR-Anweisung lautet:

Code: Alles auswählen

For i = ... To ...

Next

Code: Alles auswählen

Arg=Array(oTbEin.getCellRangeByName("K6:S6"), oTbEin.getCellRangeByName("D25:J25"),_
+ oTbEin.getCellRangeByName("E39:S39"),oTbEin.getCellRangeByName("E53:S53"))
... siehe weiter oben. Beim Erweitern einer Zeile mit Underline "_" benötigt man keine weiteres Verbindungszeichen. Das "+" bräuchtest du nur, wenn du irgendetwas zusammenführen möchtest, aber die Array-Elemente stehen ja für sich allein.

2) Es ist allgemein sehr anstrengend, den Code ohne Einrückung (die Formatierung, die du mit der Zitatfunktion gelöscht hast) zu lesen, vielleicht kannst du den Code oben einfach nochmal ändern?!

Code: Alles auswählen

Public Function SetFocus(o1 as Object)
o1.setFocus
End Function
Diese Funktion ist überflüssig. Dein Objekt o1 hat ja selbst die Methode "setFocus", z.B. oMeinTextfeld.setFocus().

3) Ich finde gut, daß du Routinen jetzt mit einem erweiterten Funktionsumfang benutzt. Meine Anregungen waren aber nur Beispiele, die du mit kurzem Blick in die Dokumentation noch sehr viel effektiver machen kannst/solltest.

Code: Alles auswählen

If oDlg_Meldung.Execute = 0 Then
' Der Dialog "MaterialAnAeLoe" wurde abgebrochen
AbruchMatAnAeLoe: ' Die Sprungmarke "AbruchMatANAELoe" wurd durchlaufen wenn der Dialog "MaterialANAELoe" abgebrochen wurde
Arg=Array(oTbEin.getCellRangeByName("K6:S6"), oTbEin.getCellRangeByName("D25:J25"),_
+ oTbEin.getCellRangeByName("E39:S39"),oTbEin.getCellRangeByName("E53:S53"))
For i = 0 To UBOUND(arg) ' Die Schleifen solange Argumente vorhanden sund durchlaufen
oBereich = arg(i) ' Die Object Var. "oBereich" mit dem Argument belegen
oBereich.clearContents(com.sun.star.sheet.CellFlags.VALUE _
+com.sun.star.sheet.CellFlags.STRING)
Next i ' Den Zähler "i" um den Wert "1" erhöhen und zum Schleifenbeginn springen
Exit Sub ' Die Prozedur wird vorzeitig beendet
Else
' Der Dialog "MaterialAnAeLoe" wurde mit "Ok" beendet
Goto AbruchMatAnAeLoe ' Weiter an der Sprungmarke "AbruchMatANAELoe"
End If
Die Meldung wird hier immer angezeigt, egal was gedrückt wird? Ist dies so gewollt?

Code: Alles auswählen

Public Function SetButtonLabel(arrValues())
Dim n As Integer
'das Array wird mit dem Faktor 2 durchlaufen, da als Funktions-Parameter Schlüssel-Wert-Paare benutzt werden
For n = 0 To ubound(arrValues()) Step 2
arrValues(n).Label = arrValues(n + 1)
Next
End Function 
Ich kann's grad nicht prüfen... Hat ein Label-Objekt nicht auch direkt eine Label-Eigenschaft?
>>> Grundlegend solltest du (spätestens) jetzt Objekte öfters mit Xray anschauen, um deren Eigenschaften und Methoden abzufragen. Sonst schreibst du vielleicht unnötig Code für irgendwelche Funktionen, die schon existieren.

So,... muss früh raus, wünsche noch einen wundervollen Abend.

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Eingabefelder in Dialog

Beitrag von pcdirk91 »

Hi Marcel,
erstmal Danke für Deine Geduld. Ich wollte mich nur auf deine Antwort hin melden.
Ich denke ich bin an die ganze Sache falsch heran gegangen. uch habe mich hingesetzt und den Code soweit ich Ihn kannte bzw ais den Dokumentationen "im Internet" versucht zu verstehen. soll heussen, wenn ich auf ein Problem stoße veruche ich es aus Beispielen heraus zu lösen.
Die Dokumentation von "Andrew Pitonyak" hat 715 Seiten und diese komplett zulesen und begreifen fällt mir sehr schwer. Daher habe ich den oben beschriebenen Weg gewählt. Ist vieleicht faösch.
Meine Äußerungen wollte ich nur als Gedankenanstoß verstanden haben. Du solltest aus eigenem Interesse endlich diese Dokumentation lesen, weil es dir außerordentlich helfen würde.
Nicht falsch verstehen ich will ja verbessert werden. Ich bin für jeder Anregung dankbar.

Nun Konkret zu Deinen Anmerkungen:

Code: Alles auswählen

oTbEin.GetCellRangeByName("F39").String = "Die Stärke muss im Bereich zwischen 1 und 28 mm liegen," _
+ "und mit "& chr(8222) & "ENTER" & chr(8220) & _
+ " bestätigt werden."
Funktioniert ohne Fehlermeldung bei mir. Ich wolölte in dem String die Gänsefüßchen unten und oben haben. (Scheiss deutsche Ausnahme
Das mit dem "_+" habe ich mal getestet, und wie Du glaube ich auch geschrieben hast , miss ich das Plus nur bei Strings die durch den "_" getrennt werden einsetzen. *Werde ich überarbeiten.

zu der For Schleife:
"Andrew Pitonyak" hat im Punkt 3.9.9. For ... Next folgendes beschrieben

Code: Alles auswählen

For zähler = startwert To endwert [Step schrittWert]
Anweisungsblock1
[Exit For]
Anweisungsblock2
Next [zähler]
Die numerische Variable „zähler“
Daher bei mir das "next i" ich habe das ohne das i getestet und es funzt ==> wird geändert.

zu 2:
die Einrückungen sind bei mir immer drinnen wegen der Lesbarkeit, wie Du ja auch schreibst. Durch das Löschen der Kommentare in Writer sind die Verlorengegangen. Den Tip mit Code einführen wusste ich noch nicht . Ist in meinem Hirn abgespeichert
Den Punkt mit Set.Focus() ist richtig geht auch ohne Function. Ich habe dich nur so verstanden das SIe leichter lesbar ist als z.B. "oMatBez.setfocus"
Werde ich aber abändern.
Zu 3:
3) Ich finde gut, daß du Routinen jetzt mit einem erweiterten Funktionsumfang benutzt. Meine Anregungen waren aber nur Beispiele, die du mit kurzem Blick in die Dokumentation noch sehr viel effektiver machen kannst/solltest.
Das Array was ich dort Erstelle habe ich auf die Schnelle erstellt . Gute Idee das in eine Function zu packen. Aber dabei Habe ich noch eine Frage an Dich (sicherlich lapidar und irgendwo beschrieben; finde es aber nicht) Meine Idee war die Functionen in eine zu schreiben und dann je nachdem welche aufgerufen wurde zu dieser dann zu springen. Also praktisch eine Abfrage welche Function benötigt wird und dann genau zu diesem Punkt zu soringen. damit könnte man die Anzahl der Einträge der Functionen reduzieren. Was sagst du dazu??
Die Meldung wird hier immer angezeigt, egal was gedrückt wird? Ist dies so gewollt?
Ja das ist gewollt. Wenn man den Dialog "Material AnAeLoe" abbricht soll der Abbruch durch die Meldung angezeigt werden. Damit man Due Meldung entweder mit "x" oder mit "Ok" bekommt habe ich das so gelöst. Nicht gut???

Tut mir Leid das Du im Moment so viel um die Ohren hast. Ich freue mich wenn ich eine Antwort von Dir bekommen (und wenn es etwas Dauert dann ist es auch ok. Ich arbeite ja weiter an der Sache) Also mach DIr keinen Kopf. Ich hoffe es kehrt bald wieder mehr Ruhe bei Dir ein. Ich wünsche Dir eine erfolgreiche Zeit bis Du wieder antorten kannst.

Gruss Dirk
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Eingabefelder in Dialog

Beitrag von pcdirk91 »

Hi Marcel,
wollte die nur den Code nochmals unverändert übermitteln (hoffentlich jetzt lesbarer

Die im Kopf des Modul definiert Variablen (die mit " ' " ausgegrauten werden nicht mehr benötigt)

Code: Alles auswählen

Dim oDlg_Dialog       as Object																			' Die Deklaration der Var. "oDlg_Dialog" as object (wird benötigt um den Dialog anzeigen zu können)
Dim oDlg_Meldung      as Object																			' Die Deklaration der Var. "oDlg_Meldung" as object (wird benötigt um den Dialog anzeigen zu können)
Dim oOkButton		  as Object																			' Die Deklaration der Var. "oOkButton" as object (der Ok-Button im Dialog "Material anlegen")
Dim oAbButton		  as Object																			' Die Deklaration der Var. "oABButton" as object (der Abbrechen-Button im Dialog "Material anlegen")
Dim oMatBez           as Object																			' Die Deklaration der Var. "oMatBez" as object (das EingabeFeld "Material-Bezeichnung" im Dialog "Material anlegen")
Dim oMatSt		      as Object																			' Die Deklaration der Var. "oMatSt" as object (das EingabeFeld "Material-Stärke" im Dialog "Material anlegen")
Dim oMatNr			  as Object																			' Die Deklaration der Var. "oMatNr" as object (das EingabeFeld "Material-Nr" im Dialog "Material anlegen")
Dim oTextAnweisg	  as Object																			' Die Deklaration der Var. "oAnweisung" as object (das TextFeld "Label1" im Dialog "Material anlegen")
Dim oTextFehler		  as Object																			' Die Deklaration der Var. "oFehler" as object (das TextFeld "Label2" im Dialog "Material anlegen")    
Dim oTextSt  	 	  as Object																			' Die Deklaration der Var. "oTextMatSt" as object (das TextFeld "Material-Stärke" im Dialog "Material anlegen")
Dim oTextEinheit      as Object																			' Die Deklaration der Var. "oTextEinheit" as object (das TextFeld "mm" im Dialog "Material anlegen")
Dim oTextNr	    	  as Object																			' Die Deklaration der Var. "oTextMatNr" as object (das TextFeld "Material-Nr" im Dialog "Material anlegen")
Dim aMatListe         as Object																			' Die Deklaration der Var. "aMatListe" as object (für das Array aller Materialien) 
Dim oControls         as Object																			' Die Deklaration der Var. "oControls" as object (für den Key-Listener) 
Dim oKeyListener      as Object																			' Die Deklaration der Var. "oKeyListener" as object (für den Key-Listener) 
Dim oColumnModel      as Object																			' Die Deklaration der Var. "oColumnModel" als Object (beeinhaltet eine Splate im Grid)
Dim oDataModel        as Object																			' Die Deklaration der Var. "oDataModel" als Object (beinhaltet den Datensatz eines angelegten Benutzers)
Dim oGridModel        as Object																			' Die Deklaration der Var. "oGridModel" als Object 
Dim oGridControl      as Object																			' Die Deklaration der Var. "oGridControl" als Object 
Dim oMyGrid		      as Object																			' Die Deklaration der Var. "oMyGrid" als Object 
'Dim BildBreite        as long																			' Die Deklaration der Var. "Bildbreite" als lomg (wird zum Positionieren des Dialoges benötigt)
'Dim BildHoehe         as long																			' Die Deklaration der Var. "Bildhoehe" als Long  (wird zum Positionieren des Dialoges benötigt)
'Dim DialogBreite      as long																			' Die Deklaration der Var. "DialogBreite" als Long (wird zum Positionieren des Dialoges benötigt)
'Dim DialogHoehe       as long																			' Die Deklaration der Var. "DialogHoehe" als Long (wird zum Positionieren des Dialoges benötigt)
'Dim Rueckwert         as Integer																		' Die Deklaration der Var. "Rueckwert" als Wert (Ob der Dialog mit "Ok" geschlossen wurde oder mit "Abbrechen" oder "x")
'Dim anzFelder         as Integer																		' Die Deklaration der Var. "anzFelder" als Wert (Die Anzahl der Buttons, Textfelder und Eingabefelder des Dialoges)
'Dim anzEingabe        as Integer																		' Die Deklaration der Var. "anzFelder" als Wert (Die Anzahl der Eingabefelder des Dialoges)
'Dim anzMat            as Integer																		' Die Deklaration der Var. "anzMat" als Integer (enthält die anzahl der angelegten Materialien)
'Dim vonZeile          as Integer																		' Die Deklaration der Var. "vonZeile" als Integer (beinhaltet die Zeile als Index des 1. Datensatzen)
'Dim bisZeile          as Integer																		' Die Deklaration der Var. "bisZeile" als Integer (beinhaltet die zeile als Index des letzten Datensatzes)
Dim Zeile_Id          as Integer																		' Die Deklaration der Var. "zeileText3" als String (wird für die Zeile des 1. freien Datensatzes verwendet)er
Dim Meldung           as Integer																		' Die Deklaration der Var. "Meldung" als Integer (wird für den Dialog "MeldungAusgeben" benötigt
'Dim GMenu             as String																			' Die Deklaration der Var. "GMenu" als String (wird zum Abfragen welcher Menüpnkt gewählt wurde benötigt)
'Dim BibliothekName    as String																			' Die Deklaration der Var. "BibliothekName" als String (wird zum Ermitteln der aufzurufenden Libairies benötigt)
'Dim DialogName        as String																			' Die Deklaration der Var. "DialogName" als String (Wird für den Aufruf des entsprechenden Dialog benötigt)
Dim ttl               as Variant																		' Die Deklaration der Var. "ttl" als Variant (beinhaltet den linken  Rand des Tabellen-Grids)
Dim ttr               as Variant																		' Die Deklaration der Var. "ttr" als Variant (beinhaltet den rechten Rand des Tabellen-Grids)
Dim tto               as Variant																		' Die Deklaration der Var. "tto" als Variant (beinhaltet den oberen  Rand des Tabellen-Grids)
Dim ttu               as Variant																		' Die Deklaration der Var. "ttl" als Variant (beinhaltet en unteren  Rand des Tabellen-Grids)
Dim MyGrid		      as Variant																		' Die Deklaration der Var. "MyGrid" als Variant (beinhaltet den Namen des Tabellen-Grids)
Die Prozedur "P_MatAnlegen" zum Starten ausführen

Code: Alles auswählen

Sub P_MatAnlegen																						' Prozedur zum Anlegen eines Materials
' oView.setActiveSheet(oTbHin)																			' Das Blatt "Hintergrund" sichtbar machen
 ' DIe Infos für den DIalog "MatAnAeLoe"  ins Blatt "Einstellungen" eintragen 
 oTbEin.GetCellRangeByName("D25").String = "MaterialAnAeLoe"											' Den DialogNamen  "MaterialAnAeLoe"         ins Blatt "Einstellungen" zelle "D25" eintragen
 oTbEin.GetCellRangeByName("E25").String = "Anlegen"													' Die Prozedurart  "Anlegen"                 ins Blatt "Einstellungen" zelle "E25" eintragen
 oTbEin.GetCellRangeByName("F25").String = "Material anlegen"											' Den Dialogtitel  "Material anlegen"        ins Blatt "Einstellungen" zelle "F25" eintragen 
 oTbEin.GetCellRangeByName("G25").String = "Material "& chr(126) & "anlegen"							' Die Schaltfläche "M aterial ~ablegen"      ins Blatt "Einstellungen" zelle "G25" eintragen 
 oTbEin.GetCellRangeByName("H25").String = "Nehmen Sie die notwendigen Eingaben vor !!!"				' Die Schaltfläche "M aterial ~ablegen"      ins Blatt "Einstellungen" zelle "H25" eintragen 
 oTbEin.GetCellRangeByName("I25").Value  = 10															' Die Anzahl aller Felder des Dialoges       ins Blatt "Einstellungen" zelle "I25" eintragen 
 oTbEin.GetCellRangeByName("J25").Value  = 3															' Die Anzahl der Eingabe-Felder des Dialoges ins Blatt "Einstellungen" zelle "J25" eintragen  

 ' Die Helptexte ins Blatt "Einstellungen" eintragen
 oTbEin.GetCellRangeByName("E39").String = "Die Bezeichnung muss mind. 3 Zeichen lang sein, und mit " &_
 											+ chr(8222) & "ENTER" & chr(8220) &" bestätigt werden."		' Der Helptext für das Feld "MatBez"       ins Blatt "Einstellungen" zelle "E39" eintragen 
 oTbEin.GetCellRangeByName("F39").String = "Die Stärke muss im Bereich zwischen 1 und 28 mm liegen," _
 											+ "und mit "& chr(8222) & "ENTER" & chr(8220) & _
 											+ " bestätigt werden."										' Der Helptext für das Feld "MatSt"        ins Blatt "Einstellungen" zelle "F39" eintragen 
 oTbEin.GetCellRangeByName("G39").String = "Die Material-Nr  wird automatisch aus der Bezeichnung "_
 											+ "und der Stärke gebildet."								' Der Helptext für das Feld "MatNr"        ins Blatt "Einstellungen" zelle "G39" eintragen 

 ' Die Fehlertexte ins Blatt "Einstellungen" eintragen
 oTbEin.GetCellRangeByName("E53").String = "Die Bezeichnung muss belegt sein !!!"						' Der Fehlertext1 für das Feld "MatBez"    ins Blatt "Einstellungen" zelle "E53" eintragen 
 oTbEin.GetCellRangeByName("F53").String = "Die Bezeichnung muss zwischen 3 und 20 Zeichen lang " & _
 											+ "sein !!!" 												' Der Fehlertext2 für das Feld "MatBez"    ins Blatt "Einstellungen" zelle "F53" eintragen 
 oTbEin.GetCellRangeByName("G53").String = "Die Stärke muss zwischen 2 und 28 mm betragen !!!"			' Der Fehlertext3 für das Feld "MatSt"     ins Blatt "Einstellungen" zelle "G53" eintragen 
 oTbEin.GetCellRangeByName("H53").String = "Dieses Material existiert bereits !!!"						' Der Fehlertext3 für Material existiert"  ins Blatt "Einstellungen" zelle "H53" eintragen 

 ' Prozedur zum Erstellen und Einstellen des Dialoges "MaterialAnAeLoe"
 Dialog_MatAnAeLoe																						' Die Prozedur zum Erstellen und Einstellen des Dialoges "MaterialAnAeLoe" ausführen

 ' Der Dialog "MaterialAnAeLoe" wird ausgewertet; Rückgabewert "0" mit Button "Abbrechen oder mit "x" 
 If oDlg_Dialog.Execute = 0 Then																		' Wenn der Dialog "MaterialAnAeLoe" mit Abbrechen oder "x" gwählt wurde 
	UnregisterKeyListener																				' Der Key-Listener wird wieder entladen
	oTbEin.getCellRangeByName("R6").Value = 0															' Im Blatt "Einstellungen" in der Zelle "R6" den Wert "0" (Der Dialog "Material anlegen" wurde abgebrochen) einsetzen
	oTbEin.getCellRangeByName("S6").Value = 1															' Im Blatt "Einstellungen" in der Zelle "S6" den Wert "1" (die Texte für "MatAbbruchAnlegen" ausgeben)

	' Der Dialog "MaterialAnAeLoe" wurde abgebrochen
	Dialog_MatMeldung																					' Die Prozedur zum Erstellen und Einstellen des Dialoges "MeldungAusgeben" ausführen

	If oDlg_Meldung.Execute = 0 Then																	' Wenn der Dialog "Meldun Ausgeben" mit  Abbrechen oder "x" gwählt wurde 	
		' Der Dialog "MaterialAnAeLoe" wurde abgebrochen	
		AbruchMatAnAeLoe:																				' Die Sprungmarke "AbruchMatANAELoe" wurd durchlaufen wenn der Dialog "MaterialANAELoe" abgebrochen wurde
		Arg=Array(oTbEin.getCellRangeByName("K6:S6"),  oTbEin.getCellRangeByName("D25:J25"),_
 				+ oTbEin.getCellRangeByName("E39:S39"),oTbEin.getCellRangeByName("E53:S53"))			' Die Argumente "Material","für Dialog- u. Variablen", "für Hilfetext" u. für Fehlertext aufnehmen
		For i = 0 To UBOUND(arg)																		' Die Schleifen solange Argumente vorhanden sund durchlaufen
			oBereich = arg(i)																			' Die Object Var. "oBereich" mit dem Argument belegen
			oBereich.clearContents(com.sun.star.sheet.CellFlags.VALUE _
								  +com.sun.star.sheet.CellFlags.STRING)									' Im Blatt "Einstellungen" die in der Object Var. "oBereich" enthaltenen Zellen von Werten und Strings leeren
		Next i																							' Den Zähler "i" um den Wert "1" erhöhen und zum Schleifenbeginn springen
		Exit Sub																						' Die Prozedur wird vorzeitig beendet
	Else
		' Der Dialog "MaterialAnAeLoe" wurde mit "Ok" beendet	
		Goto AbruchMatAnAeLoe																			' Weiter an der Sprungmarke "AbruchMatANAELoe"
	End If
 End If
Die Prozedur "Dialog_MaterialAnAeLoe" wird von dort aufgerufen

Code: Alles auswählen

 Sub Dialog_MatAnAeLoe																					' Prozedur zum Einstellen des Dialoges "MaterialAnAeLoe"
 Dim oTitel       as Object																				' Die Object Var. "oTitel" deklarieren
 Dim DialogBreite as Long 																				' Die Long Var.   "DialogBreite" deklarieren 
 Dim DialogHoehe  as Long																				' Die Long Var.   "DialogHöhe" deklarieren 
 Dim BildBreite   as Long   : BildBreite = oTbEin.getCellRangeByName("E18").String						' Die Long Var.   "BildBreite" mit dem Wert aus Blatt "Einstellungen" Zelle "E18" belegen
 Dim BildHoehe    as Long   : BildHoehe  = oTbEin.getCellRangeByName("E19").String  					' Die Long Var.   "BildHoehe"  mit dem Wert aus Blatt "Einstellungen" Zelle "E19" belegen
 Dim DialogName   as String : DialogName = oTbEin.getCellRangeByName("D25").String						' Die Long Var.   "DialogName" mit dem Wert aus Blatt "Einstellungen" Zelle "D25" belegen
 Dim Gmenu        as String : Gmenu      = oTbEin.getCellRangeByName("E25").String						' Die String Var. "GMenue"     mit dem Wert aus Blatt "Einstellungen" Zelle "E25" belegen
 Dim Titel        as String : Titel      = oTbEin.getCellRangeByName("F25").String						' Die String Var. "Titel"      mit dem Wert aus Blatt "Einstellungen" Zelle "F25" belegen
 Dim TButton      as String : TButton    = oTbEin.getCellRangeByName("G25").String						' Die String Var. "TButton"    mit dem Wert aus Blatt "Einstellungen" Zelle "G25" belegen
 Dim Anweisung    as String : Anweisung  = oTbEin.getCellRangeByName("H25").String						' Die String Var. "Anweisung"  mit dem Wert aus Blatt "Einstellungen" Zelle "H25" belegen
 Dim H_MatBez     as String : H_MatBez   = oTbEin.getCellRangeByName("E39").String						' Die String Var. "H_MatBez"   mit dem Wert aus Blatt "Einstellungen" Zelle "E39" belegen
 Dim H_MatSt      as String : H_MatSt    = oTbEin.getCellRangeByName("F39").String						' Die String Var. "H_MatSt"    mit dem Wert aus Blatt "Einstellungen" Zelle "F39" belegen
 Dim H_MatNr      as String : H_MatNr    = oTbEin.getCellRangeByName("G39").String						' Die String Var. "H_MatNr"    mit dem Wert aus Blatt "Einstellungen" Zelle "G39" belegen

 oDlg_Dialog = CreateUnoDialog(oLib.getByName(DialogName))												' Den Zugriff auf den Dialog in der Variablen DialogName setzen
 DialogBreite = oDlg_Dialog.Size.Width																	' Die Breite des Dialoges auslesen und in die Var. Dialogbreite aufnehmen
 DialogHoehe = oDlg_Dialog.Size.Height																	' Die Höhe des Dialoges auslesen und in die Var. Dialoghöhe aufnehmen
 xPos = (BildBreite-DialogBreite)/2																		' Die x-Position des Dialoges aus der Differenz der BildBreite und der Dialogbreite dividiert durch 2 ermitteln und in die Var xPos aufnehemen
 yPos = (BildHoehe-DialogHoehe)/2																		' Die y-Position des Dialoges aus der Differenz der BildHoehe und der DialogHoehe dividiert durch 2 ermitteln und in die Var yPos aufnehemen
 oDlg_Dialog.setPosSize(xPos,yPos,DialogBreite,DialogHoehe,com.sun.star.awt.PosSize.POSSIZE)			' Die x- ,die Y- Position; die Breite und die Höhe des Dialoges einsetzen
 
 'Die Button und Eingabefelder in Object Var. aufnehmen
 oTitel     = odlg_Dialog.model 																		' Der Titel des Dialoges "MatMeldung" wird in die Object-Var. "oTitel" aufgenommen  
 oOkButton1 = odlg_Dialog.getControl("CommandButton1")
 oOkButton  = odlg_Dialog.model.controlModels(0)														' Der "CommandButton1" "Material" Anlegen wird in die Object-Var "oOkButton" aufgenommen
 oAbButton  = odlg_Dialog.model.controlModels(1)														' Der "CommandButton2" "Abbrechen" wird in die Object-Var "oAbButton" aufgenommen
 oMatBez    = odlg_Dialog.getControl("MatBez")															' Das Feld "MatBez" wird in die Object-Var. "oMatBez" aufgenommen  
 oMatSt     = odlg_Dialog.getControl("MatSt")															' Das Feld "MatSt" wird in die Object-Var. "oMatSt" aufgenommen  
 oMatNr		= odlg_Dialog.getControl("MatNr")															' Das Feld "MatNr" wird in die Object-Var. "oMatNr" aufgenommen  
 
 'Die Textfelder (Labels) in Object Var. aufnehmen
 oTextAnweisg = odlg_Dialog.getControl("Label1")														' Das Feld "Label1" für die entspechende Anweisung     wird in die Object-Var. "oTextAnweisg" aufgenommen  
 oTextFehler  = odlg_Dialog.getControl("Label2")														' Das Feld "Label2" für die entspechende Fehlermeldung wird in die Object-Var. "oTextFehler"  aufgenommen  
 oTextBez     = odlg_Dialog.getControl("Label3")														' Das Feld "Label3" für die entspechende Fehlermeldung wird in die Object-Var. "oTextBez"     aufgenommen  
 oTextSt      = odlg_Dialog.getControl("Label4")														' Das Feld "Label4" für die entspechende Fehlermeldung wird in die Object-Var. "oTextSt"      aufgenommen  
 oTextEinheit = odlg_Dialog.getControl("Label5")														' Das Feld "Label5" für die entspechende Fehlermeldung wird in die Object-Var. "oTextEinheit" aufgenommen  
 oTextNr      = odlg_Dialog.getControl("Label6")														' Das Feld "Label6" für die entspechende Fehlermeldung wird in die Object-Var. "oTextNr"      aufgenommen  

 If Gmenu = "Anlegen" then
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	oTextAnweisg.Text = Anweisung																		' Die Object Var, "oTextAnweisg" mit der String Var. "Anweisung" belegen
	SetHelpText(Array(oMatBez,H_MatBez,oMatSt,H_MatSt,oMatNr,H_MatNr))									' Aufruf der Funktion "SetHelpText"    zum Eintragen der Helptexte
	SetLabelEin_Aus(Array(oMatSt,False,oMatNr,False,oTextFehler,False,oTextSt,False,oTextEinheit,_
																			+False,oTextNr,False))		' Aufruf der Funktion "SetLabelEin_Aus" zum Ein- und Ausblenden der EingabeFelder und Beschreibungstexte ausführen
	SetButtonLabel(Array(oOkButton,TButton,oAbButton,"A~bbrechen"))										' Aufruf der Funktion "SetButtonLabel" zum Erstekken der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,10,oAbButton,57)													' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton,False)																' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
	SetFocus(oMatBez)																					' Aufruf der Funktion "SetFocus" zum fokussueren eines Fekdes ausführen
 ElseIf Gmenu = "Aendern" then	
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	oTextAnweisg.Text = Anweisung																		' Die Object Var, "oTextAnweisg" mit der String Var. "Anweisung" belegen
	SetHelpText(Array(oMatBez,H_MatBez,oMatSt,H_MatSt,oMatNr,H_MatNr))									' Aufruf der Funktion "SetHelpText"    zum Eintragen der Helptexte
	SetLabelEin_Aus(Array(oMatSt,True,oMatNr,True,oTextFehler,False,oTextSt,True,oTextEinheit,_
																			+True,oTextNr,True))		' Aufruf der Funktion "SetLabelEin_Aus" zum Ein- und Ausblenden der EingabeFelder und Beschreibungstexte ausführen
	SetButtonLabel(Array(oOkButton,TButton,oAbButton,"A~bbrechen"))										' Aufruf der Funktion "SetButtonLabel" zum Erstekken der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,10,oAbButton,105)													' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton,True)																' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
	SetFocus(oOkButton1)																					' Aufruf der Funktion "SetFocus" zum fokussueren eines Fekdes ausführen
 ElseIf Gmenu = "Loeschen" then	
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	oTextAnweisg.Text = Anweisung																		' Die Object Var, "oTextAnweisg" mit der String Var. "Anweisung" belegen
	SetLabelEin_Aus(Array(oMatSt,True,oMatNr,True,oTextFehler,False,oTextSt,True,oTextEinheit,_
																			+True,oTextNr,True))		' Aufruf der Funktion "SetLabelEin_Aus" zum Ein- und Ausblenden der EingabeFelder und Beschreibungstexte ausführen
	SetLabelDeaktiv_AKtiv(Array(oMatBez,False,oMatSt,False,oMatNr,False,oTextFehler,False,oTextSt,_
													+ False,oTextEinheit, False,oTextNr, False))		' Aufruf der Funktion "SetLabelDeaktiv_AKtiv" zum Sperren der EingabeFelder ausführen
	SetLabelHintergrund(Array(oMatBez,RGB(221,221,221),oMatSt,RGB(221,221,221), _
											 + oMatSt,RGB(221,221,221),oMatNr,RGB(221,221,221)))		' Aufruf der Funktion "Hintergrund" zum HintergundFarbe einstellen der EingabeFelder ausführen
	SetButtonLabel(Array(oOkButton,TButton,oAbButton,"A~bbrechen"))										' Aufruf der Funktion "SetButtonLabel" zum Erstekken der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,10,oAbButton,105)												' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton,True)																' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
 Else
	'Fehlerbehandlung entwickeln
 End If
 ' Den Key-Listener laden
 RegisterKeyListener																					' Den Listener "RegisterKeyListener" anmelden 
End Sub
und landet dann wieder in P_MatAnlegen um dann die Prozedur "Dialog_MatMeldung" zu starten

Code: Alles auswählen

Sub Dialog_MatMeldung																					' Prozedur zum Einstellen des Dialoges "MaterialMeldung"

 Dim oTitel        as Object																			' Die Object Var. "oTitel" deklarieren
 Dim DialogBreite  as Long 																				' Die Long Var.   "DialogBreite" deklarieren 
 Dim DialogHoehe   as Long																				' Die Long Var.   "DialogHöhe" deklarieren 
 Dim BildBreite    as Long    : BildBreite    = oTbEin.getCellRangeByName("E18").String					' Die Long Var.   "BildBreite"   mit dem Wert   aus Blatt "Einstellungen" Zelle "E18"  belegen
 Dim BildHoehe     as Long    : BildHoehe     = oTbEin.getCellRangeByName("E19").String  				' Die Long Var.   "BildHoehe"    mit dem Wert   aus Blatt "Einstellungen" Zelle "E19"  belegen
 Dim AnzButton     as Integer : AnzButton     = oTbEin.getCellRangeByName("U6").Value  					' Die Integer Var. "AnzButton"   mit dem Wert   aus Blatt "Einstellungen" Zelle "U6"   belegen
 Dim DialogAbbruch as Integer : DialogAbbruch = oTbEin.getCellRangeByName("R6").Value					' Die Integer Var. "DialogAbbruch"  mit dem Wert aus Blatt "Einstellungen" Zelle "R6"  belegen
 Dim TButton       as String  : TButton       = oTbEin.getCellRangeByName("V6").String					' Die String  Var. "TButton"     mit dem String aus Blatt "Einstellungen" Zelle "V6"   belegen
 Dim TButton1      as String  : TButton1      = oTbEin.getCellRangeByName("W6").String					' Die String  Var. "TButton1"    mit dem String aus Blatt "Einstellungen" Zelle "W6"   belegen
 Dim Titel         as String  : Titel         = oTbEin.getCellRangeByName("X6").String					' Die String  Var. "Titel"       mit dem String aus Blatt "Einstellungen" Zelle "X6"   belegen
 Dim TextZeile1    as String  : TextZeile1    = oTbEin.getCellRangeByName("Y6").String					' Die String  Var. "TextZeile1"  mit dem String aus Blatt "Einstellungen" Zelle "Y6"   belegen
 Dim TextZeile2    as String  : TextZeile2    = oTbEin.getCellRangeByName("Z6").String					' Die String  Var. "TextZeile1"  mit dem String aus Blatt "Einstellungen" Zelle "Z6"   belegen
 Dim TextZeile3    as String  : TextZeile3    = oTbEin.getCellRangeByName("AA6").String					' Die String  Var. "TextZeile1"  mit dem String aus Blatt "Einstellungen" Zelle "AA6"  belegen
 Dim TextZeile4    as String  : TextZeile4    = oTbEin.getCellRangeByName("AB6").String					' Die String  Var. "TextZeile1"  mit dem String aus Blatt "Einstellungen" Zelle "AB6"  belegen

 oDlg_Meldung = CreateUnoDialog(oLib.getByName("MeldungAusgeben"))										' Den Zugriff auf den Dialog "MeldungAusgeben" setzen
 DialogBreite=oDlg_Meldung.Size.Width																	' Die Breite des Dialoges auslesen und in die Variable Dialogbreite aufnehmen
 DialogHoehe=oDlg_Meldung.Size.Height																	' Die Höhe des Dialoges auslesen und in die Variable Dialoghöhe aufnehmen
 xPos = (BildBreite-DialogBreite)/2																		' Aus der Differenz der Bildschirm- und Dialogbereite die x-Position des Dailoges ermitteln und in die Variable xPos schreiben
 yPos = (BildHoehe-DialogHoehe)/2																		' Aus der Differenz der Bildschirm- und Dialoghöhe die y-Position des Dailoges ermittel nund in die Variable yPos schreiben
 oDlg_Meldung.setPosSize(xPos,yPos,DialogBreite,DialogHoehe,com.sun.star.awt.PosSize.POSSIZE)			' Die x- und die Y- Position die Breite und die Höhe für den entsprechend anzuzeigenden Dialog einsetzen

 'Die Elemente im Dialog MeldungAusgeben in die Var. übernehmen
 oTitel      = odlg_Meldung.model 																		' Der Titel des Dialoges "MatMeldung" wird in die Object-Var. "oTitel" aufgenommen  
 oOKButton   = odlg_Meldung.model.controlModels(0)														' Der "CommandButton1" "Ok" wird in die Object-Var "oOkButton"  aufgenommen
 oOkButton1  = odlg_Meldung.model.controlModels(1)														' Der "CommandButton2" " "  wird in die Object-Var "oOkButton1" aufgenommen
 oTextZeile1 = odlg_Meldung.getControl("Label1")														' Das Feld "Label1" für die Meldungszeile1 wird in die Object-Var. "oTextZeile1" aufgenommen  
 oTextZeile2 = odlg_Meldung.getControl("Label2")														' Das Feld "Label2" für die Meldungszeile2 wird in die Object-Var. "oTextZeile2" aufgenommen  
 oTextZeile3 = odlg_Meldung.getControl("Label3")														' Das Feld "Label3" für die Meldungszeile3 wird in die Object-Var. "oTextZeile3" aufgenommen  
 oTextZeile4 = odlg_Meldung.getControl("Label4")														' Das Feld "Label4" für die Meldungszeile4 wird in die Object-Var. "oTextZeile4" aufgenommen  


 If AnzButton = 1 then																					' Wenn der Dialog "MatMeldung" nur den "Ok" Button hat
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	SetLabelText(Array(oTextZeile1,TextZeile1,oTextZeile2,TextZeile2,oTextZeile3,TextZeile3,_
																  + oTextZeile4,TextZeile4))			' Aufruf der Funktion "SetLabelText" zum Belegne der TextFelder ausführen
	SetButtonLabel(Array(oOkButton,TButton))															' Aufruf der Funktion "SetButtonLabel" zum Erstellen der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,40))																' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton1,False))															' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
 ElseIf AnzButton = 2 then																				' Wenn der Dialo "MatMeldung" 2 Buttons hat
	oTitel.Title= Titel																					' Die Object Var, "oTitel"       mit der String Var. "Titel" belegen
	SetLabelText(Array(oTextZeile1,TextZeile1,oTextZeile2,TextZeile2,oTextZeile3,TextZeile3,_
																  + oTextZeile4,TextZeile4))			' Aufruf der Funktion "SetLabelText" zum Belegne der TextFelder ausführen
	SetButtonLabel(Array(oOkButton,TButton,oOkButton1,TButton1))										' Aufruf der Funktion "SetButtonLabel" zum Erstellen der Button-Beschriftung ausführen
	SetButtonPositionX(Array(oOkButton,7,oOkButton1,75))												' Aufruf der Funktion "SetButtonPositionX" zum Ein- und Ausblenden der Buttons ausführen
	SetButtonEin_Aus(Array(oOkButton,True,oOkButton1,True))												' Aufruf der Funktion "SetButtonEin_Aus" zum Erstellen der Button-Beschriftung ausführen
 Else
	'Fehlerbehandlung entwickeln
 End If
 If DialogAbbruch = 0 Then																				' Wenn der Dialog "MaterialAnAeLoe" mit "Abbrechen" oder mit "x" geschlossen wurde
	SetLabelSchriftFarbe(Array(oTextZeile3,""))															' Aufruf der Funktion "SetLabelSchriftFarbe" zum Erstellen der Button-Beschriftung ausführen
 ElseIf DialogAbbruch = 1 Then																			' Wenn der Dialog "MaterialAnAeLoe" mit "Ok" geschlossen wurde
	SetLabelSchriftFarbe(Array(oTextZeile3,16728064))													' Aufruf der Funktion "SetLabelSchriftFarbe" zum Erstellen der Button-Beschriftung ausführen
 Else
	   'Fehlerbehandlung entwickeln
 End If
	
' odlg_Meldung.execute																					' Den Dialog "MeldungenAusgeben" anzeigen
' Meldung=1																								' Die Var. "Meldung" auf den Wert "1" setzen
End Sub
zu guter Letzt wird "P_MatAnlegen" dann beendet (*Vorläufig)

Ich hoffe so kann man es besser lesen
Gruss Dirk
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Eingabefelder in Dialog

Beitrag von marcel_at_work »

Hallöchen Dirk,

alles gut. :lol:

Dies steht im OOME eine Zeile weiter unten:

Code: Alles auswählen

Die Angabe von „zähler“ hinter der Next-Anweisung ist optional. Next bezieht sich automatisch auf
die zuletzt vorgekommene For-Anweisung.
For i = 1 To 4 Step 2
  Print i ' Gibt erst 1, dann 3 aus.
Next i    ' In dieser Anweisung ist das i optional.
Ich habe bislang noch keinen Zweck für diese Angabe entdeckt.
Das mit dem "_+" habe ich mal getestet, und wie Du glaube ich auch geschrieben hast , miss ich das Plus nur bei Strings die durch den "_" getrennt werden einsetzen. *Werde ich überarbeiten.
Das bedeuted, ein Verbindungszeichen ist in einem Array (wie es immernoch überall zu finden ist) nicht notwendig, da z.B.:

Code: Alles auswählen

Array("1", _
      "2")
... ein Objekt mit Elementen darstellt, die von einander getrennt sind.
Den Punkt mit Set.Focus() ist richtig geht auch ohne Function. Ich habe dich nur so verstanden das SIe leichter lesbar ist als z.B. "oMatBez.setfocus"
Werde ich aber abändern.
Du hattest folgende Funktion geschrieben:

Code: Alles auswählen

Function setFocus(o1)
	o1.setFocus()
End Function
Dein Aufruf dazu lautet z.B.: setFocus(oMatBez)
... analog der BASIC-Methodenaufruf des Objektes: oMatBez.setFocus()
Wenn es schon eine fertige Funktion gibt, die auch noch fast identische Ausdrücke benutzt, würde eine zusätzliche (redundante) Funktion den Programm-Code nur unnötig aufblähen. Also, ich persönlich, versuche, wo ich nur kann, Code zu verdichten und somit zu löschen, damit er übersichtlicher wird.
Das Array was ich dort Erstelle habe ich auf die Schnelle erstellt . Gute Idee das in eine Function zu packen. Aber dabei Habe ich noch eine Frage an Dich (sicherlich lapidar und irgendwo beschrieben; finde es aber nicht) Meine Idee war die Functionen in eine zu schreiben und dann je nachdem welche aufgerufen wurde zu dieser dann zu springen. Also praktisch eine Abfrage welche Function benötigt wird und dann genau zu diesem Punkt zu soringen. damit könnte man die Anzahl der Einträge der Functionen reduzieren. Was sagst du dazu??
Verstehe ich noch nicht so ganz... :shock:
Ja das ist gewollt. Wenn man den Dialog "Material AnAeLoe" abbricht soll der Abbruch durch die Meldung angezeigt werden. Damit man Due Meldung entweder mit "x" oder mit "Ok" bekommt habe ich das so gelöst. Nicht gut???
... wenn das immer passieren soll, z.B.:

Code: Alles auswählen

	Select Case dlg.Execute()
	Case Else
		... wird bei jeder Dialog-Rückgabe aufgerufen
	End Select

Code: Alles auswählen

SetLabelEin_Aus(Array(oMatSt,True,oMatNr,True,oTextFehler,False,oTextSt,True,oTextEinheit,False))
Tipp (allgemein): Wenn man Werte gleicher Struktur untereinander schreibt, ist dies übersichtlicher und weniger fehleranfällig...

Code: Alles auswählen

SetLabelEin_Aus(Array(oMatSt,True,_
		      oMatNr,True,
		      oTextFehler,False,
		      oTextSt,True,
		      oTextEinheit, False))
Die Dokumentation von "Andrew Pitonyak" hat 715 Seiten und diese komplett zulesen und begreifen fällt mir sehr schwer. Daher habe ich den oben beschriebenen Weg gewählt. Ist vieleicht faösch.
Auf den ersten 120 Seiten sind die BASIC-Grundelemente beschrieben, die fortlaufend benutzt werden - soviel ist das nicht. Alles andere kann man nachschlagen, wenn man es braucht. Mit Studium und Praxis kann man das in ein, zwei Wochen, am Abend, hinbekommen. Das erübrigt dann zukünftig viele Hundert Stunden Fehlersuche (also, je nachdem, wieviel Zeit man überhaupt in der BASIC-IDE verbringt).

Aber dein Programm-Code ist schon sehr viel kompakter geworden, find' ich prima.

BASIC-Fragestunde für heute beendet... 8)

Viele Grüße,

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Eingabefelder in Dialog

Beitrag von pcdirk91 »

Hi Marcel,
zunächst wünsche ich einen schönen Resr-Sonntag. Ich habe in den letzten Tagen viel probiert den Code zu kürzen. Bei dem Key-Listener bin ich soweit gekommen das es für mich funzt. Vielleicht kannst Du mal drüber schauen.

Code: Alles auswählen

Function oKey_KeyPressed(oEvt) As Boolean														' Funktion mit der Object Var "oEvt" die die Tastatureingaben abprüft
 Dim Lg      as Integer
 Dim oOk as Object : oOk= oOkButton
 Dim oOk1 as Object : oOk1= oOkButton1
 Dim oAb as Object : oAb= oAbButton
 Dim Bez as Object : Bez = oMatBez
 Dim St as Object : St = oMatSt
 Dim Nr as Object : Nr = oMatNr
 Dim Fehler as Object : Fehler = oTextFehler
 Dim Anweisg as Object : Anweisg = oTextAnweisg
 Dim Feld as String : Feld= oEvt.source.Model.Name								

 select case oEvt.KeyChar																		' Der eingebene Tastaturwert soll ausgewählt werden
    case chr(13)																				' Wenn die Taste "Return" gedrückt wurde
		'Wenn die Funktion durch das Feld "MatBez" aufgerufen wurde
		If Feld= "MatBez" Then
			'Wenn die Function aus dem Feld "MatBez" gestartet wurde
			If Feld= "MatBez" Then SetMeineFunktionBez("BezTrim",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)		' Im Feld "MatBez" alle Leerzeichen am Anfang  u. am Ende löschen
			' Dan Anfangsbuchstebn gross schreiben
			If Len(Bez.Text) > 1 then SetMeineFunktionBez("BezLg",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)		' Das Feld "MatBez" den Anfangsbuchstaben Gross machen 
			'Wenn das Feld "MatBez" leer ist
			If Bez.Text = "" Then																	
				SetMeineFunktionBez("keine Bez",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)			' Die Fehlermeldung für die leere Bezeichnung konfigurieren und einblenden  
				Exit Function																	' Die Funktion wird vorzeitig beendet
			End If
			'Wenn das Feld "MatBez" <3 oder >20 Zeichen hat
			If Len(Bez.Text) < 3 or Len(Bez.Text) > 20 then
				SetMeineFunktionBez("falsche Bez",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)		' Die Fehlermeldung für die zu kurze oder zu lange Bezeichnung konfigurieren und einblenden  	  
				Exit Function																	' Die Funktion wird vorzeitig beendet
			End If
			' Wenn die "MatBez" kein "platte" am Ende hat 
			If LCase(Right(Bez.Text,6)) <> "platte" Then Bez.Text = Bez.Text & "platte"			' Das Feld "MatBez" um den String "platte" erweitern
			' Das EingabeFeld "MatNr" wird berechnet
			SetMeineFunktionBez("MatNr",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)					' Das Feld "MatNr" belegen
			'Die Fehlerzeile wird aus- die Anweisungzeile eingeschaltet
			SetMeineFunktionBez("Fehler aus",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)				' Das EingabeFeld "MatST" und seine Beschriftungen werden eingeschaltet
			'Das Feld "MatST" und seine Beschriftungen werden eingeschaltet
			SetMeineFunktionenDialog("EingabeEinAus",Array(oTextFehler, False,oTextAnweisg,True,_
														   oMatSt,True,oTextSt,True,_
														   oTextEinheit,True,))					' Aufruf der Funktion "SetMeineFunktionenDialog" zum Unsichtbar- oder Sichtbar-Schaltung der Eingabefelder bzw. Beschriftung ausführen
		    St.SetFocus()																		' Das Eingabefeld "MatSt" fokussieren
		End If
		'Wenn die Function aus dem Feld "MatBez" gestartet wurde
		If Feld = "MatSt" Then
			'Wenn das Feld "MatSt" <2 oder >28 Zeichen ist
			If St.Value < 2 or St.Value > 28 Then 												' Wenn das Feld "MatSt" den Wert <2 oder >28 Ist
				SetMeineFunktionBez("falsche St",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)			' Die Fehlermeldung für die zu kleine oder zu grosse Materialstärke konfigurieren und einblenden  	  
				Exit Function																	' Die Funktion wird vorzeitig beendet
			End If
			'Die Fehlerzeile wird aus- die Anweisungzeile eingeschaltet
			SetMeineFunktionBez("Fehler aus",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)				' Das EingabeFeld "MatST" und seine Beschriftungen werden eingeschaltet
			' Das EingabeFeld "MatNr" wird berechnet
			SetMeineFunktionBez("MatNr",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)					' Das Feld "MatNr" belegen
			' Das Feld "MatNr" und seine Beschriftungen sichtbar schalten
			SetMeineFunktionenDialog("EingabeEinAus",Array(oMatNr,True,oTextNr,True))			' Aufruf der Funktion "SetMeineFunktionenDialog" zum Unsichtbar- oder Sichtbar-Schaltung der Eingabefelder bzw. Beschriftung ausführen
			' Das EingabeFeld "MatNr" und der CommandButton1 werden eingeblendet
			SetMeineFunktionBez("Button",oOk,oOk1,oAb,Bez,St,Nr,Fehler,Anweisg)					' die CommandButtons auf die x-Position setzen und schalten
			oOk1.setFocus()																		' Den CommandButton1 "Material anlegen" fokussieren
		End If
	case else																					' Wenn keine definierte Taste gedrückt wurde
  end select																					' Das Ende der Tastenselektion
End Function



Function oKey_KeyReleased(oEvt) As Boolean
  oKey_KeyReleased = False
End Function


Sub oKey_disposing(oEvt)
  'Muß nur vorhanden sein, keine weitere Funktion auslösen
End Sub
die entsprechene Benutzer Function

Code: Alles auswählen

Public Function setMeineFunktionBez(s1 as String,oOK,oOk1,oAb,Bez,St,Nr,F1,A1)
 Dim Ftext1  as String : Ftext1 = oTbEin.getCellRangeByName("E53").String						' Die Var. "FText1" als String Var. deklarieren und mit dem String aus Blatt "Einstellungen" Zelle "E53" belegen
 Dim Ftext2  as String : Ftext2 = oTbEin.getCellRangeByName("F53").String						' Die Var. "FText2" als String Var. deklarieren und mit dem String aus Blatt "Einstellungen" Zelle "F53" belegen
 Dim Ftext3  as String : Ftext3 = oTbEin.getCellRangeByName("G53").String						' Die Var. "FText3" als String Var. deklarieren und mit dem String aus Blatt "Einstellungen" Zelle "G53" belegen
 Select Case s1
	Case "BezTrim"
		Bez.Text=Trim(Bez.Text)																	' Die Anfangs- und End-Leerzeichen werden aus dem Feld "MatBez" entfernt
	Case "BezLg"
		Lg = Len(Bez.Text)-1																	' Die Var. "L" aus der Länge des Feldes "MatBez" belegen
		Bez.Text = UCase(Left(Bez.Text,1)) & Right(Bez.Text,Lg) 								' In der Materialbezeichn ung den 1. Buchstaben Groß schreiben
	Case "MatNr"
		If St.Value =  0 Then Nr.Text = Bez.text  + "_00"										' Das Feld "MatNr" mit dem String des Feldes "MatBez" und dem String "_00" belegen
		If St.Value <= 9 Then Nr.Text = Bez.text  + "_0" + St.Value	 							' Das Feld "MatNr" mit dem String des Feldes "MatBez" ,dem String "_0" und dem Feld "MatSt" belegen
		If St.Value >  9 Then Nr.Text = Bez.text  + "_"  + St.Value								' Das Feld "MatNr" mit dem String des Feldes "MatBez" ,dem String "_" und dem Feld "MatSt" belegen
		' Wenn der CommandButton1 deaktiviert ist
		If oOk.enablevisible= True then
			oOk.enabled = True 																	' Den CommandButton1 "Material anlegen" aktivieren
			oOk1.setFocus()																		' Den CommandButton1 "Material anlegen" fokussieren
		end If	
 	Case "Button"
		oOk.positionx =  10
		oAb.positionx = 105
		oOk.enabled   = True
		oOk.enableVisible = True
	Case "keine Bez"
		F1.text = Ftext1																		' Die Object Var. "otextFehler" mit den String der Var. "Ftext1" belegen
		F1.model.Positiony = 5																	' Die Object Var. "oTextFehler" auf die y-Position "5" setzen
		F1.Visible= True																		' Die Object Var. "oTextFehler"      sichtbar schalten
		A1.Visible= False																		' Die Object Var. "oTextAnweisung" unsichtbar schalten
		oOK.enabled = False																		' Den CommandButton1 "Material anlegen" deaktivieren
	Case "falsche Bez"
		F1.text = Ftext2																		' Die Object Var. "otextFehler" mit den String der Var. "Ftext2" belegen
		F1.model.Positiony = 5																	' Die Object Var. "oTextFehler" auf die y-Position "5" setzen
		F1.Visible= True																		' Die Object Var. "oTextFehler"      sichtbar schalten
		A1.Visible= False																		' Die Object Var. "oTextAnweisung" unsichtbar schalten
		oOK.enabled = False																		' Den CommandButton1 "Material anlegen" deaktivieren
	Case "falsche St"
		F1.text = Ftext3																		' Die Object Var. "otextFehler" mit den String der Var. "Ftext3" belegen
		F1.model.Positiony = 5																	' Die Object Var. "oTextFehler" auf die y-Position "5" setzen
		F1.Visible= True																		' Die Object Var. "oTextFehler"      sichtbar schalten
		A1.Visible= False																		' Die Object Var. "oTextAnweisung" unsichtbar schalten
		oOK.enabled = False																		' Den CommandButton1 "Material anlegen" deaktivieren
	Case "Fehler aus"
		F1.Visible= False																		' Die Object Var. "oTextFehler"    unsichtbar schalten
		A1.Visible= True																		' Die Object Var. "oTextAnweisung"   sichtbar schalten
 End Select
End Function
Wollte Fragen ob da sehr viel verkehrt ist.
Vielleicht hast Du ja etwas Zeit mal drüber zu schauen.
Ansonstenb hoffe ich Du hast wieder etwas weniger Stress und wünsche DIr einen ruhugeren Wochen-Anfang.

Gruss DIrk
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Eingabefelder in Dialog

Beitrag von pcdirk91 »

Hi Marcel,
verfiss den vorherigen Post habe noch was besseres gefunden. Kann das aber noch nicht senden.
Dennoch Danke und einen schönen Abend

Gruss DIrk :lol:
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Eingabefelder in Dialog

Beitrag von pcdirk91 »

Hi Marcel,
ich hoffe Dir geht es soweit gut und es ist nicht mehr so stressig für Dich. Ist ja schliesslich die wie wir hier sagen "die Stade Zeit" (stade = ruhige). Ich habe jetzt viel durch probiert und für meine Begriffe auch optimiert. Der gesamte Code ist fast fertig. Ihn werde ich falls Interesse bessteht Dir gerne zur Durchsicht senden. Der Grund warum ich dich jetzt anfrage ist folgender:

wie Du dich sicher erninnern kannst habe ich durch Dich gelernt wie man Variablen in andere Prozeduren weitergibt (Danke nochmals dafür). Jetzt habe ich aber ein Problem mit dem oKey-Listener
Aufruf:

Code: Alles auswählen

Function F_Mat_KeyListener_Load																			' Funktion zum Laden des "KeyListener"
 Dim anzFelder as Integer : anzFelder = oTbEin.getCellrangeByName("J25").Value							' Die Integer Var. "anzFelder" deklarieren und mit dem Wert aus dem Blatt "Einstellungen" Zelle "J25" belegen
 for i=1 to anzFelder																					' Die For-Schleie solange durchlaufen wie der Zähler "i" kleiner gleich der existierenden Dialogeinträge ist 
	oControls=oDlg_Dialog.tabControllers(0).controls													' In die Object Var. "oConbtrol" den Dialogeintrag aufnehmen
	oKeyListener = createUnoListener("F_Mat_", "com.sun.star.awt.XKeyListener")							' Den Listener "oKeyListener" laden und als "oKey_" definieren
	oControls(i).addKeyListener(oKeyListener)															' Den Dialogeintrag aus dem Listener "oKeyListener" aufnehmen 
 next	 																								' Den Zähler "i" um den Wert "1" erhöhen und wieder zum An fang der For-Schleife springen
End Function																							' Das Ende der Funktion
Mündet dann in :

Code: Alles auswählen

Function F_Mat_KeyPressed(oEvt) As Boolean																' Funktion mit der Object Var "oEvt" die die Tastatureingaben abprüft
 Dim Lg     as Integer																					' Die Integer Var. "Lg" als Unteger belegen
 Dim oCell  as Object																					' Die Object Var. "oCell" als Object deklarieren
 Dim oOk    as Object  : oOk    = odlg_Dialog.model.controlModels(0)									' Die Object Var. "oOk"  mit dem CommandButton1 belegen
 Dim oOk1   as Object  : oOk1   = odlg_Dialog.getControl("CommandButton1")								' Die Object Var. "oOk1"  mit dem CommandButton1 belegen
 Dim oAb    as Object  : oAb    = odlg_Dialog.model.controlModels(1)									' Die Object Var. "oAb"  mit dem CommandButton1 belegen
 Dim Bez    as Object  : Bez    = odlg_Dialog.getControl("MatBez")										' Die Object Var. "Bez"  mit dem EingabeFeld "MatBez" belegen
 Dim St     as Object  : St     = odlg_Dialog.getControl("MatSt")										' Die Object Var. "St"   mit dem EingabeFeld "MatSt"  belegen
 Dim Nr     as Object  : Nr     = odlg_Dialog.getControl("MatNr")										' Die Object Var. "Nr"   mit dem Eingabefeld "MatNr"  belegen
 Dim F1     as Object  : F1     = odlg_Dialog.getControl("oTextFehler")									' Die Object Var. "F1"   mit dem Labelfeld "oTextFehler"  belegen
 Dim A1     as Object  : A1     = odlg_Dialog.getControl("oTextAnweisg")								' Die Object Var. "A1"   mit dem Labelfeld "oTextAnweisg" belegen
 Dim TSt    as Object  : TSt    = odlg_Dialog.getControl("oTextSt")										' Die Object-Var. "oTextSt"       mit dem Labeldfeld "oTextSt"       belegen
 Dim TEin   as Object  : TEin   = odlg_Dialog.getControl("oTextEinheit")								' Die Object-Var. "oTextEinheit"  mit dem Labeldfeld "oTextEinheit"  belegen
 Dim TNr    as Object  : TNr    = odlg_Dialog.getControl("oTextNr")										' Die Object-Var. "oTextNr"       mit dem Labeldfeld "oTextNr"       belegen
 Dim oDatNr as Object  : oDatNr = oTbEin.getCellByPosition( 3,5)  										' Die Adresse der Object Var. "DatNr" mit Zelle "Einstellungen!K6" belegen
 Dim Feld   as String  : Feld   = oEvt.source.Model.Name												' Die Object Var. "Feld"   mit dem Object "oEvt.Source.Name" belegen					
 Dim GM     as String  : GM     = oTbEin.getCellByPosition( 4,24).String								' Die String Var. "Gmenu" mit der Prozedur die gestartet wurde belegen
 Dim anzMat as Integer : anzMat = oTbEin.getCellByPosition(12,24).Value -1								' Die Integer Var. "anzMat" mit der Ssumme aller angelegten Materialien minus dem Wert "1" belegen
 Dim ZNrID  as Integer : ZNrID  = oTbEin.getCellByPosition(13,24).Value									' Die Integer Var. "ZNrID"  mit dem Wert der 1. blegten Zeilennummer asl Index belegen
 Dim LfdNr1 as Integer : LfdNr1 = oTbEin.getCellByPosition(12,24).Value+1								' Die Integer Var. "LfdNr1" mit dem Wert (aller angelegten Materialien + dem Wert "1") belegen
 Dim LfdNr2 as Inte

'weitere Anweisungen

End Function
Jetzt meine Frage
Wie kann ich aus der Prozedur die das Dialogfeld konfiguriert an den Key Listener Variablen Übergeben???
Katz Mache ich das wie oben gezeigt. Anders habe ich es nicht hinbekommen weil ich mit "Function F_Mat_KeyPressed(oEvt) As Boolean" nicht zurecht komme. wenn ich es richtig verstanden habe bedutet (oEvt) as Boolean doch das die oEvt- Bar. Boolean also Wahr oder falsch definiert hat. wie jann man den z. B. die Var Gm im Kopf mit übergeben??

Vielleicht hast Du oder ein anderer kurz Zeit mir Tipps oder Lösungen zu geben.
Ich werde Die nächsten Tage wenn ich die Beschreibungen fertig geschrieben habe und Interesse besteht den Code hier reinstellen.
Ansonsten wünsche Ich Dur Marcel, aber auch den anderen Leuten eine Schöne und ruhige Vorweihnachtszeit.
Gruss Dirk
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Eingabefelder in Dialog

Beitrag von marcel_at_work »

Hallo Dirk,

Stress habe ich gar nicht unbedingt, sondern nur zu wenig Zeit für all die Dinge, die ich gerne erledigen möchte...
Vor zwei Wochen habe ich z.B. im Affekt beschlossen, meine gesamte Bibliothek und alle meine Unterlagen zu digitalisieren, da mir das stetige Suchen (und größtenteils NICHT-finden) dermaßen "auf den Keks geht". Es musste dafür erst recherchiert, anschliessend ein Scanner besorgt und nun, seit fast fünf Tagen, damit getestet werden. Dies war ursprünglich alles nicht eingeplant und aktuelle Projekte stauen sich... :)

Ich find' es toll, dass du so gut vorankommst. 'Daumen hoch'! In Kürze schon ist der Herr ein Profi... ;-)
Wie kann ich aus der Prozedur die das Dialogfeld konfiguriert an den Key Listener Variablen Übergeben???
Katz Mache ich das wie oben gezeigt. Anders habe ich es nicht hinbekommen weil ich mit "Function F_Mat_KeyPressed(oEvt) As Boolean" nicht zurecht komme. wenn ich es richtig verstanden habe bedutet (oEvt) as Boolean doch das die oEvt- Bar. Boolean also Wahr oder falsch definiert hat. wie jann man den z. B. die Var Gm im Kopf mit übergeben??
Da ich letztens zufällig etwas Ähnliches brauchte, aber zu faul war, mir Gedanken zu machen, hatte ich dies einfach mit einer globalen Variable gelöst: Der Wert (eine Variable) wird in der Prozedur gesetzt und im Listener dann abgefragt > klappt prima, schön ist das allerdings nicht.

Listener-Events sind in der besagten Dokumentation sehr gut beschrieben. Bitte auch einmal anschauen! :)

Objekt-Beschreibung:

Wenn das "_keyPressed"-Ereignis der Schaltfläche aktiviert wird, übergibt das auslösende Objekt sowohl spezifische Ereignisdaten sowie auch all seine Objekt-Eigenschaften an die "_keyPressed"-Funktion, die dann in oEvt verfügbar sind. Der Inhalt dieser Objekt-Variable kann, soweit mir das meine Logik sagt, nicht gelöscht/ersetzt werden.

Mit der Deklaration "As Boolean" wird ausschliesslich der Typ des Rückgabewertes festgelegt - also, NACH Beendigung der Funktion "_keyPressed" ist ihr Wert wahr oder falsch.

Lösungsvorschlag:

In oEvt sind allerdings die gesamten Objekteigenschaften (also auch geerbte Eigenschaften des übergeordneten Dialog-Objekts) enthalten.
Du könntest in deiner Dialogfeld-Prozedur einfach eine nicht benötigte Eigenschaft der Schaltfläche (oder des Dialoges) mit deinem gewünschten Wert definieren - da gäbe es hunderte Möglichkeiten.
Im "_keyPressed"-Ereignis kann man dies dann einfach mittels: x = oEvt.Source...irgendeineEigenschaft abfragen. Dialog-Eigenschaften können von der Schaltfläche aus, ich glaube, über ".parent" oder "...context" angesprochen werden.

Mit ein paar Minuten Xray kann man dies alles sehr schnell herausfinden. ;-)

Eine sich direkt daraus ergebende Frage wäre, WARUM du überhaupt aus einer anderen Prozedur auf die Listener-Funktion zugreifen möchtest? WAS ist der Zweck davon? Kann man das nicht vielleicht auch anders lösen?

Hier noch ein paar Anregungen:

Code: Alles auswählen

 for i=1 to anzFelder																					' Die For-Schleie solange durchlaufen wie der Zähler "i" kleiner gleich der existierenden Dialogeinträge ist 
	oControls=oDlg_Dialog.tabControllers(0).controls													' In die Object Var. "oConbtrol" den Dialogeintrag aufnehmen
	oKeyListener = createUnoListener("F_Mat_", "com.sun.star.awt.XKeyListener")							' Den Listener "oKeyListener" laden und als "oKey_" definieren
	oControls(i).addKeyListener(oKeyListener)															' Den Dialogeintrag aus dem Listener "oKeyListener" aufnehmen 
 next	
Die zweite und dritte Zeile gehören nicht IN die Schleife - da passiert immer nur dasselbe.

Code: Alles auswählen

Function F_Mat_KeyPressed(oEvt) As Boolean																' Funktion mit der Object Var "oEvt" die die Tastatureingaben abprüft
 Dim Lg     as Integer																					' Die Integer Var. "Lg" als Unteger belegen
 Dim oCell  as Object																					' Die Object Var. "oCell" als Object deklarieren
 Dim oOk    as Object  : oOk    = odlg_Dialog.model.controlModels(0)	
 ...
Wenn diese tausenden Variablen IM Listener eigentlich stets dieselben Werte besitzen, könnte man sie auch als globale Variablen deklarieren und in einer Start-Prozedur zuweisen? Aktuell müssen sie bei jedem Klick-Ereignis erneut erstellt werden...

Viele Grüße und ein besinnliches Wochenende,

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Eingabefelder in Dialog

Beitrag von pcdirk91 »

Hi Marcek,
habe jetzt erst gesehen das du geschrieben hast. Das mit dem Profi sehe ich bei weiten noch nicht. oder wolltest Du mich auf den Arm nehmen???
Na ich versuche halt zu lernen :)
Bin jetzt etwas verwirrt. Ganz am Anfang unseres Kontaktes habe ich dich so verstanden, dass ich die Deklaration der Variablen im Modulkopf zu ausführlich gemacht habe. Es waren mal 41 Variablen. Derzeit sind es nur noch 15. Dadurch sind im Bereich:

Code: Alles auswählen

Function F_Mat_KeyPressed(oEvt) As Boolean																' Funktion mit der Object Var "oEvt" die die Tastatureingaben abprüft
 Dim Lg     as Integer																					' Die Integer Var. "Lg" als Unteger belegen
 Dim oCell  as Object																					' Die Object Var. "oCell" als Object deklarieren
 Dim oOk    as Object  : oOk    = odlg_Dialog.model.controlModels(0)									' Die Object Var. "oOk"  mit dem CommandButton1 belegen
 Dim oOk1   as Object  : oOk1   = odlg_Dialog.getControl("CommandButton1")								' Die Object Var. "oOk1"  mit dem CommandButton1 belegen
 Dim oAb    as Object  : oAb    = odlg_Dialog.model.controlModels(1)									' Die Object Var. "oAb"  mit dem CommandButton1 belegen
 Dim Bez    as Object  : Bez    = odlg_Dialog.getControl("MatBez")										' Die Object Var. "Bez"  mit dem EingabeFeld "MatBez" belegen
 Dim St     as Object  : St     = odlg_Dialog.getControl("MatSt")										' Die Object Var. "St"   mit dem EingabeFeld "MatSt"  belegen
 Dim Nr     as Object  : Nr     = odlg_Dialog.getControl("MatNr")										' Die Object Var. "Nr"   mit dem Eingabefeld "MatNr"  belegen
 Dim F1     as Object  : F1     = odlg_Dialog.getControl("oTextFehler")									' Die Object Var. "F1"   mit dem Labelfeld "oTextFehler"  belegen
 Dim A1     as Object  : A1     = odlg_Dialog.getControl("oTextAnweisg")								' Die Object Var. "A1"   mit dem Labelfeld "oTextAnweisg" belegen
 Dim TSt    as Object  : TSt    = odlg_Dialog.getControl("oTextSt")										' Die Object-Var. "oTextSt"       mit dem Labeldfeld "oTextSt"       belegen
 Dim TEin   as Object  : TEin   = odlg_Dialog.getControl("oTextEinheit")								' Die Object-Var. "oTextEinheit"  mit dem Labeldfeld "oTextEinheit"  belegen
 Dim TNr    as Object  : TNr    = odlg_Dialog.getControl("oTextNr")										' Die Object-Var. "oTextNr"       mit dem Labeldfeld "oTextNr"       belegen
 Dim oDatNr as Object  : oDatNr = oTbEin.getCellByPosition( 3,5)  										' Die Adresse der Object Var. "DatNr" mit Zelle "Einstellungen!K6" belegen
 Dim Feld   as String  : Feld   = oEvt.source.Model.Name												' Die Object Var. "Feld"   mit dem Object "oEvt.Source.Name" belegen					
 Dim GM     as String  : GM     = oTbEin.getCellByPosition( 4,24).String								' Die String Var. "Gmenu" mit der Prozedur die gestartet wurde belegen
 Dim anzMat as Integer : anzMat = oTbEin.getCellByPosition(12,24).Value -1								' Die Integer Var. "anzMat" mit der Ssumme aller angelegten Materialien minus dem Wert "1" belegen
 Dim ZNrID  as Integer : ZNrID  = oTbEin.getCellByPosition(13,24).Value									' Die Integer Var. "ZNrID"  mit dem Wert der 1. blegten Zeilennummer asl Index belegen
 Dim LfdNr1 as Integer : LfdNr1 = oTbEin.getCellByPosition(12,24).Value+1								' Die Integer Var. "LfdNr1" mit dem Wert (aller angelegten Materialien + dem Wert "1") belegen
 Dim LfdNr2 as Integer : LfdNr2 = oTbEin.getCellByPosition(11,24).Value									' Die Integer Var. "LfdNr1" mit dem Wert (Nr des ausgewählten Material-Datensatzes) belegen
so viele Definiert. Auf dIe Idee mit den globalen Variablen in der "Start" _Prozedur als Glpbal umzusetzen bin ich nicht gekommen. (Werde ich aber umsetzen). Stand derzeit:

Ich muss ja mehere Module entwickeln (zb. Material. Platten,Hexaeder usw) Durch Deine Mithilfe habe ich die Functionen nun in ein Modul gepackt und dabei ist mir aufgefallen, ich könnte ja aus jedem MOdul auf die Finctionen zugreifen (*bitte lach nicht. Ich weiss das ist Sinn von Functionen).Aber ich wusste nicht wie ichdas realisieren soll Ich habe auch das Blatt Einstellungen vollkommen umgemodelt. und bin jetzt am Testen ob meine Idee Funzt. Was mich jetzt wieder zu den Globalen Variablen bringt. Ist die ANzahl dieser Variablen wichtig (* jeder var bedutet doch Speicherplatz) Vin früher her war das immer ein Arbeitsspeicherproblem (*Aussage meines Onkels der Programmierer war).

Ich werde Dir mal den Code senden. Ist vielleicht einfacher

Code: Alles auswählen

'*******************************
'* Prozedur  zum Anlegen eines *
'*          Benutzers          *
'*******************************
 Sub P_BenAnlegen																									' Prozedur zum Anlegen eines neuen Benutzers
 Dim oTbHin as Object,oTbEin as Object,oTbBen as Object																' Die Object Var. "oTbHin", "oTbEin" und "oTbBen" deklarieren
 Dim Pos_x as Long,Pos_y as Long,BildBr as Long,BildHo as Long														' Die Long Var. "Pos_x", "Pos_y", "BildBr" und "BildHo" deklarieren
 Dim AnzFeld as Integer, AnzEing as Integer																			' Die Integer Var. "AnzFeld" und "AnzEing" deklarieren
 Dim Htext00 as Integer, Ftext00 as Integer																			' Die Integer Var. "HText00" und "FText00" deklarieren
 Dim DlgName as String,GM as String,DlgTit as String,Button1 as String												' Die String Var. "DlgName", "GM", "DlgTit" und "Button1" deklarieren
 Dim Button2 as String,TAweisg as String																			' Die String  Var. "Button2" und "TAweisg" deklarieren
 Dim HText as String,HText01 as String,HText02 as String,HText03 as String,HText04 as String						' Die String Var. "HText", "HText01", "HText02", "HText03" und "HText04" deklarieren
 Dim HText05 as String,HText06 as String,HText07 as String,HText08 as String,HText09 as String						' Die String Var. "HText05", "HText06", "HText07", "HText08" und "HText09" deklarieren
 Dim HText10 as String,HText11 as String,HText12 as String,HText13 as String,HText14 as String,HText15 as String	' Die String Var. "HText10", "HText11", "HText12", "HText13", "HText14" und "HText15" deklarieren
 Dim FText as String,FText01 as String,FText02 as String,FText03 as String,FText04 as String						' Die String Var. "FText", "FText01", "FText02", "FText03" und "FText04" deklarieren
 Dim FText05 as String,FText06 as String,FText07 as String,FText08 as String,FText09 as String						' Die String Var. "FText05", "FText06", "FText07", "FText08" und "FText09" deklarieren
 Dim FText10 as String,FText11 as String,FText12 as String,FText13 as String,FText14 as String,FText15 as String	' Die String Var. "FText10", "FText11", "FText12", "FText13", "FText14" und "FText15" deklarieren
 Dim TbHin  as String : TbHin  = "Hintergrund" 																		' Die String Var. "TbHin"  mit "Hintergrund"   belegen
 Dim TbEin  as String : TbEin  = "Einstellungen"																	' Die String Var. "TbEin"  mit "Einstellungen" belegen
 Dim TbBen  as String : TbBen  = "Benutzer"																			' Die String Var. "TbBen"  mit "Benutzer"      belegen

 'Das Blatt "Hintergrund" aktivieren
' oView.setActiveSheet(oDoc.Sheets.getByName(TbHin))																' Das Blatt Hintergrund aktivieren

 'Die benötigten Blätter für das Modul "Benutzer"
 oTbHin  = oDoc.Sheets.getByName(TbHin)																				' Die Object Var. "oTbHin"  mit dem Blatt "Hintergrund"   verknüpfen
 oTbEin  = oDoc.Sheets.getByName(TbEin)																				' Die Object Var. "oTbEin"  mit dem Blatt "Einstellungen" verknüpfen
 oTbBen  = oDoc.Sheets.getByName(TbBen)																				' Die Object Var. "oTbBen"  mit dem Blatt "Benutzer"      verknüpfen

 'Die Definition des benötigten Dialoges Start in Blatt "Einstellungen.$D25"
 Pos_x   = StarDesktop.getCurrentFrame().getContainerWindow().PosSize.x												' Die x-Position der Anwendung ermitteln
 Pos_y   = StarDesktop.getCurrentFrame().getContainerWindow().PosSize.y												' Die y-Position der Anwendung ermitteln
 BildBr  = StarDesktop.getCurrentFrame().getContainerWindow().Size.Width											' Die Bildbreite der Anwendung ermitteln
 BildHo  = StarDesktop.getCurrentFrame().getContainerWindow().Size.Height											' Die BildHoehe  der Anwendung ermitteln
 DSpalte =  3																										' Die Var. "DSpalte" mit dem Spalten-Index "3" belegen (die erste Spalte hat den Buchstaben "D")
 DZeile  = 24																										' Die Var. "DZeile"  mit dem Zeilen-Index "24" belegen (die erste Zeile hat die Ziffer "25")
 DlgName = "BenutzerAnAeLoe"																						' Die String Var. "DlgName" mit dem Namen des benötigten Dialoges belegen
 GM      = "Anlegen"																								' Die String Var. "Gm" mit dem Eigenschaft der gewählten Prozedur belegen
 DlgTit  = "Benutzer anlegen"																						' Die String Var. "DlgTit" mit dem Titel des gewählten DIaloges belegen
 Button1 = "Benutzer "& chr(126) & "anlegen"																		' Die String Var. "Button1" mit entsprechenden Beschriftung belegen
 Button2 = "A"& chr(126) & "bbrechen"																				' Die String Var. "Button2" mit entsprechenden Beschriftung belegen
 TAweisg = "Nehmen Sie die notwendigen Eingaben vor !!!"															' Die String Var. "TAnweisg" mit dem Text der Anweisung belegen
 AnzFeld = 16																										' Die Integer Var. "AnzFeld" mit der Anzahl der Felder des gwählten Dialoges belegen
 AnzEing = 13																										' Die Integer Var. "AnzEing" mit der Anzahl der EingabeFelder des gwählten Dialoges belegen

 ' Die Definition der Hilfstexte Start in Blatt "Einstellungen.$E39"
 HSpalte =  4																										' Die Var. "HSpalte" mit dem Spalten-Index "4" belegen (die erste Spalte hat den Buchstaben "E")
 HZeile  = 38																										' Die Var. "HZeile"  mit dem Zeilen-Index "38" belegen (die erste Zeile hat die Ziffer "39")
 HText   = chr(8222) & "ENTER" & chr(8220)     																		' Die String Var. "HText" aus den Zeichen "ENTER" bilden
 HText00 = 13																										' Die Anzahl der def. Hilfetexte  ins Blatt "Einstellungen" Zelle "E39" eintragen
 HText01 = "Geben Sie die Firma, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."					' Den Hilfetext01 für das Feld "BenFir" ins Blatt "Einstellungen" Zelle "F39" eintragen 
 HText02 = "Geben Sie den Vornamen ein, und bestätigen Sie mit " & HText & "."										' Den Hilfetext02 für das Feld "BenVor" ins Blatt "Einstellungen" Zelle "G39" eintragen
 HText03 = "Geben Sie den Nachnamen ein, und bestätigen Sie mit " & HText & "."										' Den Hilfetext03 für das Feld "BenNam" ins Blatt "Einstellungen" Zelle "H39" eintragen 
 HText04 = "Geben Sie die Strasse, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."					' Den Hilfetext04 für das Feld "BenStr" ins Blatt "Einstellungen" Zelle "I39" eintragen 
 HText05 = "Geben Sie die Plz, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."						' Den Hilfetext05 für das Feld "BenPlz" ins Blatt "Einstellungen" Zelle "J39" eintragen  
 HText06 = "Geben Sie den Ort, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."						' Den Hilfetext06 für das Feld "BenOrt" ins Blatt "Einstellungen" Zelle "K39" eintragen 
 HText07 = "Geben Sie das Land, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."						' Den Hilfetext07 für das Feld "BenLan" ins Blatt "Einstellungen" Zelle "L39" eintragen 
 HText08 = "Geben Sie einen Titel, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."					' Den Hilfetext08 für das Feld "BenTit" ins Blatt "Einstellungen" Zelle "M39" eintragen 
 HText09 = "Geben Sie eine Position, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."				' Den Hilfetext09 für das Feld "BenPos" ins Blatt "Einstellungen" Zelle "N39" eintragen 
 HText10 = "Geben Sie die Telefon-Nr., oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."				' Den Hilfetext10 für das Feld "BenPrv" ins Blatt "Einstellungen" Zelle "O39" eintragen 
 HText11 = "Geben Sie die Telefon-Nr., oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."				' Den Hilfetext11 für das Feld "BenGes" ins Blatt "Einstellungen" Zelle "P39" eintragen 
 HText12 = "Geben Sie die Telefax-Nr., oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."				' Den Hilfetext12 für das Feld "BenFax" ins Blatt "Einstellungen" Zelle "Q39" eintragen 
 HText13 = "Geben Sie eine Email Adresse, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."			' Den Hilfetext13 für das Feld "BenMai" ins Blatt "Einstellungen" Zelle "R39" eintragen 

 ' Die Definition der Fehlermeldungen Start in Blatt "Einstellungen.$E53"
 FSpalte =  4																										' Die Var. "FSpalte" mit dem Spalten-Index "4" belegen (die erste Spalte hat den Buchstaben "E")
 FZeile  = 52																										' Die Var. "FZeile"  mit dem Zeilen-Index "52" belegen (die erste Zeile hat die Ziffer "53")
 FText   = "darf durch ein Leerzeichen ersetzt werden, oder muss mindestens 3 Zeichen lang sein !!!"				' Die Var. "Ftext"   mit dem entsprechenden STring belegen
 FText00 = 13																										' Die Anzahl der def. Fehlertexte  ins Blatt "Einstellungen" Zelle "E53" eintragen
 FText01 = "Die Firma "        & FText																				' Den Fehlertext01 für das Feld "BenFir" ins Blatt "Einstellungen" Zelle "F53" eintragen 
 FText02 = "Der Vorname muss mindestens 3 Zeichen lang sein" 														' Den Fehlertext02 für das Feld "BenVor" ins Blatt "Einstellungen" Zelle "G53" eintragen
 Ftext03 = "Der Nachname muss mindestens 3 Zeichen lang sein"														' Den Fehlertext03 für das Feld "BenNam" ins Blatt "Einstellungen" Zelle "H53" eintragen
 FText04 = "Die Strasse "      & FText																			 	' Den Fehlertext04 für das Feld "BenStr" ins Blatt "Einstellungen" Zelle "I53" eintragen
 FText05 = "Die Plz darf durch ein Leerzeichen ersetzt werden, oder muss 5 Ziffern lang sein !!!"					' Den Fehlertext05 für das Feld "BenPlz" ins Blatt "Einstellungen" Zelle "J53" eintragen
 FText06 = "Der Ort "          & FText																				' Den Fehlertext06 für das Feld "BenOrt" ins Blatt "Einstellungen" Zelle "K53" eintragen
 FText07 = "Das Land "         & FText																				' Den Fehlertext07 für das Feld "BenLan" ins Blatt "Einstellungen" Zelle "L53" eintragen
 FText08 = "Der Titel "        & FText																				' Den Fehlertext08 für das Feld "BenTit" ins Blatt "Einstellungen" Zelle "M53" eintragen
 FText09 = "Die Position "     & FText																				' Den Fehlertext09 für das Feld "BenPos" ins Blatt "Einstellungen" Zelle "N53" eintragen
 FText10 = "Die Telefon-Nr. "  & FText																				' Den Fehlertext10 für das Feld "BenPrv" ins Blatt "Einstellungen" Zelle "O53" eintragen
 FText11 = "Die Telefon-Nr."   & FText																				' Den Fehlertext11 für das Feld "BenGes" ins Blatt "Einstellungen" Zelle "P53" eintragen
 FText12 = "Die Telefax-Nr. "  & FText																				' Den Fehlertext12 für das Feld "BenFax" ins Blatt "Einstellungen" Zelle "Q53" eintragen
 FText13 = "Die Mail-Adresse " & FText																				' Den Fehlertext13 für das Feld "BenMai" ins Blatt "Einstellungen" Zelle "R53" eintragen

 ' Die Arrays erstellen
 Blatt  = Array(TbHin,TbEin,TbBen)																					' Das Array "Blatt"  für die benptigten Blätter für dieses Modul
 Bild   = Array(BildBr,BildHo)																						' Das Array "Bild"   für die Blidbreite und BildHoehe erstellen
 Dialog = Array(DlgName,GM,DlgTit,Button1,Button2,TAweisg,AnzFeld,AnzEing)											' Das Array "Dialog" für die Var. des Dialoges erstellen 
 Hilfe  = Array(Htext00,Htext01,Htext02,Htext03,Htext04,Htext05,Htext06,Htext07,_
				Htext08,Htext09,Htext10,Htext11,Htext12,Htext13)													' Das Array "Hilfe"  für die Hilfetexte  erstellen
 Fehler = Array(Ftext00,Ftext01,Ftext02,Ftext03,Ftext04,Ftext05,Ftext06,Ftext07,_
				Ftext08,Ftext09,Ftext10,Ftext11,Ftext12,Ftext13)													' Das Array "Fehler" für die Fehlertexte erstellen
 Zeile = Array(DSpalte,DZeile,HSpalte,HZeile,FSpalte,FZeile)														' Das Array "Zeile"  für die Spalten- und Zeilen-Bezeichnungen erstellen
 
 ' Die erzeugten Arrays in das Blatt Einstellungen eintragen
 Infos= Array(Blatt,Bild,Dialog,Hilfe,Fehler,Zeile)																	' Das Array "Infos" aus den bisherigen definierten Array's zusammenfassen
 SetF_VarErstellen(Infos)																							' Die Funktion SteF_VarErstellen aufrufen und ausführen

 
 ' Prozedur zum Erstellen und Einstellen des Dialoges "MaterialAnAeLoe"
' Dialog_BenutzerAnAeLoe(Blatt,Bild,Dialog,Hilfe,Fehler)																	' Die Prozedur zum Erstellen und Einstellen des Dialoges "MaterialAnAeLoe" ausführen
End Sub
Die entsprechende Function dazu im Modul Function

Code: Alles auswählen

'************************************
'* Funktion  zum Einsetzen der Var. *
'*   in Das Blatt "Einstellungen"   *
'************************************
Public Function SetF_VarErstellen(o1)																				' Funktion in der die in den Prozedurren "P*_Anlegen" und "P*_Aendern" angelegten Einträge in das Blatt "Einstellungen" eingetragen werden
 oTbEin = ThisComponent.Sheets.GetByName(o1(0)(1))																	' Die Var "oTbEin" durch das zuweisen der verschiedenen Objekte als aktives Blatt erstellen

 'Die BildBreite und BildHoehe in Blatt "Einstellungen" eintragen 
 For i=0 to UBound(o1(1))																							' Die Schleife durchlaufen solange  das Array "Bild" (o1(1)) Einträge hat
    oTbEin.getCellByPosition(4,3+i).Value = o1(1)(i)  																' Die BildBreite und die BildHöhe  in das Blatt "Einstellungen" Zelle "E4"  und "E5" eintragen
 Next																												' Der Zähler i wird um 1 erhöht

 'Die Var für den Dialog "BenutzerAnAeLoe" in Blatt "Einstellungen" eintragen 
 Spalte= o1(5)(0)																									' Die Var. "Spalte"	mit dem Wert der Var. "DSpalte" belegen
 For i=0 to UBound(o1(2))																							' Die Schleife durchlaufen solange  das Array "Dialog" (o1(2)) Einträge hat
	If i>=6 then  																									' Wenn i den Eintrag für "anzFelder" bzw. "anzEing" betrifft den Wert eintragen
		oTbEin.getCellByPosition(Spalte,o1(5)(1)).Value = o1(2)(i)  												' Die Infos für den Dialog  in das Blatt "Einstellungen" Zellen "J&DZeile:K&DZeile" eintragen
	Else																											' Bei allen anderen Werten von i den String eintragen
	    oTbEin.getCellByPosition(Spalte,o1(5)(1)).String = o1(2)(i)  												' Die Infos für den Dialog  in das Blatt "Einstellungen" Zellen "D&DZeile:I&DZeile" eintragen
	End If
	Spalte=Spalte+1																									' Die Var. "Spalte" um den Wert "1" erhöhen
 Next																												' Der Zähler i wird um 1 erhöht

 'Die Hilfetexte in Blatt "Einstellungen" eintragen 
 Spalte= o1(5)(2)																									' Die Var. "Spalte"	mit dem Wert der Var. "HSpalte" belegen
 For i=0 to UBound(o1(3))																							' Die Schleife durchlaufen solange  das Array "Hilfetexte" (o1(3)) Einträge hat
    oTbEin.getCellByPosition(Spalte,o1(5)(3)).String = o1(3)(i)  													' Die Infos für den Dialog  in das Blatt "Einstellungen" Zellen "E&FZeile:U&fZeile" eintragen
	Spalte=Spalte+1																									' Die Var. "Spalte" um den Wert "1" erhöhen
 Next																												' Der Zähler i wird um 1 erhöht

 'Die Fehlertexte in Blatt "Einstellungen" eintragen 
 Spalte= o1(5)(4)																									' Die Var. "Spalte"	mit dem Wert der Var. "FSpalte" belegen
 For i=0 to UBound(o1(4))																							' Die Schleife durchlaufen solange  das Array "Fehlertexte" (o1(4)) Einträge hat
    oTbEin.getCellByPosition(Spalte,o1(5)(5)).String = o1(4)(i)  													' Die Infos für den Dialog  in das Blatt "Einstellungen" Zellen "E&FZeile:U&fZeile" eintragen
	Spalte=Spalte+1																									' Die Var. "Spalte" um den Wert "1" erhöhen
 Next																												' Der Zähler i wird um 1 erhöht
End Function
Habe ich getestet und funzt wie ich meine. Ich werde wohl diese Bariablen FText01....Ftext15 usw als Globale Variablen definieren (*Mein derzeituger Gedanke) .
So nu ist die Katze aus dem Sack ubd ich stehe bibbernd in der Ecke und warte auf meine Hinrichtung. :shock:

Jetzt aber zu Deiner , wie sagtest Du , "spontaner Idee ... zu dugitalisieren????? Ähm ich dachte Bibliotheken werden am Rechner entwickelt und Rechner = Digital??? oder schreibst du das erst auf Papier???
Na ich wünsche Dir jedenfalls viel Erfolg und ein Schnelles Ergebnis.

Ein schnes Rest WE und bitte sei nicht zu hart mit Deinem Urteil meiner Idee

Gruss Dirk
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Eingabefelder in Dialog

Beitrag von marcel_at_work »

Hallöchen Dirk,
Ganz am Anfang unseres Kontaktes habe ich dich so verstanden, dass ich die Deklaration der Variablen im Modulkopf zu ausführlich gemacht habe.
Dies trifft nicht ganz zu. Dein Programmcode war anfangs äußerst unübersichtlich, weshalb ähnliche bzw. identische Routinen mehrfach vorkamen und unnötige Variablen deklariert werden mussten.
Ist die ANzahl dieser Variablen wichtig (* jeder var bedutet doch Speicherplatz) Vin früher her war das immer ein Arbeitsspeicherproblem (*Aussage meines Onkels der Programmierer war).
1) Anders, als vielleicht dein Onkel, solltest du heute keine Speicherprobleme mehr haben.
Eine Integer-Variable verbraucht z.B., je nach System, 2 - 4 Byte und gute RAMs haben heute 16 - 32 GB (macht mind. 4 Mio. Variablen im RAM, exkl. SSD), da ist also viel Platz nach oben... :lol:

2) Das KeyEvent o.ä. wird bei jedem Tastendruck erneut aufgerufen. Wenn dann im Event-Handler zig Variablen deklariert sind, die zwar ihren Wert nie ändern, aber stets wieder geladen werden müssen, verliert man dadurch wertvolle Prozess-Zeit. Die Bereitstellung eines neuen Speicherplatzes nimmt mehr Zeit in Anspruch als nur der einfache Zugriff per Pointer auf eine Speichereinheit. Dies kann man z.B. durch eine Initialisierungs-Routine ändern, die nur bei Start des Programms durchlaufen werden muss.
Desweiteren gäbe es auch die Möglichkeit mit globalen Konstanten (also Werte, die vom gesamten Programm immer wieder genutzt und direkt im ersten Modulkopf definiert werden). Dies ist z.B. sehr gut in der OpenOffice-Bibliothek Access2Base zu sehen, welche mit Open-/LibreOffice ausgeliefert wird.

3) Eine grundsätzliche Überlegung sollte im Idealfall stets in einem Verstehen darüber enden, wann, wo und wie der Zugriff auf einen Wert in einer Variable am effektivsten vollzogen werden kann.
Ich werde wohl diese Bariablen FText01....Ftext15 usw als Globale Variablen definieren (*Mein derzeituger Gedanke) .
Genau das meinte ich - super. 8)

Code: Alles auswählen

Dim TEin   as Object  : TEin   = odlg_Dialog.getControl("oTextEinheit")	
Hier wird z.B. ein Objekt referenziert, welches sich während der gesamten Laufzeit des Programms nicht mehr verändern wird - wobei dies jedesmal geschieht, wenn man im Dialog eine Taste betätigt. Zumal eine Objektzuweisung ja schon geschehen sollte, wenn der zugehörige Dialog geladen wird (analog zu deinen Listenern).

# Tipp) Schreibe in jedes Modul als erste Zeile:

Code: Alles auswählen

Option Explicit
... und dann teste dein Programm noch einmal. Wahrscheinlich wirst du noch einige Variablen deklarieren müssen. Dieses Verfahren schützt dich vor unnötiger Fehlersuche zwecks fehlender Variablendeklarationen. Schau dir dazu auch noch einmal OOME an.

# Tipp) Du erstellst hier für jeden Text eine eigene Variable, nur um diese dann in ein Array zu laden?!

Code: Alles auswählen

 HText01 = "Geben Sie die Firma, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."
 HText02 = "Geben Sie den Vornamen ein, und bestätigen Sie mit " & HText & "."
 HText03 = "Geben Sie den Nachnamen ein, und bestätigen Sie mit " & HText & "."
...
 Hilfe  = Array(Htext00,Htext01,Htext02,Htext03,Htext04,Htext05,Htext06,Htext07,_
				Htext08,Htext09,Htext10,Htext11,Htext12,Htext13)	
Erstelle doch gleich zwei Arrays mit allen Texten - dann ersparst du dir auf einmal 26 Variablen? Ist nur eine Möglichkeit...

Code: Alles auswählen

Array("Geben Sie die Firma, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & ".",_
      "Geben Sie den Vornamen ein, und bestätigen Sie mit " & HText & ".")
... oder....

Code: Alles auswählen

Array(1, "Geben Sie die Firma, oder ein Leerzeichen ein und bestätigen Sie mit " & HText & ".",_
      2, "Geben Sie den Vornamen ein, und bestätigen Sie mit " & HText & ".")
# Tipp) In Funktionsköpfen bedienst du dich keiner Variablendeklaration...

Code: Alles auswählen

Public Function SetF_VarErstellen(o1)	
Um einer Fehlersuche aufgrund falsch zugewiesener Variablen zu entgehen, stets den Typ der zu erwartenden Variable angeben...

Code: Alles auswählen

Public Function SetF_VarErstellen(o1 As Object)	
# Tipp) In deinem Code werden immer noch viel zu viele Variablen erstellt, die unnötig sind und zu Verwirrung führen (können)...

Code: Alles auswählen

 Dim oTbHin as Object
 Dim TbHin  as String : TbHin  = "Hintergrund"
 oTbHin  = oDoc.Sheets.getByName(TbHin)	
Hier wird eine Variable (TbHin) für einen String erstellt, welcher ausschliesslich und einmalig für die Objektzuweisung (oTbHin) dient. Es existiert somit eine Variable, die niemals mehr irgendjemand benötigt.
Die direkte Referenzierung: oTbHin = oDoc.Sheets.getByName("Einstellungen") genügt vollkommen und man muss zudem nicht erst noch nach dem Wert von TbHin recherchieren.

Bemerkung: "Variablen dienen zur Zwischenspeicherung von Werten, die zur Laufzeit wiederverwendet werden."

Du könntest, ohne Weiteres, auf 40 - 50 Variablen in deinem letzten Code verzichten, weshalb durch die nicht mehr benötigten Definitionen etwa die Hälfte deines Codes gelöscht werden könnte.

> Nur aus Neugier...

Code: Alles auswählen

"Geben Sie die Telefax-Nr., oder ein Leerzeichen ein und bestätigen Sie mit " & HText & "."
Beim Anlegen eines neuen Benutzerdatensatzes muss der Benutzer in jedem der 13 Felder mindestens ein Leerzeichen setzen? Warum nicht einfach NICHTS, wie man das sonst so gewohnt ist?
Jetzt aber zu Deiner , wie sagtest Du , "spontaner Idee ... zu dugitalisieren????? Ähm ich dachte Bibliotheken werden am Rechner entwickelt und Rechner = Digital??? oder schreibst du das erst auf Papier???
Es enttäuscht mich gerade zutiefst, daß gerade ein Schreinermeister mit gebundenen, bedruckten Blättern aus verdichteten Holzfasern gar nichts anfangen an?! :lol:
Ich meinte natürlich eine analoge Bibliothek - aus Büchern. 8)

Falls man sich nicht mehr liest, ein besinnliches Fest und einen grandiosen Start im neuen Jahr!

Viele Grüße,

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Eingabefelder in Dialog

Beitrag von pcdirk91 »

Hi Marcel,
Erstmal Danke, für Deine Wünsche Ich wünsche Dir auch schöne Feiertage und einen sehr guten Start ins Neue Jahr. Bin derzeit bei meiner Mutter, Naja Weihnachten ist halt das Fest der Familie.
Aber der Reihe Nach:
Es enttäuscht mich gerade zutiefst, daß gerade ein Schreinermeister mit gebundenen, bedruckten Blättern aus verdichteten Holzfasern gar nichts anfangen an?!
Wieso entäuscht dich das?? Siehe es malk so: Das holz was in die Gebundene (Papierindustrie) geht steht dem Schreiner nicht zur verfügung *grins. Und dem Holzwurm sin nunmal Platten und Furnier und die daraus resultierenden schöööööööööönen Mööbel wichtiger als oll Bücher (die eh niemand liest) *gröhl. Nein Ich gebe DIr ja recht, aber ich Stand wie bei sovielen Sachen etwas auf der Leitung. Ich konnte es mir einfach nicht so vorstellen.

WIe üblich muss ich mich fürs Kopf waschen bedanken :lol: . Aber du hast *leider wieder einmal Recht. Ich werde versuchen Deine Anregungen über die Feitertage zu verinnerlichen und zu ändern.
# Tipp) Du erstellst hier für jeden Text eine eigene Variable, nur um diese dann in ein Array zu laden?!
Erstelle doch gleich zwei Arrays mit allen Texten - dann ersparst du dir auf einmal 26 Variablen? Ist nur eine Möglichkeit...
Warum ich es so gemacht habe?? Keine Ahnung . Ich nenne es mal so "BetriebsBlindheit" . erst dachte ich es wäre übersichtlicher, aber jetzt naja sagen wir mal blödsinnig. WIrd sofort umgesetzt.
# Tipp) In Funktionsköpfen bedienst du dich keiner Variablendeklaration...
# Tipp) In deinem Code werden immer noch viel zu viele Variablen erstellt, die unnötig sind und zu Verwirrung führen (können)...
Das werde ich auch ändern. Ist sicher ein gutes Argument Deinerseits. ich hatte mir das so gedacht "o1..." für Object "i1...." für Integer "s1...." für String usw aber Dein Vorschlag ist besser

Tja die "Option Explicit" . Da hatte ich am Anfang schwierigkeiten (Sprich habe den SInn zwar verstanden aber nicht die Geduld das umzusetzen) . DIes wird wohl viel Arbeit für mich sein aber wird gemacht .Punkt aus Mickey Maus.
Hier wird eine Variable (TbHin) für einen String erstellt, welcher ausschliesslich und einmalig für die Objektzuweisung (oTbHin) dient. Es existiert somit eine Variable, die niemals mehr irgendjemand benötigt.
Die direkte Referenzierung: oTbHin = oDoc.Sheets.getByName("Einstellungen") genügt vollkommen und man muss zudem nicht erst noch nach dem Wert von TbHin recherchieren.
Das kommt noch von meinen Anfängen. Wurde jetzt immer übernommen aber heute sehe ich keinen Sinn mehr darin. Wird also geändert.
Beim Anlegen eines neuen Benutzerdatensatzes muss der Benutzer in jedem der 13 Felder mindestens ein Leerzeichen setzen? Warum nicht einfach NICHTS, wie man das sonst so gewohnt ist?
Was mich da geritten hat weis ich heute auch nicht mehr. Falscher Denkansatz. Ich wollte einfach mindestems eine Eingabe erzwingen. Aber ist wie Dur richtig bemämgelt hast Unsinnig. Wird ebenfalls geämdert.

zuguterletzt leider noch eine Nachfrage zu:
Hier wird z.B. ein Objekt referenziert, welches sich während der gesamten Laufzeit des Programms nicht mehr verändern wird - wobei dies jedesmal geschieht, wenn man im Dialog eine Taste betätigt. Zumal eine Objektzuweisung ja schon geschehen sollte, wenn der zugehörige Dialog geladen wird (analog zu deinen Listenern).
Mittlerweile rufe ich ja aus meheren Modulen die Initalisierung der Dialoge heraus auf ,also aus dem , Modul "Benutzer" das Modul DIalog mit deer Proz "DialogAnAeLoe" oder aus dem Modul "Material" das Modul DIalog mit der Proz "DialogAnAeLoe" wobei der Benutzer ein anderen DIalog hat als das Material. es existiert num eine Globale Variable "odlg_DIalog" die die Eingabe felder sind ja unterschieldich.
Ist est jetz sInnvoller jedes EingabeFeld als Globale Variablee zu deklarieren, oder aus der "odlg_DIalog" abzuleiten ??.
Der Grund für die Frage ist der: ich brauche ja mindestens 7 (ich nenne das erfassungs-Dialoge) und jeder hat mehere Eingabefelder .ergo gibt es natürlich auch entsprechend viele Variablen.
Vielleicht kannst du mir da mal einen Klapp auf den Hinterkopf geben .
Und ganz zum Schluß aus Deiner SIcht sicherlich eine blöde Frage aber mir im Moment der klare Gedanke.
was ist besser ??

Code: Alles auswählen

 Sub P_MatAnlegen
 Dim oMatBez as Object  : oMatBez = oTbEin.getCellByPosition( 4,11)		
'....

oMatBez.String = oDlg_Dialog.getControl("MatBez").Text

oder :

Code: Alles auswählen

 Sub P_MatAnlegen
'....
oTbEin.getCellByPosition( 4,11) =oDlg_Dialog.getControl("MatBez").Text
1. Beispiel bedeutet ja eine Variable Mehr oder??

Sorry für diie Anfänger-Fragen aber ich versuche es ja zu lernen * Und Holzwurm hat bekanntlich ein kleineres Gehirn *lach

So nun aber Schluss mit Fragerei. Ich wümsche Dir viel <Erfolg bei Deinem Project und geniesse Weihnachten.
Verziehe mich an meine Rechner und fange an zu ämderm

Gruss Dirk
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Eingabefelder in Dialog

Beitrag von marcel_at_work »

Hallöchen Dirk, 8)
Das werde ich auch ändern. Ist sicher ein gutes Argument Deinerseits. ich hatte mir das so gedacht "o1..." für Object "i1...." für Integer "s1...." für String usw aber Dein Vorschlag ist besser
NICHT so voreilig, bitte... ich glaube, dies ist anders angekommen, als gedacht.
Variablenbezeichnungen werden auch bei mir mit Kennungen für den jeweiligen Typ erstellt. Das macht Entwicklung, Fehlersuche und Dokumentation sehr viel einfacher.
Direkte Typ-Deklarationen von Variablen sollten aus einem Grund gemacht werden:

Code: Alles auswählen

Dim a As Integer

a = 1
a = "Peter"
a = thisComponent
Zuweisung 2 + 3 würden bei Laufzeitberechnungen einen Fehler ergeben, der auch direkt bei der jeweiligen Wert-Zuweisung von der IDE so ausgegeben wird.

Wird aber auf die Typ-Zuweisung As Integer bei der Deklaration verzichtet, kann es vorkommen, daß z.B. ein Fehler aufgrund der Addition von zwei unterschiedlichen Typen (z.B. String + Integer) gar nicht oder an einer anderen Stelle angezeigt wird. Die Fehlersuche ist folglich eine Katastrophe.

Jede Deklaration von Variablen, Funktionen (wenn benötigt), etc. sollte somit der Syntax folgen: Bezeichner As Typ

Und diesem Punkt folgt schließlich auch direkt die nächste Frage...
Tja die "Option Explicit" . Da hatte ich am Anfang schwierigkeiten (Sprich habe den SInn zwar verstanden aber nicht die Geduld das umzusetzen) . DIes wird wohl viel Arbeit für mich sein aber wird gemacht .Punkt aus Mickey Maus.
Die spätere Fehlersuche nimmt potenziell mehr Zeit in Anspruch...
Starte dein Programm und teste alle Funktionen einmal. Sobald der Fehler erscheint "Variable... nicht deklariert/definiert", die benannte Variable im Code suchen und davor, an einer sinnvollen und geeigneten Stelle, zusammen mit dem erwarteten Typ deklarieren.
Ist est jetz sInnvoller jedes EingabeFeld als Globale Variablee zu deklarieren, oder aus der "odlg_DIalog" abzuleiten ??.
Der Grund für die Frage ist der: ich brauche ja mindestens 7 (ich nenne das erfassungs-Dialoge) und jeder hat mehere Eingabefelder .ergo gibt es natürlich auch entsprechend viele Variablen.
Vielleicht kannst du mir da mal einen Klapp auf den Hinterkopf geben.
Ich persönlich arbeite z.B. stets mit einem mehrseitigen Dialog und erstelle pro Dialog-TAB stets ein eigenes Modul mit Initialisierungs-Routine, die sämtliche Objektzuweisungen beinhaltet. Diese Objekte werden als public deklariert und sind somit nur aus dem jeweiligen Modul erreichbar.

Wie genau du dies umsetzen magst, hängt u.a. davon ab,...
- wie oft du diese Objekte benötigst,
- wie viel du in der IDE tippen möchtest und
- von wo du darauf zugreifen musst.
Und ganz zum Schluß aus Deiner SIcht sicherlich eine blöde Frage aber mir im Moment der klare Gedanke.
was ist besser ??
In den vorherigen Antworten habe ich dir aufgezeigt, welche Überlegungen für die Variablendeklaration überhaupt entscheidend sind.
Ich habe leider keine Ahnung, wie sich dein Code weiterentwickeln wird - entscheide deshalb selbst. Du schaffst das! 8)

Einen wundervollen Abend noch,

Marcel

Ps.: Vielleicht ändern wir den Titel des Threads mal in "Crash-Kurs BASIC und Dialoge"? :lol:
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: "Crash-Kurs BASIC und Dialoge"?

Beitrag von pcdirk91 »

Hi Marcel. Hi Balu , Hi Leute,
sorry das ich mich jetzt erst melde. Ich hatte Probleme mit der Gesundheit und in Sachen Hexaeder "Mann Sieht den Wald vor lauter Bäumen nicht"-Effekt.
Aber nun zum einzelnen:
1. Option Explicit überall eingebaut
2. Die gesamte Datei neu aufgebaut( villeicht ist damit das Problem mit "abgesicherter Modus " bei Marcel behoben.
3. Soweit ich sehe die Fertigstellung (mit einer kleinen Ausnahme) des Mat Moduls
4. In den Tabellenblättern wird nun nichts mehr berechnet(Hoffe ich habe da Balu's Rat angenommen)
5. Hausaufgaben von Marcel ( Viel gelesen und auch einiges verstanden aber nicht alles) DIe Variablen Deklaration ist mir noch teilweise unklar
6. Bin jetzt mal dabei das Dialog-Menü (das derzeit nicht dabei ist) in mehrseitige DIaloge zu ändern(War ne Anregung von Marcel und Balu)

Der Einfachhalthalber setze ich die gesamte Datei in den Beitrag
Wenn Irgenwo Probleme auftreten habe ich Sie auskommentiert)

Was ich nicht verstehe ist die Prozedur (Funktion) F_DatensatzFarbe . Wieso läuft die im Anlegen und ändern richtig ab ohne Fehler aber Beim Löschen kommt in Blatt Zeile 7 ("B8") zu einem Ausnahme Fehler . Hat das mit dem zellbereich löschen zu tun???? Habe ich aber auch auskommentiert
Ich weis ist jetzt viel Arbeit für Euch (und vielleicht auch zu öde aber ich...... hoffe mal

Die Deklaration der Arrays ist mir bei der Typ-Zuweisung auch nicht klar (viel versucht aber nicht dahintergekommen .
So ich hoffe ich verlange nicht zu viel von Euch und bin gespannt auf Eure Reaktionen

Gruss Dirk
Ps. @Marcel Dein Vorschlag wegen der Datenbank - hört sich gut an aber jetzt erstmal das hier in die Bahnen bringen
Dateianhänge
Grundaufbau für Hexaeder.ods
(41.94 KiB) 199-mal heruntergeladen
Antworten