Textfield.text von einem Dialogfeld ansprechen

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

Moderator: Moderatoren

OOrick
Beiträge: 5
Registriert: Di, 16.11.2004 20:10

Textfield.text von einem Dialogfeld ansprechen

Beitrag von OOrick »

Hallo,

ich = blutigster OO-Formular und OO-Basic Anfänger.

ich habe nun folgendes gebastelt: Ein Formular mit einer Tabelle und einen
Such Button. Bei klick auf den Suchbutton öffnet sich Dialog1 und bietet einige Eingabefeldern an (eben textfields). Wenn ich im Dialog auf suchen klicken wird ein Macro aufgerufen (document:Standard.Module1.Main). Dieses Makro soll dann die Tabelle im Formular filtern.

Mein Problem: Wie spreche ich aus der Main-Procedure die textfields im Dialog an?

Code von Main:

Code: Alles auswählen

Sub Main
    dim oDoc as object, oForm as object
    oDoc = ThisComponent
    oForm = oDoc.DrawPage.Forms(0)
    dim Textfeld as Object 
  
    'Textfeld = dialog1.Textfield1.text 
    'oForm.filter = "REFNR_ LIKE '*"+Textfeld+"*'"      
    
    oForm.ApplyFilter=true
    oForm.reload 
End Sub
OK, die Textfeld Variable wäre nicht nötig, aber ich spreche die nun das Textfield1 in Dialog1 an? Ich bekomme den Fehler 'objectvariable nicht belegt'.

Danke für jede Hilfe
patrick
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

OK, die Textfeld Variable wäre nicht nötig, aber ich spreche die nun das Textfield1 in Dialog1 an? Ich bekomme den Fehler 'objectvariable nicht belegt'.
Ich kenne nicht Deinen gesamten Code, aber ich nehme an das die Objektvariable Dialog1 nicht modulweit deklariert ist und zweitens müßtest Du das Textfeld über das Model des Dialogs ansprechen:

Code: Alles auswählen

Textfeld = dialog1.model.Textfield1.text
oder

Code: Alles auswählen

Textfeld = dialog1.GetControl("Textfield1").text 
verwenden.

Gruß
Stephan
OOrick
Beiträge: 5
Registriert: Di, 16.11.2004 20:10

Beitrag von OOrick »

Ich kenne nicht Deinen gesamten Code, aber ich nehme an das die Objektvariable Dialog1 nicht modulweit deklariert ist und zweitens müßtest Du das Textfeld über das Model des Dialogs ansprechen:
*rotwerd* ähm wie deklariere ich schnell den Dialog, so das er Modulweit ansprechbar wäre? Ich weiß die Frage ist jetzt billig, aber eine Antwort wär prima. Mehr Code gibts eigentlich nicht. Nur diese Funktion(Main) und noch eine die das Dialogfenster aufruft. Das wars.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

wie deklariere ich schnell den Dialog, so das er Modulweit ansprechbar wäre?
ganz vorn ins Modul schreiben in jedem Fall außerhalb der Sub's, hier ist ein Beispiel:

Code: Alles auswählen

Dim oDialog1 AS Object 
Dim oForm As Object

Sub StartDialog1 
oForm = DialogLibraries.Standard.Martin 
oDialog1 = CreateUnoDialog( oForm )
oDialog1.execute
end sub 

Sub Button
inhalt = oDialog1.GetControl("feld")
MsgBox inhalt.Text
End Sub


Gruß
Stephan
OOrick
Beiträge: 5
Registriert: Di, 16.11.2004 20:10

Beitrag von OOrick »

Also jetzt mal vielen Dank für deine Hilfe, aber der sch*** klappt noch immer nicht. Bitte bitte nocheinmal irgendwie eine kleine Hilfe oder tipp. i zuck glei aus.

Hier der gesamte Code. Meine Writer Datei schaut wie folgt aus.
formular.sxw
--Standard
----Module1
------showdia
------main
----Dialog1

Module1:
REM ***** BASIC *****
Dim oDialog1 AS Object
Dim oForm As Object

Sub showdia
oLib = DialogLibraries.getbyname("Standard")
oDialog1 = CreateUnoDialog(oLib.getByName("Dialog1"))
oDialog1.execute()
End Sub

Sub Main
inhalt = oDialog1.GetControl("textfield1")
MsgBox inhalt.Text
End Sub
--------
ich starte das Formular:
rufe via einen button das "showdia" macro auf.
der Dialog 'dialog1' wird geöffnet.
ich klicke dort auf "suche starten". Das ruft das macro "main" auf.
ich bekomme einen Fehler "objectvariable nicht belegt"

ich probier jetzt schon wieder 2 stunden herum und komm ned weiter
:x
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Gibt es irgendeinen Grund zu der Annahme das das hier:

Code: Alles auswählen

inhalt = oDialog1.GetControl("textfield1")


das Gleiche sein könnte wie das:

Code: Alles auswählen

inhalt = oDialog1.GetControl("TextField1")
(ich hoffe damit den Fehler gefunden zu haben - aber ist zunächst nur eine Vermutung)
Naja, das passiert mir auch im Zweifel kopiere doch in solchen Situationen die Bezeichnungen mit Drag und Drop aus dem Eigenschaftendialog des Steuerelements.


Gruß
Stephan
OOrick
Beiträge: 5
Registriert: Di, 16.11.2004 20:10

Beitrag von OOrick »

ja aber hallo....... das wars.

*schnief* gibts ja ned... aber ja, ist ja ein String ... uff


D A N K E
OOrick
Beiträge: 5
Registriert: Di, 16.11.2004 20:10

Beitrag von OOrick »

weißt du noch zufälligeweise wie ich einen filter setze der nicht zwischen groß und kleinschreibung unterscheidet?

so mache ich das derzeit. im hintergrund ist eine DBase DB
oForm.filter = "TYPE '*"+inhalt+"*'"

gibts eigentlich ne doku über das starbasic (heißt das überhaupt noch so?)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

gibts eigentlich ne doku über das starbasic (heißt das überhaupt noch so?)
hier:
viewtopic.php?t=1553
habe ich eine ganze Menge aufgelistet.
Meiner Meinung heißt das noch StarBasic, anderer Name ist mir nicht bekannt.

Gruß
Stephan
Benutzeravatar
Wolf
****
Beiträge: 118
Registriert: Fr, 23.04.2004 06:48

Re: Textfield.text von einem Dialogfeld ansprechen

Beitrag von Wolf »

Hallo,

ACHTUNG! Der Gast oben bin ich, hatte vergessen mich einzuloggen und habe noch ein paar gewaltige Fehler entfernt. Also alles nochmal.

Also im Eifer des Gefechts sind da wohl ein paar Fehler unterlaufen.

1. Leider ist die einfache VisualBasic Syntax den Entwicklern dieses API-Monstrums im StarOffice zu einfach.

Code: Alles auswählen

   msgbox Inhalt.text
  
geht schon mal gar nicht.
Schau mal unten, wie man ein Textfeld deklariert, einen Text hineinschreibt und wie man ihn ausliest.
Ich weiss es ist traurig, aber wahr.


2. Werden Objekte außerhalb von Sub's dimensioniert bzw. deklariert, dann am besten mit Public oder Global.

Also

Code: Alles auswählen

Public Textfeld as Object '.....Gilt in allen Basic-Modulen des Dokumentes
oder

Code: Alles auswählen

Global Textfeld as Object '.....Gilt im gesamten oOffice
Das Schlüsselwort "Dim" nützt nur innerhalb eines Modules etwas. Da Du aber wahrscheinlich zwischen mehreren Modulen hin und herspringst ist Public die beste Alternative.

Ich gehe mal davon aus, das "Public" reicht. Ausserdem bist Du damit alle Sorgen los, wenn Du doch ein zweites Modul erstellst und willst dann das Textfeld aufrufen, gibt es bei DIM wieder 'ne Fehlermeldung. Also "Public".

Ein Beispielprogramm. Erstelle einen Dialog mit dem Namen (unten der Reiter !) „dlgTextfeld“
Positioniere folgende Steuerelemente und ordne im Eigenschaftsdialog folgende Eigenschaften zu:
Textfeld
Name: txt_Eingabe

Commandbutton
Name:cmd_Schreiben
Titel: Schreiben

Commandbutton
Name: cmd_Lesen
Titel: Lesen

Commandbutoon
Name: cmd_Beenden
Titel: Beenden
Art der Schaltfläche: Abbrechen

Die Unterstriche im Namen sind gewollt und sind unangenehmen Erfahrungen geschuldet. Außerdem dienen sie der Übersichtlichkeit.
Das Programm:

Code: Alles auswählen

Public dlgTest as Object 
Public txtEingabe as Object

Sub Init_Dialog
'*****************************************
' Dialog und Steuerelemente initialisieren
'*****************************************
 dlgTest=CreateUnoDialog(DialogLibraries.Standard.dlgTextfeld) '..Dialog kreieren
 txtEingabe=dlgTest.GetControl("txt_Eingabe")
End Sub

Sub Start
'*******************************************
' Dialog aufrufen
'*******************************************
Dim a as Long
Dim sText as String

Init_Dialog

'...zum Beispiel das textfeld mit einem vordefinierten Wert belegen
sText="Hallo..."
txtEingabe.SetText(sText)

a=dlgTest.execute() '.....Dialog ausführen

	if a=0 then
	   msgbox "Du hast 'Beenden' gedrückt"
	end if   

dlgTest.Dispose()	
End Sub

Sub Schreiben
'*************************************************************
' Sub schreibt über eine Inputbox einen Text in das Textfeld
'*************************************************************
dim sText as String

sText=Inputbox ("Einen Text eingeben, bitt!","Test des Textfeldes")
if sText<>"" then
	txtEingabe.Settext(sText) 
End if	

End Sub

Sub Lesen
'**************************************************************
' Sub liest den Textstring aus dem Textfeld und zeigt den String
'   in einer msgbox an
'***************************************************************
Dim sText as String
 stext=txtEingabe.GetText()
 msgbox sText
End sub
Nun zurück zum Dialogeditor und im Eigenschaftsdialog den Reiter „Ereignisse“ anklicken.

Nun auf den Button „Schreiben“ klicken und im Ereignisdialog den kleinen Button rechts neben „Maustaste losgelassen“ drücken.
Unten links erscheint in der nun geöffneten Dialogbox ein Feld mit wahrscheinlich zwei Einträgen.
Einer ist „OpenOffice.org.Macros“, der zweite Dein Dokument in dem die zwei Module (einmal der Programmtext und dann der Dialog stehen.)
Das „Plus-Zeichen“ vor Deinem Dokument drücken, es erscheint „Standart“. Das „Plus“-Zeichen drücken, es erscheint „Module1“.
„Module1“ anklicken und im Fenster rechts daneben erscheinen die oben geschriebenen Makros.

Dort nach dem Makro „Schreiben“ suchen, anklicken und Button „Zuweisen“ drücken, dann „OK“.
Der Dialog verschwindet.

Nun dasselbe mit dem Button „Lesen“ machen, also auf den Button „Lesen“ clicken im Ereignisdialog bei „Maustaste losgelassen“ den Knopf mit den 3 Pünktchen anklicken und ...... dann Makro „Lesen“ zuweisen.

Das Dokument mal speichern.

Mit der Sub „Start“ wird der ganze Zauber gestartet.
Also im Dokument das Menü „Extras“ aufrufen.
Dann Makro – Makros..
„Start“ wählen und „Ausführen“ drücken.

Ich habe alles, so wie ich geschrieben habe parallel dazu ausgeführt und es klappt.

Nur den Dialog mußt Du so mal gestalten wie oben beschrieben.

Der Dialog und der Programmtext stehen als Makro in EINEM Dokument. wenn nicht, dann mußt Du die Variablen ganz oben als Global definieren! Aber mach es erst mal so.

Viel Glück

Wolf

P.S.

Zum Test könnte ich Dir vielleicht das eben erstellte Makro Schicken!
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

@Wolf

Wie ist denn die Situation?

Ich habe den geposteten Code nur aus meiner "Codeschnipselsammlung" in meinen post kopiert ohne weiter darüber nachzudenken und das hier funktioniert:

Code: Alles auswählen

'===Modul1======

Dim oDialog1 AS Object 
Dim oForm As Object 

Sub StartDialog1 
oForm = DialogLibraries.Standard.Martin 
oDialog1 = CreateUnoDialog( oForm ) 
oDialog1.execute 
end sub 

Sub Button 
inhalt = oDialog1.GetControl("feld") 
MsgBox inhalt.Text 
End Sub
und es ich unrichtig das:
Das Schlüsselwort "Dim" nützt außerhalb einer Sub oder Function nichts.
DIM wird in dieser Form auch in einigen Makros verwendet die als Beispielmakros dem Paket StarOffice 7 beiliegen - entscheident ist aber es funktioniert (zugegeben habe ich das nicht bei allen Versionen getestet aber bei SO7 unter W2k ist es so).
Zumal dieses Vorgehen auch in der Online-Hilfe beschrieben ist:

Zitat:
"...
Deklarieren von Variablen außerhalb einer SUB oder FUNCTION
DIM GLOBAL VarName As TYPNAME
Diese Variable bleibt während die gesamte StarOffice-Sitzung gültig.
DIM PUBLIC VarName As TYPNAME
Die Variable hat in allen Modulen Gültigkeit.
DIM PRIVATE VarName As TYPNAME
Die Variable hat nur im Modul Gültigkeit.
DIM VarName as TYPENNAME
Die Variable ist nur in diesem Modul gültig.

..."


Und genau so habe ich mein Vorgehen auch kommentiert:
Ich kenne nicht Deinen gesamten Code, aber ich nehme an das die Objektvariable Dialog1 nicht modulweit deklariert ist

Du milderst ja dann auch Deine eigene Aussage:
Das Schlüsselwort "Dim" nützt nur innerhalb eines Modules etwas. Da Du aber wahrscheinlich zwischen mehreren Modulen hin und herspringst ist Public die beste Alternative.


bloß das widerspricht dann auch meiner Erfahrung denn das hier funktioniert auch (SO7 W2k) - zugegeben es sollte nicht funktionieren (und sollte somit nicht verwendet werden):

'===Modul1======

Dim oDialog1 AS Object
Dim oForm As Object

Sub StartDialog1
oForm = DialogLibraries.Standard.Martin
oDialog1 = CreateUnoDialog( oForm )
oDialog1.execute
end sub

'===Modul2======
Sub Button
inhalt = oDialog1.GetControl("feld")
MsgBox inhalt.Text
End Sub

msgbox Inhalt.text

geht schon mal gar nicht.

Das steht ja da wie in Stein gemeißelt - bloß warum funktioniert es dann (die Eigenschaft .text ist doch eine ganz normale Eigenschaft des Textfeldes auf deren Wert ich schreibend und lesend zugreifen kann)? Ich bestreite ja nicht das es auch anders geht aber entscheidend ist doch das ich den Inhalt des Textfeldes auslesen kann und das kann der Code.
Der Dialog und der Programmtext stehen als Makro in EINEM Dokument. wenn nicht, dann mußt Du die Variablen ganz oben als Global definieren!
Naja, gewisse Sachen setze ich dann schon voraus und wenn Du dann schon schreist ("EINEM"), dann sage doch auch gleich dazu das es unabhängig von allem Anderen nicht geht wenn die Makros über z.B. 2 Dokumente verteilt sind, Du kannst nur die Module der OOo-Anwendung ansprechen (wenn vorher geladen).
Ich erinnere mich das ich eine Diskussion gelesen habe wo aufgezeigt wurde das man von einem Dokument das Makro in einem anderen 'aufrufen' konnte, aber die Übergabe des Inhalts von Variablen geht doch nur über die Dokumente und nicht zwischen den Makros direkt.

Die Unterstriche im Namen sind gewollt und sind unangenehmen Erfahrungen geschuldet. Außerdem dienen sie der Übersichtlichkeit.
Das hat jetzt zunächst nichts miteinander zu tun, aber als ich das gelesen habe fiel mir ein Problem ein was ich habe:
Wie vermeide ich das bei der Beschriftung einer Schaltfläche überhaupt etwas unterschrichen wird. Ich weiß zwar wie ich bestimme welcher Buchstabe unterstrichen wird, aber gibt es einen Trick das garnichts unterstrichen wird?


Gruß
Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Wolf,

Ich fange mal hinten an:
Bitte Verzeihe mir, das war um Gottes willen keine Kritik.


Auch wenn es das gewesen wäre, was wäre schlimm daran? Gar nichts! Hab ich Dich so eingeschüchtert oder glaubst Du meine Meinung wiegt schwerer weil ich insgesamt hier im Forum einige post mehr geschrieben habe als Du. Das ist doch belanglos, es geht doch nur um Inhalte, also wirklich kein Grund besorgt zu sein. Und Du solltest nun bloß nicht darauf verzichten Dich hier weiter im Forum zu beteiligen, weil Du möglicherweise befürchtest etwas Falsches zu sagen. Also wirklich kein Problem und weiterhin viel Spaß hier im Forum.

Inhaltlich müssen wir beide die Syntax von StarBasic hinnehmen wie sie ist, ich weiß nämlich nicht wie sich diese zukünftig entwickeln wird.
OK, Du willst vorsichtig (in Bezug auf die zukünftige Entwicklung) sein, bloß konkret ist es nicht vorsichtig statt, der nicht sehr glücklichen Möglichkeit in genannter Form derzeitig DIM benutzen zu 'dürfen', ein 'Public' statt eines 'Private' vorzuschlagen. Denn das war der Punkt, man sollte allgemein Variablen mit dem minimal möglichen Gültigkeitsbereich deklarieren, und ja auch ich mache das nicht immer weil ich auch nicht perfekt bin, aber man sollte es ebend tun denn sonst kaönnte man ja alles gleich als 'Global' deklarieren. Und es gibt auch immer wieder Situationen wo es Spielräume der Interpretation geben kann. Abschließend: DIM ist möglich, aber von der Systematik (oder in diesem Sinne) her nicht gut, und PRIVATE ist dann wohl vorzuziehen gebe ich Dir recht, nur der Vorschlag mit PUBLIC ist wirklich schlechter (so Du PUBLIC nicht benötigst).


Beste Grüße
Stephan
Antworten