Gelöst: Schaltfläche mit Grafik unabghängig vom OS ?

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

Moderator: Moderatoren

WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Gelöst: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von WSO »

Guten Morgen,
ich habe viele Schalflächen abstelle von Text mit einer Grafk versehen.
Bei der Portierung von Windows auf Linux habe ich leider erst jetzt gemerkt, dass die Grafiken den Schlatflächen nur per link zugewiesen werden. Da der Windows-Pfad für die Grafiken unter Linux nicht existiert, sind somit alle buttons "nackt".
Hat jemand eine Idee, wie ich das verhindern kann?
Gruss,
WSO
Zuletzt geändert von WSO am Do, 14.08.2014 14:33, insgesamt 3-mal geändert.
Benutzeravatar
Rasakul
**
Beiträge: 32
Registriert: Di, 29.07.2014 15:26
Wohnort: Wien

Re: Schaltfläche mit Grafik unabghängig vom Betriebssystem ?

Beitrag von Rasakul »

Hallo!

mir würde nur einfallen, die Zuweisungen über ein Makro zu erledigen und hier dann den Pfad mit der (undokumentierten) Methode

Code: Alles auswählen

GetPathSeparator()
zusammenzustöpseln - die Methode liefert dir dann den systemspezifischen Pfadtrenner (also unter Windows "\" oder unter Linux "/")

vielleicht hilft dir hierzu folgendes noch: viewtopic.php?f=18&t=64155

LG
Rasakul
Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden - Linus Torvalds
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: Schaltfläche mit Grafik unabghängig vom Betriebssystem ?

Beitrag von WSO »

Hi Rasakul,
ja gut...
Kannst du mir bitte noch einen Hinweis geben, wie ich die Pfadangabe in die Feldeigenschaften bekomme.
Braucht wohl ein Makro, dass beim öffnen des Formulars aufgefufen wird. Habe aber keine Idee, wie ich dann die Pfadangabe manipuliere.
Gruss,
Wolfram
Benutzeravatar
Rasakul
**
Beiträge: 32
Registriert: Di, 29.07.2014 15:26
Wohnort: Wien

Re: Schaltfläche mit Grafik unabghängig vom Betriebssystem ?

Beitrag von Rasakul »

Hi!

so kommst du an den Button selber ran:

Code: Alles auswählen

oDoc = ThisComponent
oForm = oDoc.Drawpage.Forms.getByName("formularname")
oButton = oForm .getByName("buttonname")
wenn nun in den Eigenschaften des Buttons die Grafik gesetzt werden soll, machst du das über

Code: Alles auswählen

oButton.ImageURL = "GrafikURL"
LG
Raskakul

PS: Schau dir mal das Tool XRay an - damit kannst du ganz leicht herausfinden, welche Methoden/Eigenschaften ein Basic-Element zur Verfügung stellt (Verwendungsanleitung findest du dann in der Downloaddatei)
Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden - Linus Torvalds
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: Schaltfläche mit Grafik unabghängig vom Betriebssystem ?

Beitrag von WSO »

Super,
ist zwar erst mal ne Menge Aufwand, aber ja nur einmalig. :D
Gruss,
WSO
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von WSO »

Bin leider immer noch mit diersem Thema im Gange.
Die temporäre Änderung der Feldeigenschaften im Formular funktioniert per Formularergeignis.
Zur Verbesserung der Performance möchte ich aber diese Änderungen gerne dauerhaft in meinen Formularen speichern.
Ich habe es damit versucht:

Code: Alles auswählen

Sub upd_Formulare (oEvent AS OBJECT)
		
		GlobalScope.BasicLibraries.LoadLibrary("Tools")
		GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
		
		DIM oDatasource AS OBJECT
		DIM oConnection AS OBJECT
		
		oDatasource = thisComponent.Parent.CurrentController
		IF NOT (oDatasource.isConnected()) THEN oDatasource.connect()
		oConnection = oDatasource.ActiveConnection()
		
		DIM oSql AS OBJECT
		DIM oSql1 AS OBJECT				
		DIM oDoc as Object
		DIM oDrawpage as Object
		DIM oForm as Object
		DIM oFeld as Object
		
		DIM oFormDocs AS OBJECT
					
		DIM stSql AS STRING
		DIM stSql1 AS STRING
		DIM oResultSet AS OBJECT
		DIM oResultSet1 AS OBJECT
		
		DIM stForm AS STRING
		DIM stIcon AS STRING
		DIM stDateiname AS STRING
		
		Rem Update über alle Formulare
		oSql = oConnection.createStatement()
		oSql1 = oConnection.createStatement()
        stSql = "SELECT `form` FROM `tform`"                 	    		
        oResultSet = oSql.executeQuery(stSql)       							
       	If oResultSet.Next Then	
          		Do
          			stForm = oResultset.getString(1)
          			oFormDocs = ThisDatabaseDocument.FormDocuments.getByName(stForm).open
          			stSql1 = "SELECT `i_icon`, `i_datei`, `i_form`  FROM `ticon` WHERE  `i_form`='" & stForm  &"'"                	    		
        			oResultSet1 = oSql1.executeQuery(stSql1)
       				If oResultSet1.Next Then	
          					Do
          						stIcon = oResultSet1.getString(1)
          						stDateiname = oResultSet1.getString(2)          			
          						stDateiname = convertToUrl(stDateiname)
          					
								oForm = oFormDocs.Drawpage.Forms.getByName(stForm)		
	  							oFeld = oForm.getByName(stIcon)  		
    							oFeld.ImageURL = stDateiname
    							oForm.reload    							 
          					Loop While oResultSet1.Next
       					Else
          					'Keine Datensätze	
        			End If
          			         				
          			Loop While oResultSet.Next
       		Else
          		'Keine Datensätze	
        End If		
		
End Sub

Das funktioniert aber nur, wenn ich alle Formulare zuvor im Bearbeitungsmodus öffne und dann manuell speichere.
Lieber würde ich das auch von dem Makro erledigen lassen.
Habe mit Xray aber nichts gefunden was dazu passt.
Kennt jemand eine elegantere Methode?
Gruss,
WSO
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von F3K Total »

WSO hat geschrieben:Bei der Portierung von Windows auf Linux habe ich leider erst jetzt gemerkt, dass die Grafiken den Schlatflächen nur per link zugewiesen werden.
Wie kommst Du darauf?
Unter W7, AOO 4.1.0 und Linux Mint, AOO 4.1.0 ist das nicht so, siehe Beispiel anbei.
Gruß R
EDIT: OK, mit LO geht es nicht. Kann ja nur ein Bug sein. Komisch, die unter AOO eingebetteten Bilder zeigt LO 4.2.6 wunderbar an.
Dateianhänge
Bilder_eingebettet.odb
(41.38 KiB) 141-mal heruntergeladen
Benutzeravatar
Rasakul
**
Beiträge: 32
Registriert: Di, 29.07.2014 15:26
Wohnort: Wien

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von Rasakul »

Hi WSO

sorry, hab grad nicht viel Zeit, mir kommt aber dein Ansatz mit SQL etwas umständlich vor...

Probier mal, ob du mit einer Schleife über alle Formulare das gleiche erreichst

Code: Alles auswählen

For i=0 To CountFormulare

    oForm = ThisDatabaseDocument.FormDocuments.getByIndex(i)

next i
Außerdem könntest du noch probieren über den Layout-Manager in den Entwurfsmodus zu wechseln, deine Veränderungen auszuführen und dann das Formular zu speichern.

Das könnte dann in etwas so ausschauen:

Code: Alles auswählen

For i=0 To CountFormulare - 1
    oForm = ThisDatabaseDocument.FormDocuments.getByIndex(i)

    oForm.open 'notwendig, da sonst kein LayoutManager vorhanden
    
    'LayoutManager
    oController = oForm.getComponent().getCurrentController()

    lmgr = oController.Frame.LayoutManager
    
    'Mit LayoutManager in den Entwurfsmodus wechseln
    'TODO

    'Do Your Staff here
    
    'Formular speichern
    oForm.store
    oForm.close
next i
Leider weiß ich grad nicht, wie man konkret in den Entwurfsmodus wechselt, da müsste ich noch suchen - vielleicht findest du es ja vor mir (würd mich dann auch interessieren ;) )
API XLayoutManager hilft dabei vielleicht

Bin mir auch nicht sicher, obs auch wirklich so funktioniert - glaubs aber schon

Freitag hab ich wieder mehr Zeit, da kann ich dann nochmal suchen, wenns noch nicht gelöst ist

LG
Rasakul
Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden - Linus Torvalds
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von F3K Total »

Nur zur Info:
Es handelt sich bei dem Verhalten, Bilder nicht einbetten zu können, um diesen gemeldeten Bug von LO.
F3K Total hat geschrieben:EDIT: OK, mit LO geht es nicht. Kann ja nur ein Bug sein. Komisch, die unter AOO eingebetteten Bilder zeigt LO 4.2.6 wunderbar an.
Dazu folgende Info: Wenn die Bilder einmal in AOO eingebettet wurden, kann man mit LO wunderbar arbeiten, es sein denn, man ändert mit LO etwas im Formular und drückt speichern, dann sind die Grafiken wieder weg.
Gruß R
Benutzeravatar
Rasakul
**
Beiträge: 32
Registriert: Di, 29.07.2014 15:26
Wohnort: Wien

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von Rasakul »

F3K Total hat geschrieben:Es handelt sich bei dem Verhalten, Bilder nicht einbetten zu können, um diesen gemeldeten Bug von LO.
Somit wäre wohl meine Methode wohl auch hinfällig :(
Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden - Linus Torvalds
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von F3K Total »

Hi,
wenn es dir nichts ausmacht, statt der Schaltfläche, ein grafisches Kontrollelement zu verwenden (Nachteil, ein macht keine Klickbewegung), dann kannst du die Bilder auch in eine Tabelle der Datenbank speichern, siehe Formular_mit_Bild_aus_Datenbank in angehängten Beispiel.
HTH R
EDIT: ... oder halt zu AOO wechseln ...
Dateianhänge
Bilder_eingebettet .odb
(105.67 KiB) 145-mal heruntergeladen
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von WSO »

Hallo Zusammen und danke für die Antworten.
Zu:
mir kommt aber dein Ansatz mit SQL etwas umständlich vor...
Probier mal, ob du mit einer Schleife über alle Formulare das gleiche erreichst
Das ist mein Lösundweg für das Problem, dass die Icons nicht auf jedem Formular einheitlich vorhanden sind.
Ich muss als irgendwie herausbekommen, welche icons auf welches Formular gehören, sonst läuft .getByName auf einen Fehler ...

Der Ansatz den Layoutmanager für das Formular zu öffnen wäre der Königsweg, aber leider:

Code: Alles auswählen

'LayoutManager
    oController = oForm.getComponent().getCurrentController()
funtioniert nicht: getComponent ist keine vorgesehene Methode.

Gleiches bei:

Code: Alles auswählen

oForm.store


Ein Äquivalent habe ich im Xray nicht gefunden.

Selbst wenn der bug
https://bugs.freedesktop.org/show_bug.cgi?id=65163
behoben werden sollte, ist das Problem der Protierbarkeit damit ja nicht gelöst.
Ich werde als Notlösung wohl ertsmal meine Icon-Referenzen manuell erfassen, den Link auf die icons relativ zur dblocation anlegen
und bei jeder Portierung mein makro drüberlaufen.
Gruss,
WSO
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von balu »

Hallo WSO,

was hälst Du denn davon wenn Du die Grafik mit in die Datei packst? Also nicht auf jedem Betriebssystem nach der Grafik suchen, sondern aus der Datei die Grafik direkt aufrufen.

Ich weiß das sich das wohl gut anhört, hat aber auch so seine Hürden. Ich habe selber mal Dateien erstellt in denen die Grafiken (kleine Icons für bestimmte Schaltflächen) direkt in der Datei drin sind. Das kann man ünabhängig vom "Office-Modul" machen, also egal ob für Writer, Calc oder so.

Es soll wohl dafür ein Tool irgendwo im englisch sprachigen Forum geben, jedoch ist dieses Forum nur extrem schwer zu erreichen. Aber man kann dies auch von Hand machen, was leider etwas tricky ist. Unser Moderator Stephan hat das in seinem Buch "Tabellenkalkulation mit OpenOffice.org 3 Calc" beschrieben. Aber auch hier im Forum hatte er mal was kurz dazu gesagt, siehe: Dateianhang in odt Datei.
Nein, ich habe das Buch nicht. Aber ich hatte das nachbauen können, mittels einer leider nicht mehr zur Verfügung stehenden Online-Leseprobe bei https://www.galileo-press.de/.

In dem eben verlinkten Thread hatte Stephan eine Beispieldatei angehängt, die nicht nur eine Grafik enthällt, sondern auche eine PDF-Datei. Da es dir hier aber nur um Grafik geht, habe ich mal eine simple Testdatei erstellt. Wenn dir das zusagt, dann melde dich noch mal und ich sage mehr und genaueres dazu.



Gruß
balu
Dateianhänge
Button mit Icon-0.4.ods
(12.13 KiB) 147-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von WSO »

Hi balu, rasakul
danke für den input.
für mein Problem mit den Icons brauchte ich eine schnelle Lösung und habe mit viel Handarbeit meinen ürsprünglichen Lösunsansatz umgesetzt.

Code: Alles auswählen

Sub upd_Formulare (oEvent AS OBJECT)
      
      GlobalScope.BasicLibraries.LoadLibrary("Tools")
      GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
      
      DIM oDatasource AS OBJECT
      DIM oConnection AS OBJECT
      
      oDatasource = thisComponent.Parent.CurrentController
      IF NOT (oDatasource.isConnected()) THEN oDatasource.connect()
      oConnection = oDatasource.ActiveConnection()
      
      DIM oSql AS OBJECT
      DIM oSql1 AS OBJECT            
      DIM oDoc as Object
      DIM oDrawpage as Object
      DIM oForm as Object
      DIM oFeld as Object
      DIM oFormDocs AS OBJECT
               
      DIM stSql AS STRING
      DIM stSql1 AS STRING
      DIM oResultSet AS OBJECT
      DIM oResultSet1 AS OBJECT
      
      DIM stForm AS STRING
      DIM stIcon AS STRING
      DIM stIconFeld AS STRING
      DIM stDateiname AS STRING
      DIM stDateiURL As STRING
      
      Rem Update über alle Formulare
      
      oSql = oConnection.createStatement()
      stSql = "SELECT `par_icon` FROM `tparameter`"                              
      oResultSet = oSql.executeQuery(stSql)                            
        If oResultSet.Next Then   
                Do
                   stIcon = oResultset.getString(1)
      			Loop While oResultSet.Next
             Else
                Msgbox "Parameter nicht gefunden"
                exit sub   
        End If 
        oSql1 = oConnection.createStatement()
        stSql = "SELECT `frm_formular` FROM `tformular`"                              
        oResultSet = oSql.executeQuery(stSql)                            
        If oResultSet.Next Then   
                Do
                   stForm = oResultset.getString(1)
                   Msgbox "Aktuelles Formular: " & stForm
                   oFormDocs = ThisDatabaseDocument.FormDocuments.getByName(stForm).open
                   stSql1 = "SELECT `ico_icon`, `tab_txt`, `ico_formular`  FROM abfIcon WHERE  `ico_formular`='" & stForm  &"'"                          
                   oResultSet1 = oSql1.executeQuery(stSql1)
                   If oResultSet1.Next Then   
                         Do
                            stIconFeld = oResultSet1.getString(1)
                            stDateiname = oResultSet1.getString(2)
                            stDateiURL = glbDatenbanklocation & stIcon & stDateiname
                            stDateiURL = convertToUrl(stDateiURL)
                        	oForm = oFormDocs.Drawpage.Forms.getByName(stForm)      
                          	oFeld = oForm.getByName(stIconFeld)
                         	oFeld.ImageURL = stDateiURL         
                         Loop While oResultSet1.Next
                      Else
                         'Keine Datensätze   
                 End If
                   oForm.reload                   
                   Loop While oResultSet.Next
             Else
                'Keine Datensätze   
        End If      
      
End Sub
Ist zwar nicht schön, aber geht erst mal.

Dateien (als Objekt) in dier Datenbank per Basic zu übernehmen, würde ich sehr gerne.
Sollte dann aber auch mit Postgres und MySql gehen.
Alle Infos die ich bislang dazu bekam waren: "geht nicht".
Bin mir nicht sicher, ob der Vorschlag von balu das revidiert, wäre aber toll.
Hatte mich damit abgefunden und alternativ nur Links und "Dateiauswahl" in der Anwendung verwendet.
Wenn es dafür doch eine bessere Variante gibt, würde ich die sehr gerne verfolgen.
Gruss,
WSO
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Schaltfläche mit Grafik unabghängig vom OS ?

Beitrag von F3K Total »

Mal ehrlich,
hast du meine Hinweise gelesen, dass das
  • Einbetten der Bilder normalerweise funktioniert?
  • Das es sich nur um einen Bug von LO handelt, der sicherlich in einer der kommenden Versionen behoben sein wird?
  • Das du die Bilder mit ApacheOpenOffice oder einer älteren LibreOffice Version, z.B. LO-Portable 3.5.5.3, normal einbetten kannst (siehe Bild), und, mit der aktuellen Version von LibreOffice, solange du das Formular nicht im Entwurfsmodus änderst und abspeicherst, benutzen kannst?
  • Wenn du ApacheOpenOffice verwendest hast du gar kein Problem.
Ich verstehe die ganze Aktion nicht, das Setup einer portable Version dauert etwa 5 Minuten und wir hühnern hier schon seit 11 Tagen herum.
embed.png
embed.png (47.5 KiB) 6350 mal betrachtet
Gruß R
Antworten