Seite 1 von 2
Calc Dialoge
Verfasst: Di, 11.01.2022 19:14
von kalle05
Hallo Freunde von AOO
leider komme ich z.Zt. nicht weiter. Seit Wochen suche ich nach einer Lösung, um den
ersten Buchstabe bei Vor- und Nachnamen groß schreiben zu lassen.
Meine Versuche
Code: Alles auswählen
oSheet.getCellRangeByName("D" & End_Row).String = Ucase(oSheet.getCellRangeByName("D" & End_Row).String
bringen nur Großbuchstaben im Textfeld zustande.
Wie muss ich weiter vorgehen ?
Eine zweite Frage habe auch noch. In meinem Dialog habe ich ungefähr 20 Felder, List- und Comboboxen und Textfelder.
Ist es möglich, die Felder mit dieser u.a. Taste zu belegen ?
Code: Alles auswählen
Private Sub TextField2_KeyPressed(oEvt)
If oEvt.keycode = 1280 Then
Was muss nach "then" stehen ?
Für eure Hilfe wäre ich dankbar.
Gruß
Kalle
Re: Calc Dialoge
Verfasst: Di, 11.01.2022 19:23
von kalle05
Noch ein Hinweis.
Nach "then" muss stehen, dass der Cursor in das nächste Feld springen soll.
Gruß
Kalle
Re: Calc Dialoge
Verfasst: Mi, 12.01.2022 09:49
von mikeleb
Hallo,
nach "Then" müsste der Fokus auf das nächste Element (z. B. über des Namen mit fortlaufender Nummer) gesetzt werden.
Für die Buchstaben, z. B.
Code: Alles auswählen
sTmp="juhu"
sTmp_neu=ucase(left(sTmp,1)) & lcase(mid(sTmp,2))
Re: Calc Dialoge
Verfasst: Mi, 12.01.2022 16:39
von kalle05
Hallo mikeleb
dein
="juhu"
habe ich durch
ersetzt.
Auch sTmp habe ich überschrieben, und zwar so:
Code: Alles auswählen
oSheet.getCellRangeByName("D" & End_Row).String = Ucase(left(oSheet.getCellRangeByName("D" & End_Row,1)) & lcase(mid(oSheet.getCellRangeByName("D" & End_Row,2)).Text
Beide Vorgehensweisen leider ohne Erfolg.
Da ich mich immer noch als Anfänger bezeichne, komme ich so nicht weiter. Vielleicht kannst du mir deine Methode erläutern, um deine Überlegungen nachzuvollziehen zu können.
Gruß
Kalle
Re: Calc Dialoge
Verfasst: Mi, 12.01.2022 17:26
von mikeleb
Hallo,
um den Code einfacher lesbar zu machen, halte ich es für sinnvoll, die Objekte in Variablen "zu setzen". Dann kommt man auch weinger mit den Klammerebenen durcheinander.
Code: Alles auswählen
'Auslesen des Strings in der Zelle
sTmp=oSheet.getCellRangeByName("D" & End_Row).String
'Zerlegen des Strings in zwei Teile: 1. Zeichen und Rest
'Left(sTmp,1) liefert das 1. Zeichen von links
'Mid(sTmp,2) liefert alles ab dem 2.Zeichen
'1. Zeichen groß -> ucase
'Rest klein -> lcase
'in die Zelle schreiben
oSheet.getCellRangeByName("D" & End_Row).String= UCase(Left(sTmp,1)) & LCase(Mid(sTmp,2))
Re: Calc Dialoge
Verfasst: Mi, 12.01.2022 18:03
von kalle05
Hallo mikeleb,
vielen Dank für deine Erläuterungen. Wieder habe ich etwas gelernt. Natürlich werde ich auch die Verschachtelung ausprobieren, dies verschafft Platz
Mit Gross2 usw habe ich versucht, das Problem zu lösen, bis mir klar wurde: Dies schaffe ich nicht. In der aktuellen Version von Andrew Pitonyak ahnte ich schon, dass eine Verschachtelung stattfinden musste. Nur wie.
Nochmals vielen Dank.
Du hast auch Ahnung von diesem Problem.
Mit
Code: Alles auswählen
Private Sub TextField_KeyPressed(oEvt)
If oEvt.keycode = 1280 Then
konnte ich nur eine Sub aufrufen und zwar so: call Dlg_PWAbfrage()
aber nicht in ein anderes Feld springen. Meine Versuche mit call, next, readTextField = oDlg1.getControl("txt_Plz").Text
usw. brachten keinen Erfolg.
Du schreibst: "der Fokus auf das nächste Element (z. B. über des Namen mit fortlaufender Nummer) gesetzt werden." aber wie ?
Muss ich -setFocus- in der Sub schreiben.
Bis denne
Kalle
Re: Calc Dialoge
Verfasst: Mi, 12.01.2022 20:19
von mikeleb
Hallo,
wenn du den folgende Code dem Ereignis "Taste losgelassen" von TextField1 zuordnet, wird beim Drücken von Enter zum TextField2 gewechselt
Code: Alles auswählen
Sub TextField_KeyPressed(oEvt)
otf=oDlg1.getControl("TextField2")
If oEvt.keycode = 1280 Then
otf.setfocus
End if
end sub
Um jetzt nicht jedem einzelnen Element ein eigenes Makro zuzuordnen, sollte man es so gestalten, dass man vom aktuellen Element zum nächsten springt.
Um z. B. durch 20 Textfelder zu rotieren, würde ich zunächst diese Felder korrekt durchnummerieren: TextField1, TextField2, ..., TextField20
und dann jedem Textfeld (seinem Ereignis Taste losgelassen) dieses Makro zuordnen
Code: Alles auswählen
Sub TextField_KeyPressed(oEvt)
If oEvt.keycode = 1280 Then
'Nummer des aufrufenden Textfeldes auslesen
aktuell=int(mid(oevt.source.model.name,10))
'nächstes Feld
naechster="TextField" & aktuell+1
'falls diese Nummer nicht existiert nimm das erste
if not oDialog.model.hasbyname(naechster) then
naechster="TextField1"
end if
'Fokus neu setzen
oDlg1.getControl(naechster).setfocus
End if
end sub
Re: Calc Dialoge
Verfasst: Mi, 12.01.2022 22:09
von kalle05
Hallo mikeleb,
der erste Teil deines Makro funktioniert. Bei dem zweiten Teil müsste ich offensichtlich die Felder in ( Textfield 1, Textfield 2 usw.) umbenennen.
Dies könnte ich machen. Aber ...
Nachdem ich über Grid eine Zeile markiert habe, rufe ich die Seite 2 "Änderung der Daten" ( z. B. Step 2) auf und dann wird, bei gleicher Bennenung der Felder, gemeckert (Erfahrungswert).
So habe ich auf der zweiten Seite die Felder schon mit einem anderen Namen versehen.
Möglich, dass ich etwas falsch gemacht habe, doch so funktioniert das zweite Makro nicht. Der Cursor ist im zweiten Feld nicht mehr sichtbar und ich kann auch keine Buchstaben eintippen -sie werden nicht genommen.
Möglicherweise müsste ich irgendwie mit "oDlg1.getControl" arbeiten. Hat Du vieleicht noch einen Vorschlag?
LG
Kalle
Re: Calc Dialoge
Verfasst: Mi, 12.01.2022 22:26
von mikeleb
allo,
Ideen gibt es viele ...
Ich vermute jetzt mal, dass du einen mehrseitigen Dialog hast (unabhängig von den Ebenen (steps) gilt: der Name eines Kontrollelements muss eindeutig sein). Mein Makro ist natürlich nur ein Beispiel, das auf deine konkreten Elemente und deren Namen angepasst werden muss.
Weitere Vermutungen anzustellen ist wenig zielführend. Sinnvoller wäre es, wenn du uns deinen Dialog zur Verfügung stellen würdest.
Re: Calc Dialoge
Verfasst: Mi, 12.01.2022 22:46
von kalle05
Hallo mikeleb,
meine Datei hat 356 kb, mit anderen Worten, ich habe Monate gebraucht, um viele meiner Wünsche umzusetzen: Lesen in diesem Forum und Pdf-Dateien und hin und wieder eine Frage in diesem Forum gestellt.
Ein Hochladen kommt daher leider nicht in Frage.
Insofern wirst Du, und sicher auch alle Leser, Verständnis dafür haben, dass ich diese Datei nicht hochladen möchte. Eine abgespeckte Version bringt auch nicht viel, da dies noch mehr Arbeit bedeutet, zumal ich mit dieser Datei noch nicht fertig bin.
Du hast recht mit Deiner Vermutung, es sind bisher sieben Seiten in dem mehrseitigen Dialog. Jedes Feld hat einen eigenen Namen -bei der Eingabe der Daten und bei den Änderungen der Daten auf Seite zwei.
Es wäre natürlich schön, wenn ich durch eine Sub in die nachfolgenden Felder springen könnte.
LG
Kalle
Re: Calc Dialoge
Verfasst: Mi, 12.01.2022 23:05
von mikeleb
Hallo,
es muss halt der aktuelle step mitbeachtet werden. Wie heißen die Elemente durch die per Enter gesprungen werden soll.
Re: Calc Dialoge
Verfasst: Do, 13.01.2022 00:17
von kalle05
Hallo
wie schon erwähnt
für den Nachnamen, das Feld für Vorname heißt: Vorname, für die Postleitzahl: PLZ usw.
Dies bedeutet, dass für jedes Feld (List- oder Comboboxen, Textfelder ) jeweils ein Bezeichnung steht.
steht also für die Seite 1 = Step 1
Deshalb ist dies für mich ja so schwierig.
LG
Kalle
Re: Calc Dialoge
Verfasst: Do, 13.01.2022 10:33
von mikeleb
Hallo,
es ist eine Frage des Designs und wie allgemein so ein Makro werden soll. Wenn es nur um fest definierte Elemente geht wird es einfach. Soll es flexibel für spätere Erweiterungen sein, dann muss man intensiver nachdenken.
Nebenbei: üblicherweise springt man in solchen Formularen per Tabulator weiter (dafür ist dann die Aktivierungsreihenfolge relevant).
Eine Idee wäre jetzt: Bei Enter wird zum nächsten Element in der Aktivierungsreihenfolge gesprungen (ich bin gerade nicht sicher, ob die stepabhängig ist). Soll dabei ggf. auch der Step gewechselt werden, sprich auf die nächste Dialogseite gewechselt werden?
Re: Calc Dialoge
Verfasst: Do, 13.01.2022 12:17
von kalle05
Guten Morgen mikeleb,
bisher nutzte ich den Tabulator, wobei ich natürlich die Aktivierungsreihenfolge gesetzt habe. Nur habe ich mich dabei ertappt, dass ich unwillkürlich die Return- bzw. Enter-Taste benutzte. Deshalb ist es m.M. nach sinnvoll, die Return-Taste einzusetzen.
So, wie ich die Reihenfolge bestimmt habe, sollte auch die Enter-Taste funktionieren, und es sollte auch nur auf einer Seite bleiben. Auf der zweiten Seite, zweites Modul, werden ggf. Änderungen der Eingaben vorgenommen, so dass nicht alle Felder in einer bestimmten Reihenfolge gebraucht werden.
Wie bereits beschrieben, haben die Felder eine Bezeichnung, d.h. sie sind fest definierte Elemente. Hier noch einmal das Beispiel:
Allerdings sind es List-, Comboboxen und Textfelder.
Bis denne
Kalle
Re: Calc Dialoge
Verfasst: Do, 13.01.2022 12:24
von mikeleb
Hallo,
ich habe mal ein bisschen herumgespielt:
Code: Alles auswählen
Sub tab_finden (oEvt)
'Auslesen des aktuellen Index in der Aktivierunsgreihenfolge
aktuell=oevt.source.model.tabindex
'Zugriff auf den Dialog, unnötig falls die Dialogvariable schon global existiert
odialog=oevt.source.context
'Array aller Kontrollelemente erstellen
ac= odialog.controls
'Finden und aktivieren des nächsten Index, indem alle Elemente des Dialogs durchlaufen werden
'wenn es das letzte Element ist, bleibt der Fokus dort
i=0
do until i>ubound(ac)
if ac(i).model.tabindex=aktuell+1 then
ac(i).setFocus
'setzen des Dialog-Step passend zum Kontrollelement
if ac(i).model.step>0 then
odialog.model.step=ac(i).model.step
i=ubound(ac)
end if
i=i+1
loop
end sub
Hier werden allerdings alle Kontrollelemente beachtet (auch Schaltflächen etc.), was in deinem Fall wohl nicht gewünscht wäre.
Sollen nur Eingabefelder und Komboboxen angesprungen werden, könnte man es so machen:
Code: Alles auswählen
Sub tab_finden2 (oEvt)
'Auslesen des aktuellen Index in der Aktivierunsgreihenfolge
aktuell=oevt.source.model.tabindex
'Zugriff auf den Dialog, unnötig falls die Dialogvariable schon global existiert
odialog=oevt.source.context
'Array aller Kontrollelemente erstellen
ac= odialog.controls
'Finden und aktivieren des nächsten Index, indem alle Elemente des Dialogs durchlaufen werden
'es werden dabei nur Eingabefelder und Komboboxen beachtet
'wenn es das letzte Element ist, bleibt der Fokus dort
i=0
neu=ubound(ac)+1
do until i>ubound(ac)
if ac(i).model.tabindex>aktuell and ac(i).supportsservice("com.sun.star.awt.UnoControlEdit") and i<neu then
neu=i
end if
i=i+1
loop
if neu<=ubound(ac) then
ac(neu).setFocus
'setzen des Dialog-Step passend zum Kontrollelement
if ac(neu).model.step>0 then
odialog.model.step=ac(neu).model.step
end if
end if
end sub
Bei der Gelegenheit tauchte das Problem auf, wie man herausfinden kann, ob ein Kontrollelement ein einfaches Textfeld ist. Soweit ich es gefunden habe unterstützt es nur den Service "com.sun.star.awt.UnoControlEdit" der aber auch von anderen (Datumsfeld, Kombobox etc.) unterstützt wird, sodass man es daran nicht unterscheiden kann ...
Man könnte auch ein Array mit den gewünschten Kontrollelementen anlegen, die durchlaufen werden sollen ...