INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Focus-Problem



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

18.05.2006, 09:34 (Dieser Beitrag wurde zuletzt bearbeitet: 25.05.2006 17:59 von Dennis.Moser.)
Beitrag #1

suamikim Offline
LVF-Grünschnabel
*


Beiträge: 27
Registriert seit: Feb 2006

2009
2006
de

4060
Oesterreich
Focus-Problem
Hallo zusammen!

Ich arbeite gerade zum 1. mal mit LabVIEW und bin mit meinem Programm beinahe fertig, allerdings bin ich gerade auf ein Problem gestossen, welches ich alleine wahrscheinlich nicht lösen kann:

Um das ganze ein wenig besser erklären zu können habe ich mal einen Screenshot angehängt:

   
Folgendes Problem:

Die ganzen Zeigerelemente (und auch Knöpfe usw.) im unteren Bereich werden in einer 10-ms-timed-loop ständig aktualisiert (lesen FieldPoint-Werte aus). Mein Problem ist nun, das ich in die markierten numerischen Eingabefelder oben nichts schreiben kann, da sie den Focus im selben Moment wieder verlieren, in dem ich mit der Maus darauf klicke um etwas hineinzuschreiben.

Ich geh mal davon aus, dass dieses Verhalten auftritt, weil sich die unteren Anzeigeelemente bei jeder Aktualisierung den Focus holen. Gehe ich richtig in der Annahme und was könnte ich dagegen machen?

danke, mfg mike

ps.: Ich komme aus der objektorientierten Programmierung und musste dieses Programm mit LabVIEW-Wissen=0 in relativ kurzer Zeit "aus dem Ärmel schütteln", was dazu geführt hat, dass ich mich vor Beginn nicht ausreichend mit den Programmier-Paradigmen der flussgesteuerten Programmierung auseinandersetzen konnte.
Mittlerweile hab ich aber mitbekommen (auch über das Forum hier), dass die Art und Weise, wie ich dieses Programm "gebastelt" habe wahrscheinlich gegen alle Regeln verstößt, die es so gibt (lokale Variablen, Code zu wenig ausgelagert, also beinahe alles in einem riesigen VI, viele Sequenzen und Eventstrukturen, ...).

Hat zwar nicht direkt mit meinem Problem zu tun, aber ich will nur, dass ihr Bescheid wisst, bevor ihr vielleicht einen Code-Auszug sehen wolltWink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
18.05.2006, 14:49
Beitrag #2

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Focus-Problem
Zunächst meinen herzlichen Glückwunsch zu diesem VI mit einem so professionellem Aussehen. Es ist kaum zu glauben, daß Du LabVIEW-Anfänger bist. Und sei nicht so bescheiden, es wird wohl auch der dahinterligende Code nicht so schlecht sein wie Du uns hier glauben machen willst.
Tja, ich kenne LabVIEW schon seit etlichen Jahren, aber so ein Problem ist mir noch nicht untergekommen. Ich stochere also selbst im Nebel. Auf alle Fälle würde ich folgendes checken:
a) Der Focus kann auf die Anzeigen nur gerichtet werden, wenn sie nicht als Anzeigen, sondern als Bedienelemete konfiguriert sind. Das könnte möglich sein und man sieht das den Anzeigen nicht an. Es funktioniert auch alles, die interne Wertzuweisung würde dann über lokale Variablen erfolgen. Also checken und gegebenenfalls ändern.
b) Der Focus kann auch über Eigenschaftsknoten zugewiesen werden. Hast Du solche Eigenschafstknoten im Programm, vielleicht unwissentlich, verwendet? (Es gibt die beiden den Focus betreffenden Eigenschaften "Bei Tab überspringen" und "Focus")
c) Bearbeiten/Tabulatorreihenfolge im Hauptmenü anwählen: Hier siehst Du mit einem Blick, auf welche Bedienelemente überhaupt focussiert werden kann. Über Eigenschaften/Tastatursteuerung kann man den Focus auch abwählen (Gilt für Tastatursteuerung, nicht für die Maus)
d) Es kommt vereinzelt zu Irregularitäten bei der Bedienung, wenn in den Warteschleifen kein Timer enthalten ist. Test mit Windows Taskmanager/Systemleistung. Wenn LabVIEW im Leerlauf 100% Systemleistung braucht, dann fehlen solche Timer.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.05.2006, 08:55 (Dieser Beitrag wurde zuletzt bearbeitet: 25.05.2006 17:58 von Dennis.Moser.)
Beitrag #3

suamikim Offline
LVF-Grünschnabel
*


Beiträge: 27
Registriert seit: Feb 2006

2009
2006
de

4060
Oesterreich
Focus-Problem
<div align="left">Hallo Lucki,

vielen Dank erstmal für die Antwort und das LobWink

' schrieb:a) Der Focus kann auf die Anzeigen nur gerichtet werden, wenn sie nicht als Anzeigen, sondern als Bedienelemete konfiguriert sind. Das könnte möglich sein und man sieht das den Anzeigen nicht an. Es funktioniert auch alles, die interne Wertzuweisung würde dann über lokale Variablen erfolgen. Also checken und gegebenenfalls ändern.
Die Anzeigen sind alle wirklich nur Anzeigen (Indicator, weil englische Installation) und die Zuweisung erfolgt eigentlich direkt über das entsprechende Terminal (also nicht über lokale Variablen).

Zitat:B) Der Focus kann auch über Eigenschaftsknoten zugewiesen werden. Hast Du solche Eigenschafstknoten im Programm, vielleicht unwissentlich, verwendet? (Es gibt die beiden den Focus betreffenden Eigenschaften "Bei Tab überspringen" und "Focus")
Ich benutze mehrere "Property nodes", allerdings nie für die von dir genannten Eigenschaften "Bei Tab überspringen" oder "Focus".

Zitat:c) Bearbeiten/Tabulatorreihenfolge im Hauptmenü anwählen: Hier siehst Du mit einem Blick, auf welche Bedienelemente überhaupt focussiert werden kann. Über Eigenschaften/Tastatursteuerung kann man den Focus auch abwählen (Gilt für Tastatursteuerung, nicht für die Maus)
Ok, hab ich mir angesehen. Die von mir verdächtigten Anzeigen bekommen alle keinen Fokus, allerdings ist mir aufgefallen, dass einige Controls, die eigentlich unsichtbar sind eine Nr. besitzen. Sollte ja eigentlich kein Problem sein (denke mal nicht, dass es sich hierbei um einen Bug handelt, sondern es so gewollt ist) kommt mir aber ein wenig unlogisch vor ...

Tab-Reihenfolge
   
Zitat:d) Es kommt vereinzelt zu Irregularitäten bei der Bedienung, wenn in den Warteschleifen kein Timer enthalten ist. Test mit Windows Taskmanager/Systemleistung. Wenn LabVIEW im Leerlauf 100% Systemleistung braucht, dann fehlen solche Timer.
Bei der Ausführung des VI's fällt mir kein besonderes hoher Ressourcen-Verbrauch auf (weder was CPU-, noch was Speicher-Auslastung betrifft).

Habe übrigens eine neue Vermutung, was an meinem Problem Schuld sein könnte:

Meine Hauptschleife (10-ms-timed-loop) besteht aus einer Sequenz mit insgesamt 8 Frames, wobei in den 1. 7 Frames die einzelnen FieldPoint-Module (bzw. Kanäle) nacheinander ausgelesen werden (*1). Das 8. Frame besteht wiederum aus einer Sequenz mit 3 Frames (1. mögliche Fehlerbehandlung, 2. speichert aktuelle Werte in Datei, 3. überprüft Verbindungs-Status (nur bei Verbindungs-Aufbau)).

Im 2. Frame wird wie erwähnt die aktuellen Werte in eine Protokoll-Datei geschrieben, was ich folgendermaßen gelöst habe:

Das schreiben übernimmt ein von mir geschriebenes Sub-VI, welches ich allerdings aus unterschiedlichen Programmteilen heraus aufrufen muss (also nicht nur aus der oben beschriebenen Hauptschleife), deshalb hab ich ein unsichtbares Boolsches Steuerelement ("Write Status") erstellt, von dem ich das Value-Changed-Ereigniss in einer eigenen Schleife abfange und darin die Sub-VI aufrufe (*2):

   

Der Aufruf dieses Events sieht zB. in meiner Hauptschleife (8. und letztes Frame) folgendermaßen aus:

   

Das Description-Property setzte ich aus folgendem Grund:

Der Sub-VI-Aufruf verlangt eine bestimmte Status-Nr, anhand welcher es zB. entscheidet, ob in der Protokoll-Datei alle Werte oder nur der übergebenen Status-Text gespeichert werden soll (es gibt noch mehrere Details, die diese Status-Nr. ausssagt, welche aber hier irrelevant sind).

Kann es nun sein, dass dieser Aufruf der beinahe alle 10 ms stattfindet, schuld dafür ist, dass meinem Eingabeelement ständig der Focus "geraubt" wird und wie könnte ich das umgehen ohne die ganze Programmstruktur über den Haufen werfen zu müssen?

danke, mfg mike

ps.: Ich hab hier noch ein paar prinzipielle Fragen zur Programmstruktur gestellt, auf welche ich allerdings nicht unbedingt eine Antwort erwarte, mich aber trotzdem darüber freuen würde (kann ja nicht verlangen, dass ich hier in Grundlegende Dinge der LabVIEW-Programmierung eingeführt werdeWink

pps.: Kann leider Momentan nicht testen, da mir meine FieldPoint-Module "etnwendet" wurden und ich erst warten muss, neue zu bekommen, deshalb kann ich auch nur Vermutungen anstellen, ...

Off topic (prinzipielle Fragen, feststellungen):

*1: Prinzipiell widerspricht eine Sequenz ja schonmal dem Flussgesteuerten Konzept, oder liege ich da falsch? Ich benutze diese allerdings sehr häufig, da ich wie hier zB. die Fehlerbehandlung so leichter steuern kann...).

*2: Auch hier geh ich mal davon aus, dass ich die Ereigniss-Struktur ziemlich "missbrauche" und das ganze bestimmt eleganter lösen könnte. Wie man im Screenshot der Ereignis-Struktur sieht bin ich spätestens hier mehr oder weniger "gezwungen" lokale Varialben zu verwenden.
Generell benutze ich sehr viele Ereignis-Strukturen (zB. bei jedem Button, um die entsprechende Aufgabe abzuarbeiten, ...), was ja wiederum nicht sehr Flussgesteuert ist, hab aber leider keine Ahnung, wie ich die Benutzer-Eingaben sonst abfangen könnte, ...</div>
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.12.2006, 11:50 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2006 11:53 von suamikim.)
Beitrag #4

suamikim Offline
LVF-Grünschnabel
*


Beiträge: 27
Registriert seit: Feb 2006

2009
2006
de

4060
Oesterreich
Focus-Problem
Hallo zusammen!

Sorry, dass ich den Thread jetzt wieder aus der Versenkung hole, aber mein Problem ist noch immer vorhanden :angry2:(war ja auch nie weg, hab mich nur in der Zwischenzeit "wichtigeren" Dingen gewidmet und das ganze hinten angestelltWink

@Lucki
Nachdem du damals ja ein Problem mit dem posten hattest poste ich hier einfach mal deine PN, damit wir besser diskutieren könnenWink

' schrieb:Ich kann keinen Beitrag im Forum absenden, irgendetwas funktioniert nicht. Versuche es mal so

' schrieb:Hallo Lucki,

Die Anzeigen sind alle wirklich nur Anzeigen (Indicator, weil englische Installation) und die Zuweisung erfolgt eigentlich direkt über das entsprechende Terminal (also nicht über lokale Variablen).
Hier war ich etwas konfus. Wenn es Anzeigen sind, dann braucht Du selbstverständlich keine lokale Variablen zur programmgesteuerten Zuweisung eines Wertes. Andererseits ist ebenfalls klar, daß Du das Element nicht bedienen kannst und daß es deshalb auch keinen Fokus zugewiesen bekommt.
Also so wird eine Schuh draus: Elemente als Bedienelemente konfigurieren, dann gibt es keine Probleme mit Bedienung und Fokus. Und wenn Du außerdem dem Bedienelement vom Programm her Werte zuweisen willst - was möglich ist - dann mußt Du entweder eine lokale Verianle verwenden, oder, was auf dasselbe hinausläuft, den Eigenschaftsknoten "Wert".
Entschuldige, im Moment habe ich keine Zeit Dein Posting vollständig zu lesen, ich melde mich vielleicht morgen noch mal.

Irgendwie sind wir da wohl beide ein wenig mit den Anzeigen/Bedienelementen (bzw. Inidcators/Controls) durcheinander geratenWink
Bei den Elementen handelt es sich um Controls (Bedienelemente), dh. sie sind auf jeden Fall bedienbar und die neuen Werte weise ich über lokale Variablen zu.

Mittlerweile konnte ich das Problem auf jeden Fall ziemlich genau eingrenzen (der folgende Beispielcode ist aus einer anderen, etwas "kleineren" Anwendung, als der zu Beginn des Thread diskutierten, allerdings ist die Abarbeitung des ganzen bei beiden ziemlich ähnlich):

Im Prinzip hab ich 3 Schleifen:[list]
[*]1 Hauptschleife (nennen wir sie im folgenden main-loop), bei welcher es sich um eine 100-ms-Timed-Loop handelt. Diese beinhaltet eine Sequenz, wobei bei der letzten Frame über das Value-Changed-Ereigniss der boolschen Variable "Write status" das schreiben der aktuellen Werte in eine Protokoll-Datei auslöst (Screenshot 1 bzw. 2).
<>
[*]2 normale While-Schleifen, welche lediglich mehrere Events abfangen. In der 2. Schleife (nennen wir sie event-loop) wird ua. auch das "Write status"-Value-Changed-Event abgefangen (Screenshot 3) und ein Sub-VI aufgerufen, welches wiederum die aktuellen Werte in die Protokoll-Datei schreibt<>
[st]Nach ein wenig testen hab ich jetzt festgestellt, dass (wie früher schon mal vermutet) das ständige Aufrufen des "Write status"-Value-Changed-Events die Ursache für den Fokus-Verlust darstellt.
Wenn ich, wie in Screenshot 1 abgebildet das Value-Changed-Event niemals aufrufe, kann ich alle Elemente ohne Fokus-Verlust bedienen. Sobald ich aber das Event wieder aufrufe (Screenshot 2) verlieren meine Bedienelemente nach kürzester Zeit den Fokus wieder und sind unbedienbar (dh. man kann über die Up-/Down-Buttons mit der Maus die Werte noch ändern, nicht jedoch über die Tastatur).

Screenshot 1 (main-loop)
   

Screenshot2 (main-loop)
   

Screenshot 3 (event-loop, Abarbeitung des "Write status"-Value-Changed-Event)
   

Das Problem wird also entweder sein, dass ich im Event über lokale Variablen den aktuellen Wert der Bedienelemente abfrage, oder aber das ich ein Sub-VI aufrufe. Wie könnte ich dieses Problem lösen? Hab leider keine Ahnung...

danke, mfg
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  letztes Element wieder fokusieren nach Fenster lost focus TpunktN 2 2.081 28.11.2022 11:31
Letzter Beitrag: TpunktN
  Maustaste in Ereignisstruktur abfragen / Bedienelement verliert Tastatur-Focus Horst 1 3.079 25.07.2019 12:31
Letzter Beitrag: Horst
  Key Focus ändern TDO 7 5.409 30.09.2015 07:37
Letzter Beitrag: TDO
  "On Focus"-Event Lupin 8 7.224 19.01.2011 07:56
Letzter Beitrag: NWOmason

Gehe zu: