Textfeld Text bei Fokuserhalt markieren

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Textfeld Text bei Fokuserhalt markieren

von Vanished » Do, 30.12.2004 14:04

Vielen Dank für Deine Antwort!

Sie bringt mich um einiges mehr weiter, als die bloße Lösung dieses Problems hier.

Ich tue mich halt noch sehr schwer mit den Objektdefinitionen. In diesem Fall habe ich mich mit com.sun.star.awt.XTextComponent rumgeschlagen, da ich dort die Methode setSelection() fand.
Die Lösung bringt mich daher dem Verständnis des API etwas näher.

Was die Gosub-Struktur angeht, verspreche ich Besserung. Ich werde mein Projekt mal durchforsten und aufräumen.

Nochmals vielen Dank!
Vanished

von Toxitom » Do, 30.12.2004 13:11

Hallo Vanished,
Ich habe mich eine ganze Weile mit setSelection beschäftigt ...., kriege es aber - mal wieder - nicht hin.
Hmm, na ja, ist ja auch nicht gerade der beste Start für "Anfänger".
Das Textfeld besitzt eine Eigenschaft - den Text, das hast du schon herausbekommen.
Dann gibt es die Methode setSelection(), der du ein Objekt übergeben musst, und zwar vom Typ com.sun.star.awt.Selection. Dieses Objekt besitzt zwei Eigenschaften, die untere Grenze(min) der Selektion und die obere Grenze (max), jeweils als Long übergeben. Im Fall des "normalen Textfeldes" sind dies einfach die Position der Zeichen.
Das heisst in deinem Fall, dort wo du den Fokus auf das Textfeld setzt (genau davor):

Code: Alles auswählen

dim oSel as new com.sun.star.awt.Selection
  oSel.min = 0  'erstes Zeichen
  oSel.max = len(prod)    'letztes Zeichen - eben der komplette Text
  oDialog.getcontrol("tf3").setSelection(oSel)
  oDialog.getcontrol("tf3").setfocus() 
Das sollte es gewesen sein.

Noch ein paar Bemerkungen zum Code: Goto, GoSub etc ist heute kein schöner Code mehr und sollte unbedingt vermieden werden. Die Strukturen können in zukünftigen Versionen auch ohne Hinweis komplett herausgenommen werden.
Man löst soetwas heute durch direkten Aufruf von Subs oder Funktions, dadurch wird der Code leichter lesbar und übersichtlicher.

Viele Grüße
Thomas

Textfeld Text bei Fokuserhalt markieren

von Vanished » Mi, 29.12.2004 15:14

Eine Weile bin ich (auch Dank Eurer Hilfe) gut weitergekommen, aber nun hänge ich an einem neuen Problem fest.

Stark vereinfacht geht es darum, dass nach einer Prüfziffernberechnung das Feld mit der zu prüfenden Zahl wieder den Focus erhalten soll (soweit kein Problem), der darin enthaltene Text (Zahlen) soll dann aber vollständig markiert sein (so wie es bei einem Sprung mit Tab auch der Fall ist).

Ich habe mich eine ganze Weile mit setSelection beschäftigt (weil ich es aus VBA kenne), kriege es aber - mal wieder - nicht hin.

Falls nicht klar geworden sein sollte, worum es geht, hier ein (ebenfalls stark vereinfachter) Beispielcode, ein Dialog mit einem Textfeld und einem CommandButton. Nach dem Auslösen der OK-Schaltfläche der MsgBox soll der gesamte Text im Textfeld markiert sein.

Code: Alles auswählen


Dim oDialog as Object
Sub Dialog_starten
	DialogLibraries.LoadLibrary("Standard")
	oDialog=Createunodialog(dialogLibraries.Standard.Produkt)
	oDialog.execute()
	oDialog.dispose()
End Sub

'Prüfung der Eingaben zur Produktnummer und Prüfzifferncheck sub läuft als Ereignis "Text modifiziert"
sub produkt
	if len(oDialog.getcontrol("tf3").Text)<4 then exit sub
	if len(oDialog.getcontrol("tf3").Text)=4 then gosub pzberechnen
	Exit sub
	
	pzberechnen:
		Dim prod as string
		Dim p1 as Integer, p2 as Integer, p3 as Integer
		'Feld auslesen
		prod = oDialog.getcontrol("tf3").Text
		'aufsplitten und berechnen
		p1 = CDbl(Left(prod, 1)) * 3
		p2 = CDbl(Mid(prod, 2, 1)) * 2
		p3 = CDbl(Mid(prod, 3, 1)) * 1
		pz = (p1 + p2 + p3) Mod 11
		If pz <> CDbl(Right(prod, 1)) Then GoSub pznichtok else gosub pzok
	return

	pzok:
		oDialog.getControl("tf3").Model.TextColor=rgb(0,0,0)
		msgbox("Die Prüfziffer ist " + pz + " und damit OK!")
	return
	
	pznichtok:
		'wenn die Prüfziffer nicht korrekt ist, Textfeld mit roter Schrift versehen
		oDialog.getControl("tf3").Model.TextColor=rgb(255,0,0)
		'Noch eine Mitteilung schreiben
		msgbox "Die Produktnummer" + chr(13) + prod + chr(13) + "ist fehlerhaft. Die PZ müßte " + pz + " sein", 48, "Produktnummer"
		'Den Focus auf Produkt setzen
		oDialog.getcontrol("tf3").setfocus()
	return
End Sub
	
sub loeschen
	oDialog.getControl("tf3").Model.TextColor=rgb(0,0,0)
	oDialog.getcontrol("tf3").Text=""
	oDialog.getcontrol("tf3").setfocus()
End sub
Und denkt bitte daran: Ich bin Anfänger, also bitte gnädig sein beim Zerreißen des Codes ;)

Viele Grüße,
Vanished

Nach oben