"hidden" - "visible" Unterschiedliches Verhalten

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

Moderator: Moderatoren

Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

"hidden" - "visible" Unterschiedliches Verhalten

Beitrag von Mr.Ed »

Hallo zusammen,

habe hier letztlich sehr hilfreiche Hinweise bekommen, vor allem von komma4 (nochmals vielen Dank). Mein Problem:

In einer For-Next-Schleife untersuche ich einzelne Teile eines Gesamttextes auf bestimmte Merkmale hin. Der gesamte Text befindet sich in oDoc1, Frame1, die Untersuchung der einzelnen Teile soll in oDoc2, Frame2, stattfinden. Das Merkwürdige ist: Wenn ich bei der Kreation von Frame2 die Eigenschaft "visible" angebe, funktioniert alles wunderbar. Zum Beispiel, wenn ich ein Debug mache und sehen möchte, was genau passiert. Wenn ich diese Eigenschaft aber auf "hidden" stelle, weil ich keine Lust habe, auf einen flackernden Bildschirm zu blicken, scheint der Wechsel zwischen den beiden Dokumenten nicht zu funktionieren. Der Fokus bleibt auf oDoc1 bzw. Frame1. Hat jemand eine Idee?

Code: Alles auswählen

	REM Ende der Vorarbeiten, jetzt Einzeltexte identifizieren und in Arbeitsfenster schaffen
	REM Zunächst leeres Fenster als Arbeitsbereich einrichten (Visible oder Hidden)
	OpenProperties(0).Name = "Visible"
	OpenProperties(0).Value = True
	oDoc2 = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, OpenProperties())
	z = Ubound(aNamen())	' Funktioniert nur, wenn aNamen() frisch importiert! Für Test z manuell setzen
	For i = 1 to z
		oFrame1 = oDoc1.getCurrentController().getFrame()
		oFrame1.getContainerWindow().toFront()
		oTxt = oDoc1.text
		oSuche = oDoc1.createSearchDescriptor()
		With oSuche
			.SearchRegularExpression = True
			.setSearchString("Name\:[:space:]{1}[:alpha:]{1,}[:digit:]{1,2}[:space:]{1}Datum\:[:space:]{1}[:digit:]{2}\.[:digit:]{2}\.[:digit:]{2}[:space:]{1}[:digit:]{1,3}.[:space:]{1}Minuten[:space:]{1}")
		End With
		oSuchErg = oDoc1.findFirst(oSuche)
		oSuchErg.gotoEndOfParagraph(true)
		sText = oSuchErg.string
		oSuchErg.goLeft(1, false)
		oSuchErg.gotoEndOfParagraph(false)
		oSuchErg.gotoStartOfParagraph(true)
		oSuchErg.setString("")
		oFrame2 = oDoc2.getCurrentController().getFrame()
		oFrame2.getContainerWindow().toFront()
		oDoc2 = ThisComponent
		oTxt = oDoc2.text
		oTxt.insertString(oTxt.getStart(), sText, False)
		REM Jetzt sind wir in Frame2 (unbenannt.odt) und untersuchen den Text Nr. "i"
		REM erst die Zahl der ergänzten Wörter, die von der Zahl der Wörter (aNamen(i,21) abgezogen wird
		iInt = 0	' iInt ist die Zahl der von mir ergänzten Wörter, wird zunächst auf 0 gesetzt
		oSuche = oDoc2.createSearchDescriptor()
		With oSuche
			.SearchRegularExpression = True
			.setSearchString("#[:digit:]{1,2}\}")
		End With
		oSuchErg = oDoc2.findFirst(oSuche)
		Do while Not isNull(oSuchErg)
			sStr = Mid(oSuchErg.string, 2)
			sStr = Mid(sStr, 1, Len(sStr)-1)
			iInt = iInt + CInt(sStr)
			oSuchErg = oDoc2.findNext(oSuchErg.End, oSuche)
		loop
		aNamen(i,21) = aNamen(i,21) - iInt
		REM jetzt Fehler Nr. 1 - Großschreibung (aNamen(i,1)
		iInt = 0	' iInt Zahl der Großschreibungsfehler
		oSuche = oDoc2.createSearchDescriptor()
		With oSuche
			.SearchRegularExpression = True
			.setSearchString("\[01\]")
		End With
		oSuchErg = oDoc2.findFirst(oSuche)
		Do while Not isNull(oSuchErg)
			iInt = iInt + 1
			oSuchErg = oDoc2.findNext(oSuchErg.End, oSuche)
		loop
		aNamen(i,1) = 0
		aNamen(i,1) = aNamen(i,1) + iInt
		REM jetzt Fehler Nr. 2 - Kleinschreibung (aNamen(i,2)
		iInt = 0	' iInt Zahl der Kleinschreibungsfehler
		oSuche = oDoc2.createSearchDescriptor()
		With oSuche
			.SearchRegularExpression = True
			.setSearchString("\[02\]")
		End With
	...
	Next i
MfG Mr.Ed

PS: Mein Editorfenster liefert mir alles mit roten Punkten unterstrichen. Hängt vielleicht mit der Sprachauswahl zusammen (Standard Englisch?). Wie kann ich diese Punkte wegkriegen?
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von Mr.Ed »

Oh Leute,

vielleicht weil die Umgebung hier im Forum so freundlich ist, habe ich mich hinreißen lassen, die "goldene Regel" zu missachten: Erst lesen, dann schreiben! Ich sehe jetzt, dass gleich unter meinem Beitrag eine entsprechende Anfrage gestellt wurde, und werde es gleich mal mit der Eigenschaft "Minimized" probieren. Wenn ich Erfolg habe, lasse ich von mir hören.

Trotzdem die Frage nach den Unterstreichungen mit roten Punkten im Editorfenster.

MfG Mr.Ed
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von Mr.Ed »

Nochmals hallo,

"minimized" statt "hidden" funktioniert. Es gibt kein Geflacker mehr. Insofern ist meine Frage erledigt. Trotzdem müsste es aber doch auch möglich sein, zu einem Fenster zu springen und dort zu arbeiten, wenn dies (für den Benutzer) verborgen (= "hidden") ist.

Und immer noch die roten Punkte im Editorfenster.

MfG Mr.Ed
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von DPunch »

Aloha
Mr.Ed hat geschrieben:Trotzdem müsste es aber doch auch möglich sein, zu einem Fenster zu springen und dort zu arbeiten, wenn dies (für den Benutzer) verborgen (= "hidden") ist.
Natürlich ist das prinzipiell möglich, es gibt lediglich Einschränkungen bezüglich einiger Darstellungseinstellungen.

Wenn ich mir Deinen Ursprungspost mal anschaue:

Code: Alles auswählen

(...)
oDoc2 = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, OpenProperties())
(...)
oDoc2 = ThisComponent '<----- Deine Problemstelle, einfach rauslöschen
(...)
Die erste Zeile liefert Dir bereits die Referenz auf das neu geöffnete Dokument, mit der zweiten Zeile überschreibst Du diese Referenz wieder mit der Referenz auf das Ursprungsdokument, wenn das neue Dokument versteckt geöffnet werden soll. ThisComponent ist dann nämlich immer noch das ursprüngliche Dokument.

Grundsätzlich würde ich Dir davon abraten, "thisComponent" mehr als einmal im Code zu verwenden, und eigentlich auch nur, um die Referenz auf das aufrufende Dokument zu bekommen. Die Resultate können in der Praxis bei mehrmaliger Verwendung von Modul zu Modul unterschiedlich sein.
Zudem liefert eigentlich jede "öffnende" Methode direkt eine Referenz auf das neu geöffnete Objekt zurück.
Mr.Ed hat geschrieben:weil ich keine Lust habe, auf einen flackernden Bildschirm zu blicken,
Dafür bietet sich auch die Methode "lockControllers" an. Dadurch wird die Benachrichtigung der Controller zum Aktualisieren ihrer Darstellung verhindert (=Flackern).
Einsatzweise ganz einfach:

Code: Alles auswählen

oDoc2 = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, OpenProperties())
oDoc2.lockControllers
'(beliebige Aktionen durchführen)
oDoc2.unlockControllers
Mr.Ed hat geschrieben:Und immer noch die roten Punkte im Editorfenster.
Dazu kann ich Dir leider nichts sagen.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von Stephan »

Grundsätzlich würde ich Dir davon abraten, "thisComponent" mehr als einmal im Code zu verwenden, und eigentlich auch nur, um die Referenz auf das aufrufende Dokument zu bekommen. Die Resultate können in der Praxis bei mehrmaliger Verwendung von Modul zu Modul unterschiedlich sein.
Dazu besteht kein Grund und außerdem gibts kein 'unterschiedlichen' Resultate wenn man ThisComponent richtig verwendet. ThisComponent bezieht sich immer auf das aktive Dokument aus Sicht der Basic-IDE.

ThisComponent verhält sich wie dokumentiert, Ausnahmen oder gar Probleme sind mir bei richtger Verwendung nicht bekannt.

Siehe:
http://wiki.services.openoffice.org/wik ... he_UNO_API



Gruß
Stephan
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von DPunch »

Aloha
Stephan hat geschrieben:Dazu besteht kein Grund
Interessante Aussage, gerade wenn man sieht, wie viele Fehler, bzw. Probleme, allein bei den hier im Forum gestellten Fragen auf genau diesem Vorgehen fussen...
Es besteht kein Grund, mehrmals mit thisComponent zu arbeiten und ich werde auch in Zukunft davon abraten, wenn ich meinen Senf zu einem Thema dazugebe, egal, ob Du dem zustimmst oder nicht.
Stephan hat geschrieben:und außerdem gibts kein 'unterschiedlichen' Resultate wenn man ThisComponent richtig verwendet.
Was willst Du mir mit "richtig verwenden" sagen?
Es erzeugt unterschiedliche Resultate, abhängig davon, wo die Makros liegen (z.B. im Dokument vs Standard-Bibliothek) - ganz zu schweigen davon, dass mir unter Base desöfteren inkonsistentes Verhalten aufgefallen ist (teilweise ein gerade geöffnetes Formular als thisComponent geliefert gekriegt, teilweise mit dem gleichen Code das DatabaseDocument selber).

Buchstabe für Buchstabe der gleiche Code erzeugt also komplett unterschiedliche Ergebnisse, je nachdem, wo er liegt.

Jetzt kannst Du gerne sagen, dass das Wissen darum, wo genau der Basic-Code liegt, ein Teil des "richtigen Verwendens" ist, aber eine solche Diskussion halte ich ehrlich gesagt für hanebüchen.

P.S.: Gilt für die Versionen bis inklusive 3.2.1.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von Stephan »

Interessante Aussage, gerade wenn man sieht, wie viele Fehler, bzw. Probleme, allein bei den hier im Forum gestellten Fragen auf genau diesem Vorgehen fussen...
Wo denn? Die Probleme fussen eben nicht auf mehrmaliger Verwendung, sondern falscher Verwendung bzw. falscher Annahme dazu was ThisComponent liefert.

Beispielsweise ist:

Code: Alles auswählen

(...)
oDoc2 = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, OpenProperties())
(...)
oDoc2 = ThisComponent '<----- Deine Problemstelle, einfach rauslöschen
(...)
überhaupt nicht falsch, sondern der Nutzer ist augenscheinlich lediglich falschen Glaubens was die zweite ThisComponent-Zeile bewirken würde.
Was willst Du mir mit "richtig verwenden" sagen?
Das Du wissen mußt was ThisComponent macht damit Du es richtig anwendest. Du kannst ganz einfach nicht ThisComponent aufrufen ohne zu beachten in welchem Kontext Du das tust, denn genau das Verhalten von ThisComponent welches Du 'bemängelst' (also das gleicher 'ThisComponent-Code' nicht immer ein 'gleiches' ERgebnis liefert) ist gewolltes Verhalten.
Jetzt kannst Du gerne sagen, dass das Wissen darum, wo genau der Basic-Code liegt, ein Teil des "richtigen Verwendens" ist, aber eine solche Diskussion halte ich ehrlich gesagt für hanebüchen.
Ich nicht, denn Du verwendest ThisComponent scheinbar ohne zu berücksichtigen was es tut und erwartest quasi das es sich verhält wie StarDesktop.CurrentComponent.
Genau das ist aber NICHT die Aufgabe von ThisComponent bzw. genau deshalb gibt es die zwei Möglichkeiten ThisComponent und StarDesktop.CurrentComponent - beides sind unterschiedliche Dinge und liefern nur in speziellen Situation gleiche Ergebnisse und das ist so gewollt und das muß man wissen.

"hanebüchen" ist nichts daran, außer das die Dinge nicht so ganz leicht zu verstehen sind, nur es ist eben ein Unterschied zwischen der möglichen Aussage das 'ThisComponent' nicht richtig 'funktioniert' und der möglichen Aussage das man das Verhalten von ThisComponent verwirrend findet oder findet das es verwirrend ist das ThisComponent und StarDesktop.CurrentComponent parallel existieren und fast das Gleiche tun, aber eben nur "fast".
Das 'Verwirrungs'potential besteht bestreite ich nicht, das ThisComponent irgendwo falsch funktioniert hingegen schon, denn mir ist (bisher) kein solcher Fall bekannt.


Sorry, nur ich frage mich wirklich was Du von mir willst. Bisher bist Du mir hier als sehr geschickter Programmierer aufgefallen, aber hier im Konkreten hast Du meines Erachtens Probleme im Verständnis von ThisComponent und statt zu verstehen wo Deine Verständnisprobleme liegen gibst Du anderen Ratschläge ThisComponent in bestimmten Situationen nicht zu verwenden wo Du mit der Verwendung nicht zurechtkommst.

Ich darf hier sagen das ich meine liebe Not hatte ThisComponent zu 'begreifen' und auch heute noch erlebe ich Situationen wo mein Code dann plötzlich etwas anderes tut als ich erwarte, aber wenn ich den Code dann analysiere bin ich noch nie auf eine Stelle gestossen wo sich ThisComponent nicht so verhält wie es soll, sondern mußte immer feststellen das der Fehler bei mir lag.


Ich bin auch gerne bereit eine inhaltliche Diskussion dazu zu führen, denn ich sehe mich nicht in der Position automatisch REcht zu haben. Im Moment sehe ich aber nur 2 Aussagen von Dir:

1. 'es sei problematisch ThisComponent mehrfach zu verwenden'

Dazu kann ich nur sagen das das meines Wissens nicht stimmt, allein darfst Du natürlich auch nicht erwarten das ThisComponent in einer Code-Situation wie:

Code: Alles auswählen

x1 = ThisComponent

'weiterer Code

x2 = ThisComponent
für x1 und x2 immer das identische Objekt liefert. Manchmal ist es so und manchmal nicht und das ist so beabsichtigt und hängt vom konkreten Code zwischen den Aufrufen ab.

2. 'ThisComponent verhält sich manchmal inkonsistent'

Mir ist dazu nichts bekannt. Liefere bitte eine konkrete Beispieldatei wo das nachvollziehbar ist, dann kann ich darüber diskutieren/nachdenken.

(Eine Beispieldatei ist hier nicht Bedingung um Dich abzuschrecken, einzig würde sie mir die Arbeit erleichtern und die Chance einer Antwort von mir erhöhen, denn ich habe ganz einfach wenig Zeit.)


Gruß
Stephan
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von DPunch »

Aloha
Stephan hat geschrieben:Beispielsweise ist (...) überhaupt nicht falsch, sondern der Nutzer ist augenscheinlich lediglich falschen Glaubens was die zweite ThisComponent-Zeile bewirken würde.
Ich sagte nicht, dass das falsch ist (das Verhalten respektive Ergebnis des Makros), im Gegenteil.
Stephan hat geschrieben:nur es ist eben ein Unterschied zwischen der möglichen Aussage das 'ThisComponent' nicht richtig 'funktioniert' und der möglichen Aussage das man das Verhalten von ThisComponent verwirrend findet
Weder finde ich das Verhalten 'verwirrend', noch habe ich behauptet, das es nicht oder nicht richtig 'funktioniert'.
Ich sagte:
DPunch hat geschrieben:Die Resultate können in der Praxis bei mehrmaliger Verwendung von Modul zu Modul unterschiedlich sein.
Und dies ist der Fall.
Stephan hat geschrieben:aber hier im Konkreten hast Du meines Erachtens Probleme im Verständnis von ThisComponent und statt zu verstehen wo Deine Verständnisprobleme liegen gibst Du anderen Ratschläge ThisComponent in bestimmten Situationen nicht zu verwenden wo Du mit der Verwendung nicht zurechtkommst.
Dann kannst Du mir ja mal bitte erklären, was genau bei Dir den Eindruck erweckt, ich hätte in irgendeiner Art "Verständnisprobleme" und würde aus diesem Grund davon abraten.

Ich habe ziemlich deutlich gesagt, warum ich genau den Ratschlag gebe, den ich gegeben habe:
Es erzeugt in unterschiedlichen Umgebungen unterschiedliche Ergebnisse.
Nun entwickelt vielleicht gerade ein angehender Makro-Programmierer seine kompletten Makros in seiner Standard-Bibliothek, verwendet dabei unbedarft mehrmals quer über den Code thisComponent, packt nach Fertigstellung den kompletten Code per Copy+Paste in ein Dokument und sitzt dann erstmal verständnislos vor dem Bildschirm und wundert sich, warum auf einmal nichts mehr läuft, obwohl er doch in seiner Standard-Bibliothek alles ausgiebig getestet hatte - oder andersrum, er will in einem Dokument vorhandene Makros globaler verwenden und kopiert diese dazu per Copy+Paste in eine OOo-Bibliothek, mit dem gleichen Resultat.

Für erfahrenere Anwender wie Dich oder mich mag die Fehlerquelle offensichtlich sein, für andere aber möglicherweise ganz und gar nicht.

Dies zu vermeiden (sprich präventive Fehlervermeidung), die Portabilität, die Übersicht, gepaart mit der Tatsache, dass es gar keinen Grund dafür gibt, mehrmals mit thisComponent zu arbeiten, DAS sind die Gründe für meinen Ratschlag. Nicht irgendwelche Verständnisprobleme, die Du mir hier fröhlich frei aufs Schild schreiben willst.
Stephan hat geschrieben:1. 'es sei problematisch ThisComponent mehrfach zu verwenden'
Dazu kann ich nur sagen das das meines Wissens nicht stimmt, allein darfst Du natürlich auch nicht erwarten das ThisComponent in einer Code-Situation wie (...) für x1 und x2 immer das identische Objekt liefert. Manchmal ist es so und manchmal nicht und das ist so beabsichtigt und hängt vom konkreten Code zwischen den Aufrufen ab.
Es kann problematisch sein - eben weil es nicht nur vom konkreten Code abhängt.
Stephan hat geschrieben:2. 'ThisComponent verhält sich manchmal inkonsistent'
Mir ist dazu nichts bekannt. Liefere bitte eine konkrete Beispieldatei wo das nachvollziehbar ist, dann kann ich darüber diskutieren/nachdenken.
Wenn ich eine konkrete Beispieldatei hätte, hätte ich nicht gesagt, "dass mir unter Base desöfteren inkonsistentes Verhalten aufgefallen ist", sondern dezidiert über einen Fehler geredet.
Eine Beispieldatei müsste dabei im Übrigen konsistentes (Fehl-)Verhalten zeigen, was ja nichts mit meiner Aussage zu tun hat.
Da ich diese Sache aber eh nur am Rande erwähnt hatte und ich meine Beobachtungen eben nicht mit Beispielen untermauern kann, können wir das ruhig aussen vor lassen - betraf sowieso nur Base, vermutlich noch in einer Version vor 3.2.1 und auch nicht in großer Anzahl.
Stephan hat geschrieben:und auch heute noch erlebe ich Situationen wo mein Code dann plötzlich etwas anderes tut als ich erwarte, aber wenn ich den Code dann analysiere bin ich noch nie auf eine Stelle gestossen wo sich ThisComponent nicht so verhält wie es soll, sondern mußte immer feststellen das der Fehler bei mir lag.
Tja, hätte Dir mal früher jemand den Tipp gegeben, nicht mehrmals thisComponent zu verwenden, hmm? ;)
Q.E.D.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von Stephan »

Dann kannst Du mir ja mal bitte erklären, was genau bei Dir den Eindruck erweckt, ich hätte in irgendeiner Art "Verständnisprobleme" und würde aus diesem Grund davon abraten.
Dieser Eindruck wird bei mir erweckt weil:
Du machst deutlich das Dir am Verhalten von ThisComponent nichts falsch vorkommt (im jetzigen post bekräftigst du das mehrfach).
Wenn das aber so ist, wieso rätst Du dann von einer mehrfachen Verwendung von ThisComponent (innerhalb eines Makros) ab, die doch allenfalls dann Probleme erzeugt wenn man ThisComponent falsch verwendet oder falsch interpretiert.

Du warnst letztlich vor der Verwendung von Etwas was funktioniert wie es funktionieren soll. Und ich halte diese Warnung für übertrieben, außer eben sie wäre mir verständlich wenn Dir das Verhalten verwirrend erscheint und Du aus dieser Erfahrung heraus andere warnen willst.
Nun entwickelt vielleicht gerade ein angehender Makro-Programmierer seine kompletten Makros in seiner Standard-Bibliothek, verwendet dabei unbedarft mehrmals quer über den Code thisComponent, packt nach Fertigstellung den kompletten Code per Copy+Paste in ein Dokument und sitzt dann erstmal verständnislos vor dem Bildschirm


Oder ist er "verwirrt", wie ich es sagte?
und wundert sich, warum auf einmal nichts mehr läuft, obwohl er doch in seiner Standard-Bibliothek alles ausgiebig getestet hatte - oder andersrum, er will in einem Dokument vorhandene Makros globaler verwenden und kopiert diese dazu per Copy+Paste in eine OOo-Bibliothek, mit dem gleichen Resultat.
Gib mir bitte ein Beispiel dazu.



Gruß
Stephan
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von DPunch »

Aloha
Stephan hat geschrieben:Du machst deutlich das Dir am Verhalten von ThisComponent nichts falsch vorkommt (im jetzigen post bekräftigst du das mehrfach).
Wenn das aber so ist, wieso rätst Du dann von einer mehrfachen Verwendung von ThisComponent (innerhalb eines Makros) ab, die doch allenfalls dann Probleme erzeugt wenn man ThisComponent falsch verwendet oder falsch interpretiert.
Richtig, mir kommt da nichts falsch vor. Und ich weiss auch sehr genau, welche Verwendung welches Ergebnis bringt.
Ich rate davon ab, weil... die Gründe habe ich oben schon aufgezählt.
Stephan hat geschrieben:wenn Dir das Verhalten verwirrend erscheint und Du aus dieser Erfahrung heraus andere warnen willst.
Da ich meine Makros immer per Extension verteile und selber nie darauf kommen würde, thisComponent mehrmals in einer Prozedur zu benutzen, musste ich die Erfahrung glücklicherweise nicht unfreiwillig machen.
Ich bin allerdings mal in der Wiki drüber gestolpert und hab bei 'nen paar Spielereien gemerkt, wieviel Fehlerpotenzial da drinsteckt.
Stephan hat geschrieben:Oder ist er "verwirrt", wie ich es sagte?
Sicher ist er auch verwirrt, schliesslich lief ja alles noch wunderbar, als er es woanders getestet hatte.
Stephan hat geschrieben:Gib mir bitte ein Beispiel dazu.
Du willst mir jetzt aber nicht sagen, dass Du gar nicht weisst, wovon ich spreche - oder?
Mach Dir zwei Prozeduren mit dem Code

Code: Alles auswählen

	s = thisComponent.Title
	oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())
	MsgBox s & Chr(13) & thisComponent.Title
davon eine in Deiner Standard-Bibliothek und eine in einem Dokument.
Führ beide Prozeduren vom Dokument aus aus.
Läuft alles absolut ordnungsgemäß und so wie man es erwarten kann und muss.
Trotzdem ist der absolut identische Code nicht portabel.
Nun stell Dir das mal in einem größeren Makro vor, möglicherweise mit nicht nur zweimaliger, sondern noch öfterer Verwendung. Am besten bei einem noch unerfahrenen Benutzer.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von Stephan »

Du willst mir jetzt aber nicht sagen, dass Du gar nicht weisst, wovon ich spreche - oder?
Nein, ich will Dir sagen das ich es als für mich lohnend erachte die Dinge ernsthaft zu diskutieren, weil ich Dich für kompetent halte, und dazu möchte ich ausschließen das wir in Details falsche Annahmen zur Grundlage nehmen.

(Zur Frage "kompentent" darf ich Dir, um nicht mißverstanden zu werden, 2 Dinge sagen:
*ich verteile Lob sparsam und gebrauche solche Adjektive nicht um jemanden freundlich zu stimmen
*ich habe, trotz meiner wohl oftmal spröde erscheinenden Art, ein sehr waches Auge für solche Sachen und etliche Deiner im Forum geposteten Lösungen halte ich für exellent weil sie jenseits des Üblichen sind)

Läuft alles absolut ordnungsgemäß und so wie man es erwarten kann und muss.
Trotzdem ist der absolut identische Code nicht portabel.
Naja, auch wenn ich mich für das Folgende wieder schmähen lassen müßte:

Dein Code belegt nicht das es ein Problem durch die Mehrfachverwendung von ThisComponent gibt, was ja Ausgangspunkt der ganze Diskussion war, denn es geht allein um richtige oder falsche Verwendung, genauer gesagt (auch das schon so thematisioert) um richtige Verwendung im Sinne der 'Ergebniserwartung'.

Konkret würde ein Code mit nur einmaliger Verwendung von ThisComponent:

Code: Alles auswählen

oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())
MsgBox s & Chr(13) & thisComponent.Title
zu genau gleichen Problemen führen, das aber nur weil der Code falsch geschrieben ist, insofern als man ein anderes Ergebnis erwartet als was ThisComponent in Wahrheit liefern kann.

ThisComponent liefert eben nicht, auch das von mir schon geschrieben, das letztaktive Dokument, sondern: "... das aktive Dokument aus Sicht der Basic-IDE.", auch wenn Beides so erscheint als wenn es immer dasselbe wäre, und deshalb ist doch Dein Herangehen bzw. Deine Erwartung nicht zutreffend.

Dein Kritikpunkt ist doch das ein identischer Code der an verschiedenen Stellen gespeichert ist zu unterschiedlichen Ergebnissen führen kann und das das irritierend(?) oder falsch(?) oder ... wäre.
Und das sehe ich schon dem Grunde nach nicht als Besonderheit, denn solche Dinge begleiten einen beim Programmieren doch ständig. Nimm beispielsweise 2 verschiedene Sortieralgorithmen (A und B), daraus das für das für das Sortieren eines bestimmten Datenarrays (Array1) gilt das sich der Algorithmus A als schneller erweist, folgt nicht das er der generell schnellere sein muß, deenn er kann sich für ein anderes Datenarray als langsamer als B erweisen.


Ich sags einmal anders, worum es hier geht sind Fragen der Interpretation und wir reden aneinander vorbei.

Wenn ich z.B. folgenden Code vorgebe:

Code: Alles auswählen

Sub zeit()
  Msgbox Date()
End Sub
und sage das dieser Code auf zwei verschiedenen Rechnern, mit korrekter Systemzeiteinstellung, zum gleichen Zeitpunkt ausgeführt wird, und ich dann frage:

Wie wird das Ergebnis sein?

(a) Beide Msgboxen zeigen das gleiche Datum
(b) Beide MsgBoxen zeigen ein unterschiedliches Datum

Ist Deine Antwort, sofern ich sie in gleicher Art der Interpretation gebe wie Du zu ThisComponent argumentierst, doch ganz offensichtlich (a).

Diese Antwort ist jedoch falsch.

In Wahrheit ist nicht einmal meine Antwortvorgabe von (a) und (b) richtig, denn ohne die Nebenbedingung zu kennen wo die Rechner (geografisch) stehen, was hier eine ähnliche Nebenbedingung ist wie von wo aus ein ThisComponent-Makro gestartet wird, kann doch die Antwort nur lauten das man das nicht vorher entscheiden kann.



Das war nun viel Text und ich werde damit leben müssen ggf. wieder mit dem Adjektiv "hanebüchen" versehen zu werden, in Wahrheit führe ich hier nur eine ernsthafte Diskussion auf gleicher Augenhöhe.
Das deshalb weil ich Dich für kompetent halte und eigentlich glaube das Dir das Verständnis für solche Programmierdiskussionen nicht fehlen sollte, wo ich gleichfalls weiß das 99% hier im Forum nur glauben werden wir stritten hier darum wer 'Recht' hat.

Falls Du Letzteres auch glaubst, dann allerdings leben wir hier in zwei Welten, denn ich habe mich hier ursprünglich eingemischt weil mir Deine Aussage:
Grundsätzlich würde ich Dir davon abraten, "thisComponent" mehr als einmal im Code zu verwenden, und eigentlich auch nur, um die Referenz auf das aufrufende Dokument zu bekommen. Die Resultate können in der Praxis bei mehrmaliger Verwendung von Modul zu Modul unterschiedlich sein.
zu strikt erschien, ganz im Sinne dessen das ich jetzt sagte:
... ich halte diese Warnung für übertrieben ...
denn es geht hier, meines Erachtens, eben nicht um Besonderheiten vor denen man warnen muß indem man andere davon abhält, sondern um normale Probleme im Programmieralltag die jeder der programmieren will irgendwo verstehen muß, denn sonst wird er irgendwo 'Code-Kopierer' bleiben.



Gruß
Stephan
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von DPunch »

Aloha
Stephan hat geschrieben:Konkret würde ein Code mit nur einmaliger Verwendung von ThisComponent (...) zu genau gleichen Problemen führen, das aber nur weil der Code falsch geschrieben ist, insofern als man ein anderes Ergebnis erwartet als was ThisComponent in Wahrheit liefern kann.
Das stimmt natürlich - ich hatte einfach mal stillschweigend vorausgesetzt, dass die erste Verwendung zur Identifizierung des aufrufenden Dokuments dient.
Wenn ich mir dazu im Allgemeinen die geposteten Code(-schnipsel) hier im Forum anschaue, trifft dies in gefühlt 99,99% der Fälle auch zu.
Die restlichen 0,01% falsifizieren meine Grundannahme zwar immer noch, aber ich denke, Du weisst (spätestens jetzt) was und wie es gemeint war.
Stephan hat geschrieben:ThisComponent liefert eben nicht, auch das von mir schon geschrieben, das letztaktive Dokument, sondern: "... das aktive Dokument aus Sicht der Basic-IDE.", auch wenn Beides so erscheint als wenn es immer dasselbe wäre, und deshalb ist doch Dein Herangehen bzw. Deine Erwartung nicht zutreffend.
(...)
Dein Kritikpunkt ist doch das ein identischer Code der an verschiedenen Stellen gespeichert ist zu unterschiedlichen Ergebnissen führen kann und das das irritierend(?) oder falsch(?) oder ... wäre.
Ich verstehe immer noch nicht, warum Du darauf beharrst, dass die Ergebnisse der Verwendung von thisComponent für mich entweder irritierend oder gar falsch sein müssen, damit ich die Meinung haben kann, die ich nunmal habe.
Das ist nicht der Fall - wie nun schon mehrmals erklärt.

Du scheinst mit der Einstellung an die Sache ranzugehen, dass Du einen integralen Bestandteil der OpenOffice-Programmierung vor irgendeiner Attacke beschützen musst.
Da liegst Du aber vollkommen daneben.
Mein Ratschlag war nie etwas anderes als genau das- ein Ratschlag ("würde ich Dir davon abraten", so der genaue Wortlaut).
Ein Ratschlag auf gleicher Ebene wie Ratschäge, den Datentyp der Parameter und den Rückgabetyp von Funktionen falls bekannt von vornherein klar festzulegen und im Code zu verankern, innerhalb von Schleifen nicht jedesmal über mehrere Ebenen auf ein Objekt zuzugreifen (ala oComSet.Model.StringItemList bei x Zugriffen), eindeutige Variablennamen zu verwenden, Sicherheitsabfragen bei Rückgabewerten zu verwenden, von vornherein bekannte Sheets in einem Calc-Dokument lieber per Namen als per Index zu holen, mittels .lockController Geschwindigkeitszuwächse zu erhalten undundund.
Keine dieser Sachen respektive ihre Ergebnisse irritiert mich auch nur im Entferntesten. Keine dieser Sachen funktioniert meiner Meinung nach irgendwie "falsch".
Keiner dieser Ratschläge impliziert, dass mit OOo Basic irgendwas nicht stimmt.
Aber, und das ist der entscheidende Punkt:
Ich gebe diese Ratschläge nur, weil ich der eindeutigen Meinung (Meinung = subjektiv) bin, dass es ausschliesslich Vorteile mit sich bringt, sie zu befolgen, und keinerlei Nachteile.
Trotzdem macht es keinen Unterschied beim Vorankommen, ob man meinen Ratschlag für angemessen erachtet und annehmen will oder nicht.

Und genau das trifft auch auf die mehrmalige Verwendung von thisComponent zu.
Das gilt selbst für den erfahrensten Programmierer - selbst wenn Du zu jeder Zeit während der Entwicklung des/der Makros weisst, was Dir thisComponent in dieser oder jenen Codezeile gerade zurückliefert, selbst wenn Du Dir dessen stets bewusst bist - möglicherweise ist es selbst dann unmöglich, das Makro ohne Anpassungen aus einer OOo-Bibliothek in ein Dokument zu transferieren oder vice-versa.
Und das vollkommen grundlos. Ich habe noch in keinem Makro die Notwendigkeit gesehen, ein anderes Dokument als das aufrufende über thisComponent zu identifizieren. Noch nie.
Daher war, ist und bleibt mein Tip:
Die zurückgegebene Referenz der öffnenden Methode verwenden, niemals thisComponent verwenden, um etwas anderes als das aufrufende Dokument zu referenzieren.

Was Dich an diesem Ratschlag so gestört hat, dass Du sofort interveniert hast, was Dich hier vermuten lässt, ich würde den Ratschlag nur geben, weil ich das Verhalten von thisComponent bzw. den Unterschied zwischen thisComponent und StarDesktop.CurrentComponent nicht verstehen würde, was im Übrigen so absurd ist, dass es schon fast beleidigend wird - nicht der Vorwurf, dass ich irgendwas nicht verstehen würde, sondern dass ich raten würde, von irgendwas die Finger zu lassen, nur weil ich es nicht verstehe - ist für micht nicht nachvollziehbar.
Stephan hat geschrieben:und ich werde damit leben müssen ggf. wieder mit dem Adjektiv "hanebüchen" versehen zu werden
Was ich als hanebüchen bezeichnet habe, ist eine Diskussion darüber, ob man thisComponent mehrmals verwenden kann, wenn man weiss, auf welcher Ebene bzw in welcher Umgebung das Makro ausgeführt wird.
Natürlich kann man. Aber warum sollte man?
Stephan hat geschrieben:wo ich gleichfalls weiß das 99% hier im Forum nur glauben werden wir stritten hier darum wer 'Recht' hat.
Falls Du Letzteres auch glaubst, dann allerdings leben wir hier in zwei Welten
"Recht haben" kann man nur ins Spiel bringen, wenn man meint, ich würde in irgendeiner Weise über die Richtigkeit, Nachvollziehbarkeit, Logik der Ergebnisse von thisComponent diskutieren.
Tue ich nicht.
Ich habe meine persönliche Meinung zu einem Thema geäussert, unter anderem vor dem Hintergrund, dass innerhalb von wenigen Tagen gleich 2 Probleme auf die falsche Verwendung von thisComponent zurückzuführen waren - was liegt also näher, als einen Tipp zu geben, der meiner Meinung nach ähnliche Probleme in der Zukunft von vornherein ausklammert?
Ich diskutiere diese Sache nur so lange und ausgiebig, weil ich das Gefühl habe, dass Du meine Beweggründe vollkommen falsch interpretierst.
Ginge es darum, dass irgendjemand meint, ich wäre im Unrecht, wäre die Sache mit ein paar Argumenten geklärt bzw. die Standpunkte ausgetauscht, ginge es darum, dass jemand meine Meinung doof findet, so what, passiert jedem täglich.
Stephan hat geschrieben:denn es geht hier, meines Erachtens, eben nicht um Besonderheiten vor denen man warnen muß indem man andere davon abhält, sondern um normale Probleme im Programmieralltag die jeder der programmieren will irgendwo verstehen muß, denn sonst wird er irgendwo 'Code-Kopierer' bleiben.
Wie gesagt, es war keine Warnung, sondern ein ehrlich und gut gemeinter Ratschlag.
Ich bin ganz Deiner Meinung, dass man, wenn man ernsthaft mit OOo Basic arbeiten will, sich dieser und auch anderer Umstände bewusst sein sollte - ich sehe aber nicht unbedingt die Notwendigkeit, es auf die harte Tour lernenen zu müssen.
Stephan hat geschrieben:Das war nun viel Text
Das war jetzt sogar noch mehr.
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: "hidden" - "visible" Unterschiedliches Verhalten

Beitrag von Mr.Ed »

Hallo zusammen,

habe ein paar Tage nicht mehr reingeschaut und nehme mit Interesse die tiefschürfende Diskussion zur Kenntnis. Mein Verständnis wird, wie ich hoffe, hinterherhinken. Danke für die konkreten Tipps!

MfG Mr.Ed
Antworten