Problem mit der API-Dokumentation

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

Moderator: Moderatoren

Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Problem mit der API-Dokumentation

Beitrag von Vanished »

Naja, zunächst gehe ich vorsichtig mal davon aus, dass _ich_ einen Fehler mache.

Folgendes: Ich habe ein Control, das optisch mal eine ComboBox, mal ein Textfeld sein soll (das die CB technisch automatisch auch ein Textfeld ist, ist mir klar). Also habe ich in der API gesucht und bin auch fündig geworden (http://api.openoffice.org/docs/common/r ... Model.html). Die Eigenschaft "Dropdown=true/false" ist genau das, was ich brauche.
Ich habe es mit

Code: Alles auswählen

oMeinDialog.getControl("MeineComboBox").Model.Dropdown=false
probiert. Es passiert aber nichts. Alle anderen Eigenschaften lassen sich problemlos zuweisen.

Mache ich etwas falsch oder stimmt tatsächlich in der Doku zur API etwas nicht?

Viele Grüße,
Vanished
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Vanished,
Mache ich etwas falsch oder stimmt tatsächlich in der Doku zur API etwas nicht?
Nein, die Doku ist schon ok. Ich denke, das liegt eher am System. Das Model wird benutzt, um die Dialogbox zu erzeugen. Dort werden die Eigenschaften festgelegt. Ist die Box (DropDown) aber erst einmal gezeichnet, kannst du sie wohl kaum ändern. Du kannst zwar im Model die Eigenschaft ändern (und auch auslesen), aber ich gleucbe nicht, dass dieses eine direkte auswirkung auf dei Box selbst hat (ist ja keine Eigenschat der Box, sondern des Models). Du müsstest also die Eigenschaft des Models ändern und anschliessend die Box auf Baiss des neuen Models neu zeichnen.
Aber ob und wie das geht, kann ich dir nicht auf Anhieb sagen.
Ist nur eine Denkrichtung für eine mögliche Lösung.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Hmmm, ich verstehe Deine Argumentation schon und werde ihr auch folgen, wenn Du mir erklärst, warum ich zur Laufzeit Teile des Controls wie z.B. die Hintergrundfarbe, den Rahmen, das Schriftbild, die Höhe und Breite des Controls usw. ändern kann, den aus dem gleichen Model gezeichneten Dropdownbutton aber nicht?
Ein

Code: Alles auswählen

oMeinDialog.getControl.("MeineCombobox").Model.Border=2
zeichnet nämlich eine CBox mit einfachem Rand, ein

Code: Alles auswählen

oMeinDialog.getControl.("MeineCombobox").Model.BackgroundColor=rgb(0,0,0)
einen schwarzen Hintergrund. Daher würde ich bei einem

Code: Alles auswählen

oMeinDialog.getControl("MeineComboBox").Model.Dropdown=false
halt erwarten, dass der Dropdown-Button verschwindet. Zumal es von der Codeseite her keine Fehlermeldung gibt. Was übersehe ich?

Viele Grüße,
Vanished
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Vanished,
Was übersehe ich?
Die Vererbung? Genau weiss ich es auch nicht. Aber, du hast recht. Dann sollte es schon funktionieren.

Hab mal ein wenig rumprobiert - mir gelingt es auch! Allerdings nur, wenn ich im Maskendesign die Drop-Down Eigenschaft auf "falsch" setze, dann kann ich während der Laufzeit diesen Pfeil hinzufügen oder auch wieder verschwinden lassen.
Ist die Eigenschaft jedoch ursprünglich da, dann klappt es bei mir auch nicht. Vielleicht doch ein Bug?

Gruss
Thomas

Ach ja, getestet mit 1.9m65 auf WinXP
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Vanished,
...Deinen "Erfolg" kann ich hier nicht nachvollziehen....
Wie machst du es denn? Hier mal ein bischen Code von mir. Ich habe mir eine Maske gebastelt (oD1), die genau eine Drop-Down Box beinhaltet (Name = "Box") sowie drei tasten: ohne, mit und ende. Im Design-Modus der Box ist bei den Eigenschaften "Aufklappbar = Nein) gewählt.

Hier der Code zu mit:

Code: Alles auswählen

sub mit
  oControll = oD1.getControl("box")
  oMod = oControll.getModel()
  oMod.setPropertyValue("Dropdown", true)   ' Eigenschaft setzen
  oControll.setDesignMode(true)   'Nur im Designmode kannst du malen
  oControll.setModel(oMod)     ' Box vom Modell ableiten
  oControll.setDesignMode(false)  ' Box wird wieder sichtbar
end sub
Die Eigenschaftsnamen bei setPropertyValue sind Case-Sensitiv! Das Vorgehen ist wie folgt:
Die einzelnen Designobjekte werden vom Model abgeleitet. Um nicht alles neu schreiben zu müssen, wird zunächst das Model als Objekt besorgt, dann wird das Model entsprechend geändert, die anderen Eigenschaften belieben erhalten. Jetzt wird die Box in den Designmode gesetzt (dabei verschwiindet sie aus der Maske!) , der Box wird das Model zugewiesen - sie wird daraus abgeleitet, der Designmodus wird wieder aufgehoben. Dadurch erscheint die Box wieder. Bei diesem kurzen Ablauf erkennst du das übrigens nicht.

OK, der ohne Button hat den gleichen Code, eben nur ("Dropdown", false)

Wenn es bei dir nicht klappt, schick ich dir gerne meine Testdatei als PM.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Hallo Thomas,

im Prinzip habe ich das gleiche versucht wie Du auch, allerdings ohne den Desingmodus zu benutzen (das wohl eher, weil ich ihn bis eben noch nicht kannte). Allerdings leuchtet es mir immer noch nicht ein, warum zum Entfernen des Dropdown-Buttons mehr Aufwand nötig sein sollte, als zum Zeichnen der Umrandung beispielsweise (und das geht definitiv ohne Desingmodus).

Sei es drum, ich habe Deinen Dialog nachgebaut und den von Dir geposteten Code verwendet und was soll ich sagen? Es funktioniert bei mir weder mit 1.1.4 noch mit 1.9.65. Es ist unabhängig davon, ob im Design "Aufklappbar" ja oder nein eingestellt ist. Es will nicht.

Hier Dein vollständiger Code:

Code: Alles auswählen

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

sub mit 'liegt auf der "CBox"-Schaltfläche 
  Dim oControll as Object
  Dim oMod as Object
  oControll = oDialog.getControl("box") 
  oMod = oControll.getModel() 
  oMod.setPropertyValue("Dropdown", true) 
  oControll.setDesignMode(true)   
  oControll.setModel(oMod)  
  oControll.setDesignMode(false)  
end sub

sub ohne 'liegt auf der "TFeld"-Schaltfläche
  Dim oControll as Object
  Dim oMod as Object
  oControll = oDialog.getControl("box") 
  oMod = oControll.getModel() 
  oMod.setPropertyValue("Dropdown", false) 
  oControll.setDesignMode(true)    
  oControll.setModel(oMod)     
  oControll.setDesignMode(false)  
end sub

Sub abbruch 'liegt auf der Abbruchschaltfläche
	oDialog.endexecute()
End Sub
Hier der Dialog im Design:
Bild

Viele Grüße,
Vanished
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Vanished,

ja, es sind oft die Kleinigkeiten. Hab gerade deinen Code probiert - und siehe da - läuft nicht....
Und dabei ist er fast identisch mit mienem - in allem.

Also, Fehlersuche... und gefunden. In meinem ursprünglichen Code waren noch so Kontroll-msgboxen versteckt. Auskommentiert. Die hab ich dir natürlch nicht gepostet. Und ich hab ein bischen aufgeräumt. Und damit es ünersichtlicher wird, zwei Zeilen vertausche. Kleine Ursache, große Wirkung...
Also, zurück. Vertausche diese beiden Zeilen

Code: Alles auswählen

oMod.setPropertyValue("Dropdown", true)
  oControll.setDesignMode(true)   

, so dass dort steht:

Code: Alles auswählen

oControll.setDesignMode(true)  
  oMod.setPropertyValue("Dropdown", true)
...und schon funktioniert es wieder.
Hm, ist ja auch nachvollziehbar. Die Referenzen bleiben ja bestehen.

Mit dem Rest hast du natürlich recht - die meisten anderen Eigenschaften kannst du direkt setzen. Ich weiss nicht genau, warum es hier nicht funktioniert, ich glaube aber, das hängt mit der Combobox an sich zusammen. Ist schliesslich aus einzlenen Objekten zusammengesetzt, so dass manche Properties einfach nicht so direkt gesetzt werden können.

Hoffe, du bekommst es auch zum Laufen.
Gerade getestet übrigens auf 1.1.4, Win2000

n' abend
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Hervorragend! Wenn man es dann gefunden hat, sieht es so einfach aus...
Bei mir läuft es jetzt auch, sowohl unter 1.1.4 alsauch unter 1.9.

Edit: und unabhängig davon, ob das Dropdown vorher enabled oder disabled war. Ebenso ist die Zeile

Code: Alles auswählen

oControll.setModel(oMod)
nicht nötig, weil offensichtlich mit setPropertyValue der Zugriff direkt ins Model erfolgen kann.

Vielen Dank mal wieder & Gute Nacht!
Vanished
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Vanished,

freut mich, dass es bei dir jetzt auch klappt.

Ich hab noch ein bischen experimentiert - es geht sogar mit deinem ursprünglichen direkten Code. Nur erst iden Design-Modus true setzen, dann die Eigenschaften ändern, dann design-Modus wieder auf false setzen.

Code: Alles auswählen

...
oControll.setDesignMode(true)    
oControll.model.dropdown = true
oControll.setDesignMode(false)
...
Tia, so kommt man voran.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Hmmm, schön wäre es natürlich gewesen, wenn das irgendwo gestanden hätte. Also ist die Dokumentation zur API an der Stelle (für Anfänger) nicht vollständig 8) ;).

Aber ich habe auch ein bisschen weitergesucht. Bin auch auf das eine oder andere gestoßen, aber das ist (noch) zu hoch für mich.
So gibt es eine Methode, die da "setControl" heißt und unter com.sun.star.drawing.XControlShape zu finden ist. Damit müßte es eigentlich möglich sein, zur Laufzeit das Control gänzlich von ComboBox auf Textfeld zu ändern...
Aber vielleicht fasse ich das auch ganz falsch auf.

Vielen Dank noch mal und bis demnächst dann, ich bleib' bestimmt mal wieder irgendwo hängen...

Grüße,
Vanished
Antworten