wie spricht man Options-Boxen in einem Formular an????

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

Moderator: Moderatoren

der.milco
***
Beiträge: 51
Registriert: Mo, 07.11.2005 16:44

wie spricht man Options-Boxen in einem Formular an????

Beitrag von der.milco »

ich habe in einem Tabellen-Dokument (StarOffice 6.0 / Calc) auf der sogenannten Drawpage drei Optionsboxen erstellt.

===>>> KEIN Dialog !!

diese sollen je nachdem, welche Box aktiv ist, einen Text in eine Zelle schreiben.

ich versuche nun schon in unzähligen Varianten im BASIC-Code die Optionsboxen anzusprechen, krieg sie aber nicht dazu, drei verschiedene Texte zu schreiben. (zwei bekomme ich hin)

Die gruppierung habe ich gemacht, indem ich allen den gleichen Namen gegeben habe (RadioGroup1) und allen dreien ein Beschriftungsfeld (FrameControl) übergeordnet.
Da die Gruppierung durch den programm-integrierten Auto-Piloten gemacht wurde, hat jede Optionsbox einen anderen Referenzwert (1, 2 und 3).

Im Dialog ist es einfacher, da ich die Boxen mit ihrem Namen ansprechen und entsprechende Ereignisse zuordnen kann.
Aber da im Formular alle drei Boxen den gleichen Namen haben, weiß ich nicht, wie ich sie unterscheiden soll.

Ich habe es mit diesem Code probiert (allen OptBoxen zugeordnet):

Code: Alles auswählen

sub Optionen
   doc     = thisComponent
   sheet   = doc.sheets(0)
   cellD5  = sheet.getCellRangeByName("$D$5")
   form    = sheet.drawpage.forms(0)
   Opt     = form.getByName("RadioGroup1")
   
   if Opt.state = 0 then
     cellD5.string = "Opt 1"
   end if
   if Opt.state = 1 then
     cellD5.string = "Opt 2"
   end if
   if Opt.state = 2 then
     cellD5.string = "Opt 3"
   end if
end sub
dann habe ich überall den Status geändert, in der Hoffnung er würde sich auf den Referenzwert beziehen (allen OptBoxen zugeordnet):

Code: Alles auswählen

sub Optionen
   doc     = thisComponent
   sheet   = doc.sheets(0)
   cellD5  = sheet.getCellRangeByName("$D$5")
   form    = sheet.drawpage.forms(0)
   Opt     = form.getByName("RadioGroup1")
   
   if Opt.state = 1 then
     cellD5.string = "Opt 1"
   end if
   if Opt.state = 2 then
     cellD5.string = "Opt 2"
   end if
   if Opt.state = 3 then
     cellD5.string = "Opt 3"
   end if
end sub
dann habe ich den hier probiert (und jeder OptBox eine eigene Sub zugeordnet):

Code: Alles auswählen

sub Option1
   doc     = thisComponent
   sheet   = doc.sheets(0)
   cellD5  = sheet.getCellRangeByName("$D$5")
   form    = sheet.drawpage.forms(0)
   Opt     = form.getByName("RadioGroup1")
   
   if Opt.state = 1 then
     cellD5.string = "Opt 1"
   end if
end sub

sub Option2
   doc     = thisComponent
   sheet   = doc.sheets(0)
   cellD5  = sheet.getCellRangeByName("$D$5")
   form    = sheet.drawpage.forms(0)
   Opt     = form.getByName("RadioGroup1")
   
   if Opt.state = 1 then
     cellD5.string = "Opt 2"
   end if
end sub

sub Option3
   doc     = thisComponent
   sheet   = doc.sheets(0)
   cellD5  = sheet.getCellRangeByName("$D$5")
   form    = sheet.drawpage.forms(0)
   Opt     = form.getByName("RadioGroup1")
   
   if Opt.state = 1 then
     cellD5.string = "Opt 3"
   end if
end sub
Hat jemand ne Idee, wie das funzt??? :?:
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

hey milco,
Hat jemand ne Idee, wie das funzt???
Ja, hab ich :D

1. Wichtig zu wissen: Zwischen Version OOo 1.1.x und OOo 2.0 gab es einige Änderungen, die (leider) genau hier greifen. Es ista laso wichtig zu wissen, mit welcher Version du arbeitest.

Nun zum Vorgehen:
Ich geb dir mal den prinzipiellen Weg und lass dich experimentieren. Wenn du dann nicht weiterkommst, meld dich nochmal.

Wie du richtig festgestellt hast, werden Optionsboxen im Formular zu einer Gruppe zusammengefasst, in dem man allen den gleichen Namen gibt. So sind sie individuell nicht direkt ansprechbar - wohl aber vorhanden!

Die Gruppe wird als Array aller einzelobjekte abgebildet, du musst also zunächst die Gruppe erhalten (mit der Methode "getGroupByName()", aber Vorsicht: Hier gab es die Änderungen zwischen Version 1.1 und 2.0!)
Dann iterierst du durch die einzelnen Arrayobjekte (mittels einer Schleife) und prüfst Objekt für Objekt.
Um nun eine Eindeutigkeit des einzelnen Buttons zu gewährleisten, kannst du entweder über den Label gehen (falls zugeordnet) oder - und das ist meine Empfehlung - über die Eigenschaft "Tag", die jeder Optionsbutton zur Verfügung stellt und die du frei definieren kannst. Vergib hier eine eindeutige Bezeichnung (z.B. op1, op2, op3...) dann kannst du die Felder eindeutig idenifiieren und den Status abfragen.

So, ich hoffe, das hilft erst einmal.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
der.milco
***
Beiträge: 51
Registriert: Mo, 07.11.2005 16:44

Beitrag von der.milco »

hmmm... :(

also, das hört sich zwar sehr wichtig an, aber ich habe keine Ahnung wovon du redest!!

Version ist StarOffice 6.0 Programm CALC

Mit Schleifen habe ich noch nicht gearbeitet.
Das Beispiel im Programmierhandbuch mit dem Sortieren der Namen habe ich nur grob verstanden, weiß aber nicht, wie ich es auf mein Problem anwenden soll... :cry:

Die Eigenschaft Tag kann ich in den Kontrollfelder-Eigenschaften nicht finden, oder soll dies die Referenz sein, von der ich oben gesprochen habe?

Könntest du mir einen Code zeigen, mit dem es gehen könnte?? :?
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey milco,
Könntest du mir einen Code zeigen, mit dem es gehen könnte?
Ja, könnte ich. Aber - ich hab das ja schon mal in einem andern Thread gepostet - ich fürchte, das alles geht nicht in StarOffice 6.0. Zu alt. Da kann ich keinen Support bieten.
Willst du nicht updaten???

Code folgt im nächsten Thread :wink:

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
der.milco
***
Beiträge: 51
Registriert: Mo, 07.11.2005 16:44

Beitrag von der.milco »

hi toxi,
Willst du nicht updaten???
Würde ich gerne, aber ich brauche dieses Projekt beruflich und da ist nur StarOffice 6 vorhanden.
Soll ne Arbeitserleichterung / Beschleunigung werden.

-----------------------------

Vielleicht kannst du mir noch bei was anderem helfen:
Also ich mach mir ja ein Formular und da sollen einige Werte in bestimmte Zellen übernommen werden!

Mit dem Textfeld bekomme ich das auch ohne Probleme hin:

Code: Alles auswählen

Sub Schreibe_Textfeld_In_Zelle
  doc = thisComponent
  sheet = doc.sheets(0)
  cell = sheet.getcellrangebyname("$B$5")
  form = sheet.drawpage.forms(0)

  Textfeld = form.getbyname("TextField1")
  lesen = Textfeld.text

  cell.string = lesen
End Sub
Aber den gleichen Code kann ich nicht auf eine Combobox anwenden.
Von einem Dialog aus kann ich diesen verwenden:

Code: Alles auswählen

sub Schreibe_Combobox_In_Zelle
   myDoc        = thisComponent
   mySheet      = myDoc.sheets(0)
   Cell_B10      = mySheet.getCellRangeByName("$B$10")

   Combobox    = dlg.getControl("Combobox1")
   Lesen = Typ_CoB_1.getText

   Cell_B10.string = Lesen
end sub
Aber getText funktioniert im Formular nicht. Da passiert gar nichts!

Hast Du ne Idee, wie ich die Texte bzw. Einträge aus
-Comboboxen
-Listboxen
-Nummernfeldern
-Währungsfeldern
übernehmen kann :?: :?: :?:
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Milco,
Hast Du ne Idee, wie ich die Texte bzw. Einträge aus ...
Ja, sicher, aber auch hier gilt: Wissen ist nur gültig für OOo 1.1 / OOo 2.0. Wie weit das auch auf StarOffice 6 übertragen weren kann, weiss ich nicht. Da gab es einige Änderungen in der API.

Aber: erster Tipp: Nutz die Methoden dbg-properties und dbg_methods, um dir die Möglichkeiten der Objekte anzeigen zu lassen.
Also z.B.

Code: Alles auswählen

...
myDoc        = thisComponent
   mySheet      = myDoc.sheets(0)
   Cell_B10      = mySheet.getCellRangeByName("$B$10")

   Combobox    = dlg.getControl("Combobox1") 
   msgbox Combobox.dbg_properties
   msgbox Combobox.dbg_methods
   ...
Da kannst du meist sehen, welche Eigenschaften unterstützt werden.

Numerische Felder haben eine value Eigenschaft, die den Wert (die Zahl) beinhaltet.
Listboxen sind zusammengesetzte Felder, die Einträge stehen als Array zur Verfügung. "SelectetItems" liefert den Array der ausgewählten Einträge, wobei die Indexnummern gespeichert und geliefert werden.
"StringItemList" liefert als Array die dargestellten Einträge (als Text).
Über die Indexnummern und die Liste kannst du die gewählten Einträge rekonstruieren.
Gleiches gilt für Combo-Boxen. Diese bestehen aus einem Textfeld und einer Listbox. Den aktuell angezeigten Text erhälst du mit der Eigenschaft "Text" -immer, auch wenn dort Zahlen stehen. Auch die werden intern als Text gespeichert.

So, noch ein Codeschnipsel für deine Optionsbuttens (bedenke, der Code stammt aus OOo 2.0!):

Code: Alles auswählen

Sub OptionsfeldAuslesen
  Dim oDoc as Object		'das Dokument
  Dim oForm as Object		'das Formular
  Dim oElement as Object	'das Model des Elementes
  Dim aOpt()			'Array aller Optionsfelder einer Gruppe
  Dim s$

  oDoc = thisComponent
  oForm = oDoc.Drawpage.forms(0)
  oForm.getGroupByName("opt", aOpt)
  for i=LBound(aOpt) to UBound(aopt)
     if aOpt(i).state then
       s = "Gewählte Option:" & Chr$(10) &_
          "Name:  " & aOpt(i).name & CHR$(10) &_
           "Status:  " & aOpt(i).state & CHR$(10) &_
           "Tag:  " & aOpt(i).Tag & CHR$(10) &_
           "Label:  " & aOpt(i).Label 
      End if
  Next
  MsgBox s, 0, "Ihre Wahl:"
End Sub
Hier werden aus drei Optionsbuttons die entsprechenden Werte ausgelesen.


Gruss
Thomas[/img]
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
der.milco
***
Beiträge: 51
Registriert: Mo, 07.11.2005 16:44

Beitrag von der.milco »

Hallo Thomas,

habe nun lange hin und her probiert. Das meißte konnte ich auch gut lösen. Der Tipp mit
msgbox Combobox.dbg_properties
msgbox Combobox.dbg_methods
war sehr hilfreich!

Leider gelingt es mir bis jetzt nicht bei den Listboxen... :(
Mein Code sieht so aus:

Code: Alles auswählen

Sub WriList
  myDoc   = thisComponent
  mySheet = myDoc.sheets(1)
  myForm  = mySheet.drawpage.forms(0)
  myCell  = mySheet.getCellRangeByName("$B$10")
  myCtl   = myForm.getByName("ListField1")

  lese = myCtl.SelectedItems
  myCell.string = lese
End Sub
Der will aber nicht funktionieren. Er markiert mir die Zeile

Code: Alles auswählen

  myCell.string = lese
und meldet
  • Objektvariable nicht belegt
Muss ich da irgendwas deklarieren? oder DIMmen?

Könntest du mir bitte eine vollständige Sub zeigen, in der es bei dir funktioniert??
Danke
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey MIlco,
Muss ich da irgendwas deklarieren? oder DIMmen?
Nein, aber korrekt programmieren.

Code: Alles auswählen

 lese = myCtl.SelectedItems 
Liefert dir einen Array mit den selektierten Texten. Den kannst du nirgends direkt einlesen.
Gewöhne dir an, Varaible exakt zu definieren (am Anfang, mit DIM). Setze einen kleinen Buchstaben vor die Varaibel zur Kennzeichnung des Typs (für dich.
Der Array "lese" ist nicht identisch mit der Varaiblen "lese", so wie du sie verwendest. Insofern die Fehlermeldung.
Funktionieren könnte:

Code: Alles auswählen

myCell.string = lese(0)
Jetzt wird der erste String des Arrays geschrieben.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
der.milco
***
Beiträge: 51
Registriert: Mo, 07.11.2005 16:44

Beitrag von der.milco »

ey super, das hat geklappt. Danke für die Hilfe.

Hab auch schon wieder ein neues Problem:
viewtopic.php?p=18911#18911
Antworten