Autor Thema: Bei Enter eine Funktion ausführen  (Gelesen 5246 mal)

Offline rar

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 856
  • Geschlecht: Männlich
  • Des passt scho
    • click
Bei Enter eine Funktion ausführen
« am: 02.04.07 - 15:31:34 »
Hallo Leute,
wir haben in unserem Portal eine Funktion "Datenbank suchen" eingebaut.

Um eine DB zu suchen muss man einem Textfeld (Stil = Betriebssystem) einen Begriff eingeben und anschließend auf den danebenliegenden Hotspot klicken. Das funktioniert auch recht gut.

Jetzt habe ich aber das Problem, dass der User den Cursor in das Feld setzt, seinen Suchbegriff eingibt und dann intiutiv durch die Entertaste die Suche starten möchte. Das hat aber zur Folge, dass ein Zeilenumbruch ins Feld geschrieben wird. Dadurch sieht man den eingegeben Wert nicht mehr und zusätzlich wird ein Scrollbalken angezeigt, da das Feld ja einzeilig ist.

Hat jemand eine Idee, wie ich durch das drücken der Entertaste meine Suchfunktion anwerfen könnte?
« Letzte Änderung: 03.04.07 - 15:40:41 von rar »
†090620141300

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Bei Enter eine Funktion ausführen
« Antwort #1 am: 02.04.07 - 15:47:28 »
Moin,moin,

vielleicht hilft dir das weiter.


Gruß
Demian
Gruß
Demian

botschi

  • Gast
Re: Bei Enter eine Funktion ausführen
« Antwort #2 am: 02.04.07 - 15:58:02 »
Wenn Du für die "Suche" eine eigene Maske mit dem Knopf hast, kannst Du diese als Dialogbox anzeigen, der User gibt dort seinen Wert ein und drückt ENTER.

Der Knopf in der Maske ist definiert als "OK". So wird der Knopf "ausgeführt", wenn der User ENTER drückt, Dein Script läuft los und die Dialogbox schliesst sich.

Vielleicht mit Kanonen auf Spatzen geballert, aber für spätere Anforderungen auch ausbaufähig (wenn die Suche über mehrere Werte erfolgen soll).

Matthias

Offline rar

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 856
  • Geschlecht: Männlich
  • Des passt scho
    • click
Re: Bei Enter eine Funktion ausführen
« Antwort #3 am: 02.04.07 - 16:36:15 »
Danke euch für die Antworten  :)

Das mit der Dialogbox (bzw. eine einfache Inputbox) würde schon gehen. Nur mir gefällt das eine Feld halt schon recht gut so wie es ist. Wenn ich keine andere Lösung finde, werd ich es früher oder später umbauen müssen.

@Demian,
danke für den Link, aber irgendwie werde ich daraus nicht so ganz schlau... wie sollte man das starten, bzw. würde das Script die ganze zeit im Hintergrund laufen?
†090620141300

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Bei Enter eine Funktion ausführen
« Antwort #4 am: 02.04.07 - 16:46:54 »
Moin,moin,

habe mir das gar nicht so genau betrachtet. Habe nur gegoogelt nach Tasten abfangen API. Müsste ich mir heute abend zu Hause mal ansehen. Habe zu Hause auch noch ein Excel-Buch wo auch ne API Funktion zum Tasten abfangen drin war.

Melde mich später.

Gruß
Demian
« Letzte Änderung: 02.04.07 - 16:50:19 von Demian »
Gruß
Demian

botschi

  • Gast
Re: Bei Enter eine Funktion ausführen
« Antwort #5 am: 02.04.07 - 16:54:51 »
Sowas wurde bei uns eigentlich immer abgelehnt, weil Notes kein Tastaturtreiber ist und auch keiner sein soll...  ;D

Der Aufwand rechtfertigt den Nutzen in den seltensten Fällen.

Matthias

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Bei Enter eine Funktion ausführen
« Antwort #6 am: 02.04.07 - 17:38:49 »
naja, aber API-Funktionen wie Blockinput und dergleichen sind nicht sonderlich aufwendig aber äußerst praktisch, z.B. bei automatischer Brieferstellung.

edit:
Also, ich wollte eben eine gefundene API umsetzen und musste mit Entsetzen feststellen, dass das onchange-Ereignis nicht bei jeder Änderung des Feldes sondern erst nach Änderung + Verlassen des Feldes ausgeführt wird. LAut Hilfe soll das auch noch so sein...  ::)

In Office wird das change-Ereignis für Felder bei jeder Änderung innerhalb des Feldes ausgeführt, was meines Erachtens auch Sinn macht. Dann funktioniert folgender Code:

Code
'Deklarationen-Teil des Feldes
Public Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer
Public Declare Function GetAsyncKeyState Lib "user32.dll" ( ByVal vKey As Long) As Integer

'Abzufragende Taste
Public Const Enter As Long = "13"

'Change-Ereignis des Feldes
If CBool(GetAsyncKeyState(Enter) And &H8000) Then MsgBox ("Die Enter-Taste wurde gedrückt.")

Aber ohne das passende Ereignis in Notes wirds schwierig...

Gruß
Demian
« Letzte Änderung: 02.04.07 - 20:02:06 von Demian »
Gruß
Demian

Offline rar

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 856
  • Geschlecht: Männlich
  • Des passt scho
    • click
Re: Bei Enter eine Funktion ausführen
« Antwort #7 am: 03.04.07 - 10:13:48 »
Vielen Dank für eure Mühen.
Langsam glaube ich auch nicht mehr, dass es irgendwie geht.
Es wird echt darauf raus laufen, dass ich das Feld lösche und mit einer Inputbox arbeite.

lG
-Daniel
†090620141300

Offline it898ur

  • Senior Mitglied
  • ****
  • Beiträge: 478
Re: Bei Enter eine Funktion ausführen
« Antwort #8 am: 03.04.07 - 12:48:46 »
Hallo,

die Quelle kann ich nicht mehr nennen, aber mir ist mal dieser Code über den Weg gelaufen:

' Der Code basiert auf einer Mischung aus JavaScript und LotusScript

' Im Ereignis 'JS-Kopfzeilen' ==> es wird immer das erste Feld geprüft:
        var newline = String.fromCharCode(10);
        var activ;

        function myalert()
             {
                if (document.forms[0].Input.value.indexOf(newline)>=0)
                {
                    document.forms[0].SaveOptions="0";
                    window.clearInterval(activ);
          window.close();
                }
            }

' Im Ereignis 'OnLoad':
                 activ = window.setInterval("myalert()",1);

' Im Ereignis 'OnUnload':
                 window.clearInterval(activ);

' Im Ereignis 'QueryClose':
   If source.fieldgettext("Feldname") <> "" Then
      Msgbox "Hier kommt der Code"
      continue = False
   End If

Das sollte funktionieren, wenn das Suchfeld in einer eigenen Maske im Frameset gezeigt wird. Der Suchcode muss dann in das Ereignis "QueryClose" (da das JS die Maske schließt, wenn ein Enter eingegeben wird).

Funktioniert allerdings nur wen JavaScript im Notes-Client aktiviert ist (aber wer deaktiviert das schon ?)

Gruß

André

Offline jo@chim

  • Aktives Mitglied
  • ***
  • Beiträge: 246
  • Geschlecht: Männlich
Re: Bei Enter eine Funktion ausführen
« Antwort #9 am: 03.04.07 - 13:49:04 »
Ah ja, das hab ich auch schon gesehen. Ich habe mal daraus einen "LS-per-Javascript-Enter-Starter" gebastelt, der das Problem lösen dürfte:

Im JS-Header der Maske:
Code
var newline = String.fromCharCode(10);
var ssactive;
var fname = new Array( "fldSuche");
var fnum = 0;
var fcount = fname.length - 1;

function StartScriptOnEnter() {
if (document.forms[0][fname[fnum]].value.indexOf(newline)>=0) {
document.forms[0][fname[fnum]].value = document.forms[0][fname[fnum]].value.replace(String.fromCharCode(10), '');
fnum = (fnum >= fcount) ? 0 : (fnum + 1);
document.forms[0][fname[fnum]].focus();
document.forms[0].ScriptStarterButton.click();
}
}

Im OnLoad:
Code
ssactive = window.setInterval("StartScriptOnEnter()",1); 

Im OnUnload:
Code
window.clearInterval(ssactive);

Das Eingabefeld in der Maske (Javascript muss natürlich aktiviert sein) heisst im gegebenen Fall fldSuche.

Desweiteren brauchts noch einen Button namens ScriptStarterButton irgendwo im Dokument (kann man auch verstecken). Mit dem Namen ist nicht  die Beschriftung des Buttons, sondern dessen HTML-Name (in den HTML-Eigenschaften) gemeint.

In den Button kann man beliebigen LS- oder Formel-Code setzen und durch Betätigung der Eingabetaste starten, wenn das Feld "fldSuche" den Fokus hat.

(only short tested no warranty undsoweiter  ;))
Gruss,
Achim
-------------------
IBM Certified Advanced Application Developer Lotus Notes and Domino 7

Offline rar

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 856
  • Geschlecht: Männlich
  • Des passt scho
    • click
Re: Bei Enter eine Funktion ausführen
« Antwort #10 am: 03.04.07 - 15:37:45 »
Wenn das nicht cool ist  :o

Vielen Dank für die Tipps  :D

Ich glaube aber nicht, dass dieser Lösungsvorschlag in meinem Fall so ganz optimal ist. Die Maske wird beim Start von Notes geöffnet und erst dann geschlossen wenn Notes auch geschlossen wird. Das heißt, dass die Function den ganzen Tag über jede Millisekunde aufgerufen wird. Ist für die Performance eher suboptimal.
Ich habe es jetzt mit der Inputbox menacht und unseren Organisatoren ist die Lösung auch recht.

Aber die Idee ist echt der Hammer und ich habe sie mir schon weggespeichert.  ;D

lG
-daniel

†090620141300

Offline Hevelmann

  • Frischling
  • *
  • Beiträge: 43
  • Geschlecht: Männlich
Re: Bei Enter eine Funktion ausführen
« Antwort #11 am: 22.06.07 - 15:49:21 »
genau sowas hab ich gesucht, die js Funktion ist echt lecker.  :o

Ich hab das ganze noch etwas umgestrickt, damit das js nicht ständig läuft.

ich habe den Startaufruf des Intervalls in den onFocus Event meines Suchfeldes geschrieben und den Aufruf zum Beenden des Intervalls in den onBlur Event.

zusätzliches habe ich noch ein Feld (FldEndScript) in meine Maske eingebaut. Im oben genannten Button habe ich folgende LS Funktion eingebaut:

Code

Sub Click(Source As Button)
	Dim uiWorkspace As New NotesUIWorkspace
	Dim uiDocument As NotesUIDocument
	Set uiDocument = uiWorkspace.CurrentDocument
	...
	...
	Call uiDocument.GotoField ( "FldEndScript" )
End Sub


Dadurch startet beim Klicken in das Suchfeld das Skript und am Ende des Skripts im Button springt der Zeiger in das andere Feld und der onBlur Event des Suchfeldes greift und beendet das js.

Einzigster kleiner Nachteil, das zusätzliche Feld darf nicht hidden sein.

greetz Hevelmann

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz