Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: botschi am 21.11.06 - 09:28:25
-
Hallo liebe Leute,
ich nutze eine Dialogbox mit folgendem Aufruf:
dialogbox = ws.Dialogbox("dialogzuweisen",True,True,True,False,False,False,"Ticket zuweisen", dlg, True, True)
Kann man der Dialogbox irgendwie sagen, dass sie oben rechts kein 'X' haben soll?
Also ich möchte erreichen, dass man einen meiner Knöpfe drücken muss, um das Fenster wieder zu schliessen.
Kann mir da jemand helfen?
-
Verstehe ich nicht: Warum willst Du den Windows-Standard brechen, wenn Du doch auf "Abbruch durch User" sowieso reagieren musst?
Um das Kreuz wegzubekommen, müsstest Du Dich auch an ein MS-Forum wenden, dann die Dialogbox-Funktionalität kommt direkt aus den Tiefen des Betriebssystems. Notes macht da nur einen API-Call. ;)
Bernhard
-
Ich habe eine Dialogbox, mit einigen Knöpfen, u.a. ein 'Abbrechen'.
Leider verhalten sich der Knopf und das 'X' unterschiedlich :-\
Das muss natürlich an meinem Code liegen...
Wenn ich das 'X' betätige, dann geht nicht nur die Dialogbox zu, sondern das darunter liegende Doc schliesst sich auch. Man bekommt für das darunter liegende also die Frage 'Wollen Sie speichern?".
Ich finde dafür keinen Hebel und wollte deswegen das 'X' entfernen... Kein guter Ansatz, ich weiss...
In meinem Knopf habe ich folgende Formeln:
@SetField("abbruch";"abbruch");
@Command([FileCloseWindow])
-
Du musst den Return Value von Dialogbox auswerten, dann weisst Du auch, was der User gemacht hat und kannst reagieren.
In der Beschreibung hast Du übrigens genau umgedreht erklärt als das, was Du wirklich tust.
Bernhard
-
In der Beschreibung hast Du übrigens genau umgedreht erklärt als das, was Du wirklich tust.
Was meinst Du genau?
-
Wenn ich in der Box meine eigenen Knöpfe habe, also diesen Parameter auf 'True' setze:
noOkCancel
Hinweis This parameter is new with Release 5.
Boolean. Optional. Specify True to not display the OK button.
Wie kann ich denn den Rückgabewert bestimmen? Der ist bei mir immer 'True', auch wenn ich meinen 'Abbrechen'-Knopf drücke, obwohl ich diesen als 'Abbrechen' definiert habe ???
-
Deinene Buttons müssen entweder alle Aktionen bereits selber abschliessen (keine weitere Behandlung im weiteren Code) oder Du musst einen Rückgabecode vereinbaren und global hinterlegen. Das Verfahren ist also anders als mit der "normalen" Dialogbox.
Bernhard
-
Hallo,
du könntest das vielleicht auch in einer do while-Schleife lösen.
In etwa so:
do while Dialogbox = ""
dialogbox = work.prompt....
loop
Dann wird bei Drücken auf x Die Dialogbox erneut angezeigt, und zwar solange, bis der Rückgabewert nicht mehr "" ist.
Gruß
Demian
-
Oha.
Hab ich noch nicht probiert, aber hört sich interessant an. Daran hab ich noch gar nicht gedacht.
Danke dafür!
-
Mir fällt gerade auf, ich habe da was verwechselt. Die Dialogbox gibt nicht "" zurück sondern false. Habe es mit workspace.prompt verwechselt (siehe Code oben).
Also statt "" müsstest du false einsetzen.
Gruß
Demian
-
Ich habs jetzt noch nicht probiert, aber mein Problem ist ja, dass ich nie ein false bekomme.
Wie Bernhard sagte, ich muss wohl einen Rückgabecode vereinbaren.
Es sind jetzt andere Sachen dazwischen gekommen, aber da muss ich auch nochmal ran!
-
Hallo Botschi,
habe jetzt mal deinen Code genommen (bis auf das Dokument dlg)
Dim work As New NotesUIWorkspace
Dim a As Variant
Do While a = False
a = work.DialogBox("Test",True,True,True,False,False,False,"Ticket zuweisen", , True, True)
Msgbox a
Loop
Bei Klicken auf X gibt er mir false zurück und ruft die Box erneut auf. Das das jetzt nur mit dem angegebenen Dokument zusammenhängt, kann ich mir eigentlich nicht vorstellen.
Gruß
Demian
-
Ich nicht, ich kriege trotzdem immer ein true. Auch wenn ich Deinen Code nutze.
Do While dialogbox = False
dialogbox = ws.Dialogbox("dialogzuweisen",True,True,True,False,False,False,"Ticket zuweisen", dlg, True, True)
Loop
Unsere Masken unterscheiden sich vielleicht... Wo kann denn noch der Unterschied liegen?
-
und wenn du mal die Maske dlg weglässt?
Wie gesagt, habe diesen Parameter ja offen gelassen und bei mir kommt false. Also kann es eigentlich nur daran liegen.
-
Dann bekomme ich ein:
"DialogBox kann in diesem Kontext nicht verwendet werden. Es muss ein Dokument ausgewählt werden."
Ich dachte auch das Doc ist optional... ???
Vielleicht nochmal kurz zum Aufruf:
Ich habe eine Ticketmaske. Will ich das Ticket jemandem zuweisen, drücke ich auf einen Knopf und dann soll die Dialogbox aufgehen.
-
OK,ich hatte den Code innerhalbs einer geöffneten Maske ausgeführt, sonst kommt die Meldung mit dem Kontext.
Ist diese Ticketmaske geöffnet?
-
Ja, zuweisen geht nur über das Ticket, welches im Bearbeitungsmodus ist
-
Dann verstehe ich das mit der Kontextmeldung nicht. Die kam bei mir auch, als ich den Code aus einer Ansicht heraus starten wollte, weil ich nicht dran gedacht habe.
Kannst du die .ntf hochladen?
-
auch wenn ich jetzt alles über den Haufen werfe, was hier bisher diskutiert wurde, aber ist die While- Schleife nicht in Wirklichkeit zu spät ?
Ich würde es so lösen, dass sich die Dialogbox beim Klick auf das X schlicht und ergreifend nicht schliesst.
Das ist ganz einfach...
Dein OK- Button / Dein Abbrechen- Button:
irgendwo in die Formel ein @Environment( "Knopf_Gedrueckt" ; "1" ) (oder ses.SetEnvironmentVar( ) in Script.
Dann im QueryClose der Dialog- Maske:
Dim ses as New NotesSession
Dim cont as String
cont = ses.GetEnvironmentString( "Knopf_Gedrueckt" )
call ses.SetEnvironmentVar( "Knopf_Gedrueckt" , "" )
if cont <> "1" then
continue = False
end if
und aus die Maus: die Maske lässt sich nur noch über die Buttons schliessen, das "x" hat keinerlei Auswirkungen mehr (genausowenig wie die Taste Esc übrigens, das wäre nämlich das nächste gewesen, wenn Du es geschafft hättest, das x auszublenden...)
HTH
Tode
-
Hallo Tode,
inwiefern ist die Schleife zu spät? Also, bei mir funzt. Die Dialogbox flackert kurz und ist wieder da.
Gruß
Demian
-
Hi,
eine weitere Möglichkeit wäre das Auswerten der "DialogBoxCanceled" Eigenschaft des UiDocuments.
Wobei Du dann auch sicherstellen musst, dass einer Deiner Buttons vom Typ "OK" die Dialogbox wirklich schließt.
Im QueryClose der DialogMaske:
If source.DialogBoxCanceled Then
Msgbox |Bitte schließen Sie den Dialog über "OK" ab|
continue = False
End If
-
Ich komm ja fast nicht hinterher :D
Das mit "DialogBoxCanceled" finde ich noch besser, als über die Umgebungsvariable.
Ich habe zwar schon mit der Umgebungsvariable gearbeitet, aber mir fehlt da noch ein wenig Erfahrung, was schief gehen KÖNNTE oder in welche Messer ich laufen könnte. Was sind da die Nachteile, mir fallen keine WIRKLICHEN Nachteile ein...?
Ich habe in der Dialogbox insgesamt 3 Knöpfe, wobei einer ein OK-Knopf ist und der schließt die Box auch.
Das werde ich jedenfalls beides mal einbauen!
Vielen Dank erstmal dafür.
-
ja, aber Du machst die Dialogbox zu und wieder auf. Daher das flackern...
Du behebst also nicht den "Eingabefehler" (x gedrückt oder Esc), sondern die Auswirkung.
Ich persönlich behebe den Fehler lieber dort wo er passiert...
Nur gesetzt den Fall, du möchtest die Dialogbox jetzt auch aus einem Formel- Agenten aufrufen könenn, dann musst Du Dir hier wieder einen eigenen Mechanismus zum Re-Open ausdenken und den implementieren.
Oder anders gesagt: Wo auch immer im Code du die Dialogbox aufrufen willst, musst Du wieder die "Widerholbedingung" mitprogrammieren.
Wenn das schliessen des Dialogs aber schon dort verhindert wird, wo es nicht passieren soll, dann musst Du Dir beim Aufruf wenigstens darüber keine Sorge mehr machen...
mal ganz abgesehen von der Möglichkeit, dass bei Deiner Lösung Eingaben verloren gehen können und Berechnungen (z.B. berechnet zur Anzeige Felder mit Lookups) bei jedem reopen aufs neue gemacht werden....
Aber es ist natürlich jedem selbst überlassen, wie man das implementiert...
Ich machs halt so wie beschrieben...
Gruß
Tode