Speichern, Schließen, Öffnen ?

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

Moderator: Moderatoren

keksi1970
*****
Beiträge: 464
Registriert: So, 27.01.2008 11:47
Wohnort: DU

Speichern, Schließen, Öffnen ?

Beitrag von keksi1970 »

Hi Leute,

hier, wie versprochen ;) die erste der letzten 2 Fragen zu meinem Projekt :

Ich habe eine Vorlage erstellt, die ich mit Hilfe meines Dialoges ausfülle, das Speichern funktioniert mit :

Code: Alles auswählen

SUB Speichern
dim dummy()
dim speichern1 as string
odoc = thiscomponent
datum
spedsheet = oDoc.Sheets(0)
   mycell = spedsheet.getCellRangeByName("c1")
   if mycell.string = "" then 
   myString= "Spedition"
   else mystring2 = split(mycell.string, " ")
   mystring = mystring2(0)
   end if
   mystring1 = (mystring+"_"+Speicherdatum) 	
   Speichername = InputBox ("Geben Sie bitte den Dateinamen ein:",mystring, mystring1)
   Speicherort = InputBox ("Geben Sie bitte ein Verzeichnis ein:", "0", "file:///L:/tourenplanung/Ü-Schein/"+Speicherdatum+"/")
   mydoc = ThisComponent
   myUrl=  Speicherort & Speichername & ".ods"
   If FileExists( MyURL ) Then
   Speichern1 = Inputbox("Überschreiben Ja/Nein","0")
   
   If ucase(Speichern1) = "JA" then
   mydoc.storeasurl(myurl, dummy)  
   msgbox "Ihre Datei wurde gespeichert"
   exit sub
   else 
   MSGbox "Datei nicht gespeichert"
   exit sub
   end if
   end if
   mydoc.storeasurl(myurl, dummy)
   msgbox "Ihre Datei wurde gespeichert"

End Sub
einwandfrei.

Das Öffnen eines neuen Arbeitsblattes mit :

Code: Alles auswählen

        Dim myFileProp(0) As New com.sun.star.beans.PropertyValue
     oDesktop =   createUnoService("com.sun.star.frame.Desktop")
     sSourceFile = "file:///L:/tourenplanung/Ü-Schein/TEST_BLANKO_Jahr_Monat_Tag.ots"
     myFileProp(0).Name = "AsTemplate"
     myFileProp(0).Value = True
     oDocument = oDesktop.loadComponentFromURL( sSourceFile, "_blank", 0, myFileProp() )
funktioniert auch, bedingt.

Ich möchte nun, dass das Makro das alte Arbeitsblatt schliesst( welches durch die Speicherroutine einen Namen hat und also auch das Dokument einen Namen besitzt

Die Routine

Code: Alles auswählen

sub closedok
    odoc=thiscomponent
   
        Dim myFileProp(0) As New com.sun.star.beans.PropertyValue
     oDesktop =   createUnoService("com.sun.star.frame.Desktop")
     sSourceFile = "file:///L:/tourenplanung/Ü-Schein/TEST_BLANKO_Jahr_Monat_Tag.ots"
     myFileProp(0).Name = "AsTemplate"
     myFileProp(0).Value = True
     oDocument = oDesktop.loadComponentFromURL( sSourceFile, "_blank", 0, myFileProp() )
     wait 2000
     odoc.close(true)
end sub
beinhaltet ja das Öffnen des neuen Arbeitsblattes nur das schliessen des alten, da hab ich so Probleme, ebenso wie das der Dialog im Vordergrund bleibt.

Irgendwelche Vorschläge zu diesem Problem ??

Gruß

Andreas
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Speichern, Schließen, Öffnen ?

Beitrag von Toxitom »

Hey Andreas,

wo ist dein Makro gespeichert? Im Dokument? - dann kann das nicht gehen. Das Dokument kann sich nicht selbst schliessen, wenn das Makro noch läuft.
Wenn das Makro z.B. in Meine Makros gespeichert ist, sehe ich aktuell keine Probleme. Der Code könnte bereinigt werden (das wait ist überflüssig, auch das "oDesktop = ..." - hier reicht die vordefinierte Varaible "StarDesktop").
Und wie meinst du : "...dass der Dialog im Vordergrund bleibt"? Wann und wie öffnest du ihn?

Gruss
Thomas

PS: Mag sein, dass du das alles schon in einem anderen Thread beschrieben hast - dann sorry. War ne zeit lang "offline" ;-)
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
keksi1970
*****
Beiträge: 464
Registriert: So, 27.01.2008 11:47
Wohnort: DU

Re: Speichern, Schließen, Öffnen ?

Beitrag von keksi1970 »

hi Thomas,

also es ist so, ich habe ein vorgefertigtes Tabellenblatt( .ots), dass ich halt aufrufe. danach starte ich meinen Dialog aus meine Makros heraus und fülle mit Hilfe dieses Dialoges ein oder mehrere sheets in dem Dokument"unbenannt1" aus. anschliessend wird das Dokument unter dem Namen (Zelle c1, sheet(0)) gespeichert. nun möchte ich aus meinem Dialog ein weiteres Dokument aufrufen (auch wieder (.ots, gleiche Vorlage halt), das alte schliessen und mit dem schon aufgerufenen Dialog das Dokument "unbenannt2" ausfüllen.

Diese Vorgehensweise halte ich für die Beste, da in meinem Dialog 1 Dutzend Auswahlfelder zur Verfügung stehen, die sich auch beim 2. Blatt nicht ändern (oder nur minimal) und jedesmal 3-6 Änderungen durchführen halte ich für zuviel Arbeit ^^, schliesslich habe ich ca 40 Dateien jeden Tag und in jeder Datei 5-9 tabellen auszufüllen.

Zum Code, den habe ich aus Dannenhoefers Seite "stibitzt" und ein bisschen rumprobiert, das mit dem wait habe ich hier im Forum gelesen, dass die Speicherroutine und andere Dinge mehr Zeit brauchen als das Makro. mit dem Öffnen habe ich mich selber noch nicht beschäftigt. Das Makro wird aufgerufen über eine Schaltfläche in einer neuen Symbolleiste. Mit Dialog im Vordergrund meine ich, dass ohne das "close" zwar ein neues Blatt geöffnet wird, mein Dialog aber bei dem alten sheet verbleibt. setfocus() bringt mir nur das alte Sheet mit dem Dialog in den Vordergrund.

Gruß
Andreas

PS: Ich kann ja nu nicht verlangen, dass du alle meine 37 Threads liest :D die zum Teil auch mit wirklich furchtbaren Fragen gefüllt sind, aber für 4 Wochen oder so bin ich schon ziemlich weit :D

btw : wo ich grade dabei bin : das letzte was danach noch fehlt, ist : ich würde gerne auf eine mir bekannte,geöffnete, nicht schreibgeschützte Datei zugreifen, dort in einer mir bekannten Spalte nach einer Zahl suchen und in einer bestimmten Spalte einen Hyperlink zu dem o.g. Sheet setzen, mit Hilfe meines Dialoges. Dazu fällt mir gar nichts ein.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Speichern, Schließen, Öffnen ?

Beitrag von Toxitom »

Hey Andreas,

also eigentlich sehe ich überhaupt keine Probleme in deiner Vorgehensweise - vielleicht könntest du mir deine Vorlagendatei und die Makros (als Extension) schicken - dann sieht man mal "das Ganze" und ich kann dir evt. bessere Ratschläge geben.

Viele Grüße
Thomas
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:

Re: Speichern, Schließen, Öffnen ?

Beitrag von Toxitom »

Hey Andreas,

ok, hab mich durch deinen Code "gekämpft". Hmm, da wäre noch einiges zu verbessern ;-) - aber wenn es läuft....

Also, dein Problem des Öffnens/Schliessens ist so einfach gar nicht zu lösen. Dazu müsstest du die Struktur völig umstellen und die Gesamtaufgabe völlig anders angehen.
Zum Verständnis:
Du startest aus deinem Dokument heraus deine Makros. Dadurch wird ein angeleiteter Frame erzeugt (dein Startdokument ist quasi das Masterdokument - darunter laufen nun deine Basic-Routinen in einem eigenen Prozess). Mit diesem Prozess kannst du zwar neue Fenster erzeugen, diese auch wieder schliessen, nicht aber das eigene "Parent-Fenster". Die Makros bleiben auch in ihrem Prozess, springen also nicht auf das neue Fenster "über".

Eine Lösung wäre, du erzeugst die ein eigenes "Startdokument", das die Startroutine ausführt beim Starten des Dokumentes, sich selbst aber "hidden" öffnet, also nicht zu sehen ist. Mit der Basis kannst du dann in Ruhe unterschiedliche Dokumente erzeugen und bearbeiten, schliessen und eben alles tun, was du willst. Allerdings müsste der Code deutlich umgebaut werden. Die vordefinierte Varaible "thisComponent" wäre nicht mehr zu verwenden (die würde ja auf das Parentdokument weisen), du musst dann mit Frames arbeiten.

Andererseits sehe ich sowieso Chancen, den Code zu "verbessern". Hier ein paar Vorschläge:

1. (der wichtigste....) Schreibe Kommentare - je mehr desto besser :-)
2. Der Dialog mit 15 Steps ist sicher nicht ergonomisch. Lieber einen Dialog mit 15 Eingabefeldern - und Plausibilitätsprüfung beim Eintragen.
3. Fehlerroutinen mit einbauen. Wenn man die Funktion nicht nur selbst nutzt, sollte man auf jedenfall Fehler abfangen.
4. ...

Na ja, also, da gibt es noch jede Menge Arbeit :-)

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
keksi1970
*****
Beiträge: 464
Registriert: So, 27.01.2008 11:47
Wohnort: DU

Re: Speichern, Schließen, Öffnen ?

Beitrag von keksi1970 »

hi Thomas,

da gibts ne Menge zu Verbessern, ich weiß, aber drücken wir es mal so aus :

1. Schreibkommentare : mir fällt was ein, und ich teste das ganze, durch Schreibkommentare werde ich abgelenkt und danach welche zu schreiben vergesse ich meistens, wie du siehst. ich versuch, mich zu Bessern.

2. Die 15 Steps. nun, ich habe es mit Eingabefeldern versucht, aber die brauchen mir zuviel Platz, den Dialog hab ich auch noch ^^, die 15 steps mit je einem Eingabefeld sollen ja auch nur bei aktiviertem Kontrollkästchen aufgerufen werden, was sehr selten der Fall ist, meist brauch ich nur 3-4, da ich die anderen Daten erst später bekomme und immer nur häppchenweise. Daher auch die Sache mit dem Dialog, der weiterverwendet werden soll. ich bekomme als erstes halt nur Spedition, Art des LKWs und den Zeitlichen Rahmen, dann bereite ich das ganze vor, und wenn weitere Daten vorliegen, ergänze ich das Ganze.

3. Fehlerroutinen habe ich generell noch nicht verstanden.

4. ach ja ;)

Ist ja auch nur vorläufig, wenn alle Teile des Codes funktionieren, begebe ich mich an die eigentlich Aufgabe, dass ganze in einem vernünftigen Rahmen zu Präsentieren

Gruß Andreas (später mehr)
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Speichern, Schließen, Öffnen ?

Beitrag von Toxitom »

Hallo Andreas,
keksi1970 hat geschrieben:1. Schreibkommentare : mir fällt was ein, und ich teste das ganze, durch Schreibkommentare werde ich abgelenkt und danach welche zu schreiben vergesse ich meistens, wie du siehst. ich versuch, mich zu Bessern.
Klar. Kenn ich :-) Hab aber auch die Erfahrung gemacht, dass es für mich selbst sehr viel einfacher ist, meinen eigenen Code zu verstehen und schneller zu einem Suchteil (Unterroutine) zu kommen, wenn ich gleich Kommentare mit einschreibe :-) Bewährt sich wirklich, insbesondere bei Code, der ständig wächst.
keksi1970 hat geschrieben:2. Die 15 Steps....
Na ja, dazu müsste man das "Ganze" kennen, also die Anforderungen und die Erwartungen. Das war mir nur aufgefallen - aber es könnte natürlcih auch Gründe dafür geben ;-)
keksi1970 hat geschrieben:3. Fehlerroutinen habe ich generell noch nicht verstanden.
Ein Beispiel: Im Code hast du fest "verdrahtet" den Namen und den Pfad der Vorlage, die geladen werden soll. Was passiert, wenn der Pfad nicht stimmt oder die Vorlage dort nicht liegt?? - ein Basic-Runtime-Error entsteht, die IDE öffnet sich... Das mag für Dich als Programmierer OK sein, ein normaler Benutzer ist total verwirrt. Der weiss ja nicht, was er machen soll. Solche Sachen kann man abfangen - bzw. den Error gar nicht erst aufkommen lassen.
keksi1970 hat geschrieben:Ist ja auch nur vorläufig, wenn alle Teile des Codes funktionieren,
OK, das Argument lasse ich gelten :-) ....

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
keksi1970
*****
Beiträge: 464
Registriert: So, 27.01.2008 11:47
Wohnort: DU

Re: Speichern, Schließen, Öffnen ?

Beitrag von keksi1970 »

so, nun mehr dazu.

mein "Dackel" musste raus, naja, ausgewachsener Collie (oder fast ausgewachsen) daher die vorhin recht kurze Antwort.
Das mit dem "EXTRA"-Sheet, bzw Hauptdatei hat eigentlich recht viele Vorteile, sogar wenn Sie sichtbar ist (Pfade festlegen und ändern, Schon vorhandene Dateien öffnen und anschliessend bearbeiten, u.ä.)

Aber wie wäre es mit nem Tipp, wie ich auf eine Neu-geöffnete Datei zugreife, wenn nicht mit thiscomponent, ein Beispiel für die Fehlerroutine wäre auch nicht schlecht, muss ich dazu alle Fehlermöglichkeiten bedenken, oder geht das generell (bei Fehler gehe nach FEHLER , msgbox "der und der Fehler" ?

naja, ich mach erstmal . . .^^ und schreibe dann, wo ich nicht weiterkomme ;)

Gruß Andreas

PS.: ist dir schon was zum Thema Hyperlink auf einem anderen Blatt eingefallen ??
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Speichern, Schließen, Öffnen ?

Beitrag von Toxitom »

Hey Andreas,
keksi1970 hat geschrieben:Aber wie wäre es mit nem Tipp, wie ich auf eine Neu-geöffnete Datei zugreife, wenn nicht mit thiscomponent, ...
Na im Grunds so, wie du es sowieso schon machst. Du öffnest dein neues Dokument mit

Code: Alles auswählen

oDocument = oDesktop.loadComponentFromURL( sSourceFile, "_blank", 0, myFileProp() ) 
- jetzt ist das Objekt des neuen Dokumentes gespeichert in der Variablen "oDokument". Ist diese Global definiert, hast du jederzeit zugriff auf das Objekt - und somit auf dein Dokument.
keksi1970 hat geschrieben:ein Beispiel für die Fehlerroutine wäre auch nicht schlecht, muss ich dazu alle Fehlermöglichkeiten bedenken, oder geht das generell (bei Fehler gehe nach FEHLER , msgbox "der und der Fehler" ?
Das geht zwar generell - so meinte ich das aber gar nicht.
Aber z.B.
Du öffnest eine Datei:

Code: Alles auswählen

sUrl = convertToURL("d:/meinPfad/meineDatei.ott")
...
oDoc = oDesktop.loadComponentFromURL( sURL, "_blank", 0, myFileProp() ) 
Existiert die Datei nicht oder liegt sie wo anders, so führt die "Lade"-Zeile zu einem Fehler.
Also: Zuerst prüfen, ob die Datei auch wirklich existiert, dann erst öffnen, sonst Fehlermeldung!
so etwas in der Form:

Code: Alles auswählen

sUrl = convertToURL("d:/meinPfad/meineDatei.ott")
oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess")
if oUcb.exists(sURL) then   'Datei existiert
  ...
  oDoc = oDesktop.loadComponentFromURL( )
else   'Datei existiert nicht
  msgbox ("Die Datei """ & convertFromURL(sUrl) & """ existiert nicht!" , 16, "Fehler!")
  exit sub
end if
keksi1970 hat geschrieben:ist dir schon was zum Thema Hyperlink auf einem anderen Blatt eingefallen ??
Hmm, was soll mir einfallen? DAs musst du ausprobieren - und dazu evt. Recherche betreiben. Es ist nicht trivial, per Basic Hyperlinks in
Tabellenzellen zu schreiben. Ein Codeschnipsel, wie du Hyperlinks zu URL Adressen setzt, kann ich dir liefern:

Code: Alles auswählen

...
oCell = odoc.sheets().getByName("meinTabellenblatt")
oText = oCell.getText
oLink = oDoc.createInstance("com.sun.star.text.TextField.URL")
oLink.URL = "http://de.openoffice.info"
oLink.Representation = "Das OpenOffice.org Forum"
oCell.insertTextContent(oText.createcreateTextCursor(), oLink, True)
...
oDoc representiert dein Dokument (Objekt). Wahrscheinlich musst du nur dieses Beispiel apasssen ;-)

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
keksi1970
*****
Beiträge: 464
Registriert: So, 27.01.2008 11:47
Wohnort: DU

Re: Speichern, Schließen, Öffnen ?

Beitrag von keksi1970 »

hi,

also ich zitiere mal nicht.

1. Theoretisch bräuchte ich dann ja nicht viel zu ändern ausser : oDoc = thisComponent in oDoc = oDocument ? (ich ändere es der Übersicht halber trotzdem)

2. Denkfehler, ich dachte ich müsste jetzt alle Fehlermeldungen durchgehen und "Gegenmaßnahmen" treffen. es reicht also, ein wenig nachzudenken was passiert wenn das Makro etwas tut, was es nicht tun kann. Passt übrigends gut zum 3., dass wenn die Datei, wo der Hyperlink reinsoll nicht existiert oder nur als schreibgeschützt geöffnet ist :)

3. ach so erstellt man per Makros Hyperlinks ? der Macrorecorder hat mir da gar nix gebracht, nicht mal ne Idee, wo ich dann nachschauen soll.

Vielen Dank, wirst auch wie einige andere, lobend erwähnt :)

Gruß

Andreas
Antworten