Calc Dialoge

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

Moderator: Moderatoren

kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Calc Dialoge

Beitrag 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
:lol: Win 10
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Calc Dialoge

Beitrag von kalle05 »

Noch ein Hinweis.
Nach "then" muss stehen, dass der Cursor in das nächste Feld springen soll.
Gruß
Kalle
:lol: Win 10
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Calc Dialoge

Beitrag 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))
Gruß,
mikeleb
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Calc Dialoge

Beitrag von kalle05 »

Hallo mikeleb
dein
="juhu"
habe ich durch

Code: Alles auswählen

oDlg1.getControl("NachName").Text
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
:lol: Win 10
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Calc Dialoge

Beitrag 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))
Gruß,
mikeleb
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Calc Dialoge

Beitrag 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 :lol:
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
:lol: Win 10
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Calc Dialoge

Beitrag 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
Gruß,
mikeleb
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Calc Dialoge

Beitrag 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
:lol: Win 10
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Calc Dialoge

Beitrag 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.
Gruß,
mikeleb
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Calc Dialoge

Beitrag 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
:lol: Win 10
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Calc Dialoge

Beitrag von mikeleb »

Hallo,
es muss halt der aktuelle step mitbeachtet werden. Wie heißen die Elemente durch die per Enter gesprungen werden soll.
Gruß,
mikeleb
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Calc Dialoge

Beitrag von kalle05 »

Hallo
wie schon erwähnt

Code: Alles auswählen

oDlg1.getControl("NachName")
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.

Code: Alles auswählen

oDlg1
steht also für die Seite 1 = Step 1
Deshalb ist dies für mich ja so schwierig.
LG
Kalle
:lol: Win 10
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Calc Dialoge

Beitrag 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?
Gruß,
mikeleb
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Calc Dialoge

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

Code: Alles auswählen

oDlg1.getControl("NachName")
Allerdings sind es List-, Comboboxen und Textfelder.
Bis denne
Kalle
:lol: Win 10
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Calc Dialoge

Beitrag 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 ...
Gruß,
mikeleb
Antworten