oComponentWalker und eine bestimmte Fehlermeldung umgehen oder ignorieren.

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

Moderator: Moderatoren

Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

oComponentWalker und eine bestimmte Fehlermeldung umgehen oder ignorieren.

Beitrag von balu »

Hallo liebe Gemeinde.

Ich arbeite mit diesem oComponentWalker.

Code: Alles auswählen

     oComponents = StarDesktop.getComponents()
     nCount = 0
     redAlert = 0
     oComponentWalker = oComponents.createEnumeration()
      Do While oComponentWalker.hasMoreElements()
         oComponent = oComponentWalker.nextElement()
         nCount = nCount + 1
      Loop
      oComponentWalker = oComponents.createEnumeration()
       Do While oComponentWalker.hasMoreElements()
         oComponent = oComponentWalker.nextElement()
             print oComponent.getURL() ' zutestzwecken eingetragen.'
         ofilecheck = oComponent.getURL()
         if fName = ofilecheck then
           redAlert = 1
               Print "ALARM !!!"
       EXIT DO
        else
        end if
      Loop
fName ist das Ergebnis von der function FileOpenDialog, welche ich hier jetzt nicht zitiert habe.
Und eigentlich tut er das was er soll.
Jedoch habe ich schon seit längerem ein Problem, welches ich endlich beseitigt haben will. Nur habe ich keine Ahnung wie ich das anstellen muss.

Wenn x-verschiedene Dateien von OO (Kurzform für OOo/LO/AOO) geöffnet sind, so funktioniert er einwandfrei.
ABER ! ! !
Wenn das Hilfefenster (F1) von OO geöffnet ist, dann knallts mir ne Fehlermeldung raus.
getUrl_fehlermeldung.jpg
getUrl_fehlermeldung.jpg (115.1 KiB) 2336 mal betrachtet
Klar, eine x-beliebige Datei hat ja z.B. eine Url ähnlich: file:///E:.... (unter WinXP).
Aber das Hilfefenster hat eine ganz andere Url, z.B.: vnd.sun.star.help.....

Und jedesmal wenn das Hilfefenster geöffnet ist, kommt es zu der gezeigten Fehlermelung. Mir ist auch bewusst wie es zu der Fehlermeldung kommt, und was sie mir sagen will; dass dass Hilfefenster keine übliche Url hat und deshalb auch keine Url ausgegeben werden kann.

Aber wie kann ich das umgehen, das es nicht mehr zu der Fehlermeldung kommt, außer vorher schon darauf Hinzuweisen das das Hilfefenster geschlossen sein muss.
Also wie kann ich diese Fehlermldung im oComponentWalker umgehen, oder ignorieren?

Da ich noch keine rechte Freundschaft mit Do...Loop geschlossen habe, bitte ich Euch mir zu helfen.

Ich bedanke mich schon mal bei Euch, auch wenn es nur für das Lesen des Beitrags ist.




Gruß
balu
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
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: oComponentWalker und eine bestimmte Fehlermeldung umgehen oder ignorieren.

Beitrag von Karolus »

Hallo

Code: Alles auswählen

onError resume next
oder so ähnlich
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: oComponentWalker und eine bestimmte Fehlermeldung umgehen oder ignorieren.

Beitrag von Stephan »

jedes 'richtige' Dokument sollte "com.sun.star.frame.XModel" unterstützen, deshalb müsste gehen:

Code: Alles auswählen

Do While oComponentWalker.hasMoreElements()
  oComponent = oComponentWalker.nextElement()
  If HasUnoInterfaces(oComponent, "com.sun.star.frame.XModel") Then
    print oComponent.getURL() ' zutestzwecken eingetragen.'
    ofilecheck = oComponent.getURL()
  End If
  if fName = ofilecheck then
      redAlert = 1
      Print "ALARM !!!"
      EXIT DO
    else
  end if
Loop

Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: oComponentWalker und eine bestimmte Fehlermeldung umgehen oder ignorieren.

Beitrag von balu »

Hallo,

@Karolus
oder so ähnlich
Das hatte ich auch schon irgendwie aufm Schirm gehabt, jedoch war ich mir nicht sicher wie ich das richtig anwenden sollte. Denn mich hatte das "next" irritiert, da ich dachte das dies wohl nur in einer For..next reingehört. Also habe ich es mal eben wie folgt eingebaut, auf gut Glück.

Code: Alles auswählen

[...]
       Do While oComponentWalker.hasMoreElements()
         oComponent = oComponentWalker.nextElement()
         On Error Resume Next ' hier scheint es gut aufgehoben zusein, bis jetzt. '
             print oComponent.getURL() 
         ofilecheck = oComponent.getURL()
[...]
Und was soll ich sagen, es kommt so zu keiner Fehlermeldung mehr, und der Code funktioniert bis jetzt Pörfäkt. :-)

War wohl irgendwie bis jetzt zu "Betriebsblind".

Danke für deinen Schupps in die richtige Richtung.


@Stephan
Auch dir ein Danke schön für deinen Lösungsvorschlag. Ich werde ihn auch noch mal ausprobieren, blos heute nicht mehr.
Da ich den oComponentWalker an anderer Stelle noch mal leicht modifiziert einsetze, kann es durchaus sein das er dort mit deiner Methode genau so gut funktionieren wird.

Auf jeden Fall habe ich durch dich wieder etwas besonderes dazu gelernt. Und das ist für mich auch sehr wichtig.



Gruß
balu
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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: oComponentWalker und eine bestimmte Fehlermeldung umgehen oder ignorieren.

Beitrag von Stephan »

Denn mich hatte das "next" irritiert, da ich dachte das dies wohl nur in einer For..next reingehört.
nö, das heisst sinngemäß 'fahre mit der nächsten Zeile fort', d.h. das Makro führt bei Auftreten eines Fehlers die nächste Codezeile aus, das geht auch wenn mehrere Code-Zeilen nacheinander einen Fehler liefern, dann wird solange die nächste Zeile genommen bis wieder eine Zeile kommt die fehlerfrei ausführbar ist.

Es ist aber sinnvoll die Fehlerkontrolle nur in den kritischen Zeilen abzuschalten, sonst überspringt das Makro möglicherweise auch FEhler an Stellen wo es das garnicht soll und Du beim Testen garnicht merkst das das geschieht und dann der Programmablauf ganz anders sein kann als Du glaubst.

Deshalb nimm:

Code: Alles auswählen

Do While oComponentWalker.hasMoreElements()
         oComponent = oComponentWalker.nextElement()
         On Error Resume Next ' hier scheint es gut aufgehoben zusein, bis jetzt. '
             print oComponent.getURL() 
         ofilecheck = oComponent.getURL()
         On Error Goto 0
jetzt wird eine Fehlermeldung nur für die 2 Zeilen:

Code: Alles auswählen

print oComponent.getURL() 
ofilecheck = oComponent.getURL()
unterdrückt und nicht auch im Rest des Makros.


Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: oComponentWalker und eine bestimmte Fehlermeldung umgehen oder ignorieren.

Beitrag von balu »

Moin moin, Stephan.

Ich muss mich wirklich von ganzem Herzen bei dir bedanken, das Du auf eine Aussage von mir noch mal genauer eingegangen bist. Danke dafür, denn das war wirklich sehr lehrreich. :D
Stephan hat geschrieben:
Denn mich hatte das "next" irritiert, da ich dachte das dies wohl nur in einer For..next reingehört.
nö, das heisst sinngemäß 'fahre mit der nächsten Zeile fort', d.h. das Makro führt bei Auftreten eines Fehlers die nächste Codezeile aus, [...]
So ähnlich steht das auch in der deutschen Version von Andrew drin.
[...] das geht auch wenn mehrere Code-Zeilen nacheinander einen Fehler liefern, dann wird solange die nächste Zeile genommen bis wieder eine Zeile kommt die fehlerfrei ausführbar ist.
Jedoch hat der von mir unterstrichene Teil viel mehr aussagekraft, als das was in der deutschen Version von Andrew steht. Denn dadurch wird mir erst so richtig bewusst, das dies unter Umständen bedeutet, das einmal ON ERROR eingeschaltet durchaus bis zur letzten Zeile von einem beispielsweise 500 Zeilen Code bis zur letzten Zeile bestehen bleibt. Und das kann wohl unter gewissen Umständen sehr schlecht sein.

Es ist aber sinnvoll die Fehlerkontrolle nur in den kritischen Zeilen abzuschalten, sonst überspringt das Makro möglicherweise auch FEhler an Stellen wo es das garnicht soll und Du beim Testen garnicht merkst das das geschieht und dann der Programmablauf ganz anders sein kann als Du glaubst.
Das verstehe ich jetzt sehr gut.

Ich will auf gar keinen Fall die deutsche Übersetzung von Andrew schlecht machen, zumal ich daraus das eine oder andere schon lehrnen konnte, aber manchmal ist das geschriebene Wort nicht für jeden gleich sofort verständlich (das meine ich jetzt generell, unabhängig von der Übersetzung). Und deshalb ist es nur zu gut, dasss jemand anderer etwas dazu aus seiner Sicht dazu sagt/schreibt. Denn in einem Dialog kann individueller auf etwas reagiert werden, als wenn man nur etwas liest.

Auch wenn ich jetzt ON ERROR RESUME NEXT besser verstehe, werde ich mich wohl doch dazu entschließen von einem Einsatz davon abzusehen. Es ist mein eigenes Wohlbefinden was mich daran hindert. Denn deine von dir zu anfangs vorgeschlagene Überprüfung ob es sich um ein 'richtiges' Dokument handelt, gefällt mir besser. Und das unter anderem auch deshalb, weil es für mich persönlich logischer ist, das jede IF....THEN mit einem END IF in einer separaten Zeile unterhalb endet. So habe ich mir das schon seit langer Zeit angewöhnt. Während NEXT am Anfang mich irretiert, da ich das mit einer FOR .... assoziiere wo NEXT am Ende (unten) steht. Und außerdem ist es in meinen Augen eleganter etwas auf logische Richtigkeit hin zu überprüfen, da dadurch auch Fehlermeldungen umgangen werden können.



Gruß
balu
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
Antworten