DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

SUD-Dialog Variablen-Rückgabe

Hallo NI'ler,
 
ich erstelle gerade meinen ersten SUD-Dialog mit 5 CheckBoxen. Je nach dem, welche Box nun aktiviert wurde, soll eine Variable einen anderen Wert zugewiesen bekommen. Mein bisheriger Ansatz war
 
Sub CheckBox1_EventChange()
Dim This : Set This = CheckBox1
 checkbox1.RunChange
 L1 = 1
 checkbox2.Value = 0
 ...
End Sub
 
Im VBS-Script sollte dann per "msgbox" der entsprechende Wert von L1 ausgegeben werden. Egal, welche der Boxen aktiviert wird, erhalte ich "0" als Rückgabewert. Könnte mir bitte jemand die korrekte vorgehensweise erklären?
 
Danke!
Björn

Message Edited by bk220 on 11-02-2007 09:38 AM

0 Kudos
Message 1 of 9
(4,460 Views)
Hallo Björn!
 
Schau mir mal diesen Thread an. Vielleicht hilft auch dir das angehängte Beispiel weiter.
 
Was mir bei deinem Code auffält ist der Aufruf von 'RunChange' für das Control in dessen EventChange Ereignis du bist. Wäre das nicht intern abgefangen würde das zu einer Endlosschleife führen und ist überflüssig. Warum L1 nicht gesetzt wird erkenne ich nicht, liegt aber u.U. an anderen Dingen im Dialog. Kannst du bitte, wenn mein Beipsiel nicht reichen sollte, mal deinen Dialog+Script anhängen.
 
Matthias
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 2 of 9
(4,448 Views)
Hallo Mattthias,
 
vielen Dank für die Antwort.
 
Den verlinkten Thread hatte ich mir bei meiner Suche schon angesehen. Hat mir aber nicht ganz bei meinem Problem geholfen.
 
 
Anbei mal mein Dialog, momentan rufe ich ihn lediglich in einem Testscript auf:
 
Call SUDDlgShow( "Dlg1", "EKP_fzgabfrage.sud")
msgbox (L1)
msgbox (B1)
msgbox (B2)
 
 
"RunChange" habe ich wg folgendem Phänomen eingebaut: Ich klicke auf Kästchen 1 -> Häckchen wird gesetzt. Dann klicke ich auf Kästchen 2 -> Kästchen 1 wird deaktiviert, Kästchen 2 aber nicht aktiviert. D.h. ich muss immer 2x auf die CheckBox klicken. Erst mit "RunChange" hat das nach meinen Vorgaben funktioniert??
 
Gruß
Björn


Message Edited by bk220 on 11-05-2007 01:54 AM
0 Kudos
Message 3 of 9
(4,429 Views)
Hallo Björn!
 
Wenn ich deinen Dialog teste und nacheinander die erste und dann die zweite Checkbox anwähle beendet sich der Dialog und DIAdem (in 10.2)! Die ist meistens ein Zeichen für eine Endlosschleife, die ich ja bei dem RunChange Aufruf erwartet habe. Zusätzlich ist auffällig das allen Chekcboxen in der oberen GroupBox L1 als Variable zugeordnet wurde. Das kann doch nicht gewollt sein, oder? Zusätzlich wird ja auch noch L1 im Script verändert.
 
Was mir nicht klar ist warum du überhaupt Checkboxen verwendest, wenn die Logik dahinter Radio-Buttons nachbilden? Es ist zwar so das Radio-Buttons in SUD in der optischen Gestalbarkeit limitiert sind, wären aber vielleicht trotzdem sinnvoller. Bei den Radio-Button kannst du dann auch L1 als Variable verwenden.
 
Matthias
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 4 of 9
(4,421 Views)

Hallo Matthias,

ich verwende 9.10.2345 SP 2b, da funktioniert der Aufruf problemlos. Im endgültigen Script werden, je nach Wert von L1, die Messkanäle nach einer hinterlegten Funktion umbenannt. Daher wollte ich nicht jeder Checkbox eine einzelne boolsche Variable zuordnen. Dies würde meine Abfrage im Script, um den richtigen Wert zu erhalten, umständlicher machen.

Über die Radio-Buttons habe ich auch schon nachgedacht. Wie du schon schreibst, ist sind die Gestaltungsmöglichkeiten eingeschränkt (z.B. 2-Spalten-Anordnung). Außerdem sollte der Fahrzeug-Dialog beim Start keine Vorbelegung haben. (Ist dabei doch automatisch so, oder?)

Funktioniert mein Dialog bei dir, wenn du den RunChange auskommentierst?

Gruß Björn

 

0 Kudos
Message 5 of 9
(4,419 Views)
Hallo Björn!
 
Die Idee mit L1 kann ich nachvollziehen nur muss für die Checkbox der Variablenwert 0 oder 1 sein, schon bei 2 wird der Tri-State angezeigt den du ja sicher nicht haben willst. Das wirst du auf jeden Fall ändern müssen und z.B. die Zuordnung ganz wegnehmen (ist nicht vorgeschrieben) und die Besetzung von L1 in den Events machen.
 
RunChange hatte ich mal auskommentiert klappte aber immer noch nicht. Hab im Moment nicht die Zeit das genauer zu untersuchen, kann ich aber u.U. heute Abend noch schaffen.
 
Matthias
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 6 of 9
(4,412 Views)
Hallo Björn!
 
Doch noch was Zeit gefundenSmiley Wink
 
Das grundsätzliche Problem bei deinem Code ist das du wechselweise die Werte von Controls in den Change Events änderst. Dazu kurz ein Umweg in die Theorie: Hat man z.B. zwei Checkboxen in einem Dialog so werden bei jeder Änderung die zugehörige EventChange Routine ausgeführt. Eine Änderung kann interaktiv durchen Anwender erfolgen oder aber durch Ändern des Wertes (Value-Eigenschaft) per Skript. Wird nun in der EventChange Routine des ersten CcheckBox der Wert der zweiten Checkbox verändert so wird auch sofort deren EventChange durchlaufen. Beachtet man dies nicht kommt es zu 'seltsamen' Verhalten.
 
Das führte dann bei dir dazu das du einen RunChange Aufruf zur Hilfe nehmen musstes damit es überhaupt irgendwie funktionierte. Mach mal Messageboxen in die Routinen und spiel mal was damit herum.
 
Nun zur Lösung (meine, es gibt da mehrere mögliche Ansätze):
 
Ich würde in jeden EventChange-Routine einen Aufruf in eine globale Routine machen und die notwendigen Werte als Parameter übergeben. Das sieht dann für die ersten beiden CheckBoxen so aus:
Sub CheckBox1_EventChange()
Dim This : Set This = CheckBox1
  Call UpdateCheckBox(1,CheckBox1.Value)
End Sub 
 
Sub CheckBox2_EventChange()
Dim This : Set This = CheckBox2
  Call UpdateCheckBox(2,CheckBox2.Value)
End Sub
Die globale Routine sieht dann so aus:
Public Sub UpdateCheckBox(Byref nNo, Byref nValue)
  If (L1 <> nNo) And (nValue = 1) Then
    ' es hat sich was geändert
    L1 = nNo
  Elseif (L1 = nNo) And (nValue = 0) Then
    ' auch alle AUS zulassen
    L1 = 0
  End If
 
  ' Umwandlung L1 Wert in gecheckte Box
  checkbox1.Value = (L1 = 1)
  checkbox2.Value = (L1 = 2)
  checkbox3.Value = (L1 = 3)
  checkbox4.Value = (L1 = 4)
  checkbox5.Value = (L1 = 5)
  checkbox6.Value = (L1 = 6)
  checkbox7.Value = (L1 = 7)
End Sub
Die richtigen Zustände der Checkboxen werden dort gesammelt aus L1 abgeleitet. Die Logik ist so das auch alle Boxen aus sein dürfen. Die Logik am Anfang verhindert Rekursionen.
 
Ich hoffe das hilft
 
Matthias
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 7 of 9
(4,401 Views)

Hallo Matthias,

erstmal vielen Dank für die ausführliche Hilfe!

Der Vorschlag mit der SUB-Routine ist einfach genial. Durch deinen Ansatz kann ich nun auch meine "L1" - Lösung beibehalten.

Die Schreibweise "checkbox1.Value = (L1 = 1)" war mir so nicht bekannt, was wohl einen Großteil meines Problems ausmachte. Die "Ineinanderschachtelung" der EventChange - Routinen war mir ebenfalls nicht so bewußt, klingt aber nach der theoretischen Erklärung logisch. Komisch nur, dess es bei 9.1 "funktioniert", bei 10.2 dagegen DIAdem komplett runterfährt...

Nochmals Danke!

Gruß Björn

 

 

0 Kudos
Message 8 of 9
(4,395 Views)
Hallo Björn!
 
'Komisch' ist dafür ein euphemistischer Begriff. Kunden finden sowas meistens nicht lustigSmiley Wink. Ich kann mich auch dunkel erinnern das ich das früher schon mal an NI gemeldet hatte und es ausgebaut war.
 
Matthias
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 9 of 9
(4,393 Views)