Seite 1 von 1

Kann auf dialog nicht zugreifen

Verfasst: Mo, 20.03.2006 21:07
von Dragonlord
hallo zusammen, hoffentlich kann mir hier einer helfen, bevor ich nu noch ganz durchdreh ab dem OOBase s***** hier.

ich programmier nun schon seit einier ewigkeit und hab auch schon mit VBA mich rumschlagen müssen, aber hier seh ich total nicht durch, egal wieviele refs und tuts ich schon gegoogled habe.

eigentlich will ich nur aus OOBase heraus in meinem dialog beim aufstarten ein paar list-boxes mit datensätzen füllen. ich muss hierbei ein altes personalprogram von access in oobase rüber bringen, und krieg das mit dem dialog nicht gebacken.

ich hab folgendes probiert, nur um mit fehlern überschüttet zu werden:

Code: Alles auswählen

Sub frmMain_onLoading
	myself = ThisComponent.DrawPage.Forms.getByName("frmMain")
	cbm = myself.getByName("cbMitarbeiter")
	items = cbm.StringItemList
	connection = myself.ActiveConnection
	statement = connection.createStatement()
	query = statement.executeQuery( "SELECT * FROM roland.mitarbeiterliste" )
	while query.next()
		cbm.addItem( query.getString( 2 ), cbm.getItemCount() )
	wend
	cbm.selectItemPos( 0, true )
	statement.close()
End Sub
bei cbm.addItem wird derbe reklamiert dass addItem nicht vorhanden ist. sowie ich das hier gesehen hab, ist cbm ein ListboxModel, also ein Model. von einem model verspricht sich der OO coder, die daten eines objekts manipulieren zu können... denkste... ich weiss nicht wiso, aber das ist hier nicht der fall. des weiteren funktioniert 'myself.getControl("cbMitarbeiter")' ebenfalls nicht ( methode nicht gefunde ). soweit ich das heraus gefunden habe, benötige ich ein 'dialog objekt', damit ich getControl machen kann ( schon wieder geht das mit dem model nicht! ). ich kann aber auf mein frmMain nur so zugreiffen, und da krieg ich ein DialogModel.

kann mir jemand helfen, wie ich an das dialog objetc rankom von dem dialog, welches aus OOBase herause gestarted wurde?

Verfasst: Di, 21.03.2006 09:20
von Toxitom
Hey Dragonlord,

viel Verwirrung.... viel Verwechslung.

Also, zunächst zu den Begriffen: OOo unterscheidet zwischen Formularen und Dialogen - zwei völlig verschiedene Dinge. Das, was du nutzt, sind Formulare, und die erhälst du wie dargestellt:

Code: Alles auswählen

myself = ThisComponent.DrawPage.Forms.getByName("frmMain") 
Dialoge sind eigenständige Objekte - und die nutzt du nicht!
Sowohl Formulare als auch Dialoge beinhalten dann "Controll-Elemente", und die erreichst du eben unterschiedlich:
Bei Formularen mit : getByName()
Bei Dialogenmit: getControl()
Also, für dich gilt immer:

Code: Alles auswählen

cbm = myself.getByName("cbMitarbeiter") 
DAs ist richtig.
Weiter:
Dialoge und Formulare haben zwar an sich die gleichen (oder beser gesagt ähnliche) Controlelemente, diese werden aber unterschiedlich angesprochen und bearbeitet.
Jedes Kontrollelement hat eine Model-Ebene und eine Viewebene, beide können Eigenschaften und Methoden aufweisen - aber eben unterschiedliche.
Da du es mit Formularen zu tun hast, interessiert eigentlich nur die View-Ebene. Und bei Listboxen gibt es hier nur wenige Eigenschaften oder Methoden, auf jeden Fall keine "addItem()". Die gibt es nur bei Dialogen!
Willst du die Liste einer Listbox im Formular füllen, musst du die Eigenschaft "StringItemList" nutzen, welche einen Array aller Listeneinträge zurückliefert bzw. setzt. Den Array selbst musst du andersweitig aufbeuen oder auswerten. Dies ist die eizige Möglichkeit, die Liste in Formularen zu ändern.
Und - vergiss alles über Dialoge - die nutzt du nicht!

Viele Grüße
Thomas

Verfasst: Di, 21.03.2006 15:46
von Dragonlord
ok, soweit ist das klar. ich habe schon selber probiert, mit dem StringItemList zurande zu kommen, stehe aber vor einem problem.

zuerst hab ich probier, ein einfaches array zu bauen:

Code: Alles auswählen

redim names( 2 ) as string
names( 0 ) = "a"
names( 1 ) = "b"
names( 2 ) = "c"
cbm.StringItemList = names
das mag er überhaupt nicht weil die arrays verschiedene dimensionen haben.

dann hab ich es mit dem alten realloc trick aus c versucht:

Code: Alles auswählen

redim cbm.StringItemList( 2 ) as string
aber das geht auch nicht, weil redim anscheinend nur auf lokalen variablen funzt ( meine VB zeit liegt lange zurück ^.=.^ ).

also fehlen mir im moment die ideen, wie ich das ganze lösen soll. laut doku ist das ein sequence<string>, was also ein schlichtes string-array sein sollte. nur wie krieg ich jetzt da mein eigenes array rein, wenn ich nicht zuweisen darf?

Verfasst: Di, 21.03.2006 18:15
von Toxitom
Hey Dragonlord,

na, das war schon richtig:

Code: Alles auswählen

redim names( 2 ) as string
names( 0 ) = "a"
names( 1 ) = "b"
names( 2 ) = "c" 
Na gut, ob du das mit "redim" definieren musst, musst du selbst wissen - im übrigen "as string" solltest du weglassen - ein array braucht das nicht.

Die nächst Zeile muss aber heissen:

Code: Alles auswählen

cbm.StringItemList = names()
Die Klammer ist wichtig, damit der entsprechende Array eindeutig identifiziert wird! Dann sollte das auch genauso funktionieren.

Erläuterung:
"names" und "names()" sind zwei verschiedene Variablen, die erste wird auch automatisch erstellt beim ersten benutzen und zwar als unbestimmter typ. Jetzt passen natürlich die Dimensionen nicht (vielleicht auch verwirrende Fehlermeldung...)
"names()" ist hingegen eindeutig ein array (durch die Klammern), dieser muss aber zuvor deklariert worden sein (durch dim oder eben redim).

Also - so kannst du das bestens zuweisen :)

Gruss
Thomas

Verfasst: Mi, 22.03.2006 10:10
von ykcim
HI,
Na gut, ob du das mit "redim" definieren musst, musst du selbst wissen - im übrigen "as string" solltest du weglassen - ein array braucht das nicht.
Doch auch ein Array sollte wie eine normale Variable ordentlich deklariert werden. Der Typ ist ansonsten Variant. Und das kann zu netten Fehlern führen, die eventuell schwer zu finden sind.

Code: Alles auswählen

   dim myarray(3) as string
'  dim myarray(3) as integer
'  dim myarray(3)
  myarray(0)=1
  myarray(1)=4
  myarray(2)="12"
  myarray(3)="Hallo"
  msgbox myarray(0)+myarray(1)
  msgbox myarray(1)+myarray(2)  
  msgbox myarray(2)+myarray(3)
Versuch mal die drei Möglichkeiten, es kommt jedes Mal ein anderes Ergebnis heraus.

mfg
Michael

Verfasst: Mi, 22.03.2006 15:53
von Dragonlord
hehe... so viel intelligenz hät ich dem OOBasic auch nicht beigemessen. ist ja schliesslich kein python oder gar smalltalk, dann wäre das alles lang wie breit.

und noch etwas. wie kann ich verhindern, dass jedesmal, wenn ich ein dialog aus OOBase starte, eine warnung über makros aktivieren kommt? ist nicht sonderlich prickelnd, wenn das prog nachher im geschäft eingesetzt wird, und jedesmal die leute die makro-warnung wegklicken müssen :|

Verfasst: Mi, 22.03.2006 16:13
von ykcim
Um die Warnung zu deaktivieren, muß die Einstellung für Makros eingestellt werden. Entweder auf "niedrig" oder es werden vertrauenswürdige Quellen eingerichtet.
Siehe dazu Extras -> Optionen - > OO - Sicherheit -> Makrosicherheit.

mfg
Michael

Verfasst: Mi, 22.03.2006 22:44
von Dragonlord
ok, der code hack funktioniert. soweit alles gut. jetzt fehlt mir nur noch eine sache, dann kann ich das zeugs portieren: wie krieg ich ein unter-dialog in mein dialog rein? idee ist einfach. die kontrollen dienen dazu, dynamisch nen filter zu bestimmen, und der unter-dialog soll dann entsprechend dem filter darstellen ( also zum beispiel alle belege für mitarbeter X, monat Y, jahr Z ).

EDIT: ok, das mit dem sub-dialog hab ich jetzt hingekriegt. jetzt bleibt ein problem bestehen, für das ich keine lösung bis jetzt gefunden hab. ich möchte beim starten des dialogs ein paar arrays errechnen, und diese dann für die laufzeit des dialoges behalten ( damit ich nicht immer die datenbank abfragen muss ). jetzt hab ich das mit public variablen im modul versucht, aber ohne erfolg. obwohl ich das array schön errechne, und es zum ende des initialisierens des dialoges da ist, wird es beim aufruf einer testfunktion, während der dialog noch läuft, zurück gesetzt. ich habe also meine arrays 'verloren'.

wie kann ich also ein array beim laden des dialogs erstellen und auch nachher ( solange noch nicht geschlossen ), wieder darauf zugreiffen?