DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

ReDim eines Arrays in einem Objekt

Hallo,
ich versuche gerade ein Objekt aus einem Script an einen SUD-Dialog zu übergeben. Dies Funktioniert soweit auch. Das Übergabeobjekt "oData" enthält mehrere Arrays (zur Zeit System und Valve). Die Dimension dieser kenne ich teilweise vorab aber noch nicht, da eine TDM-Datei mit einem Textkanal die Elemente enthält.
Kann ich mit ReDim die Größe des dynamischen Datenfeld nach dem anlegen (und dem Laden der Parameterdatei)  irgendwie ändern? Bekomme leider immer eine Fehlermeldung.
Nachfolgen der bisherige Code:

Option Explicit
Dim temp
Call DataDelAll()
DataFile = "VSD-Parameter.TDM"

Call DataFileLoad(DataFile)                         ' Parameterdatei

If Not ItemInfoGet("oData") Then
   Call GlobalDim("oData")
End If

temp = ChnPropValGet("[1]/Systeme", "length")       ' Kanallänge = gewünschte Größe vom Array
Set oData = New cData                               ' Objekt anlegen
'ReDim oData.System(temp)                           ' funktioniert so leider nicht
For i = 1 to ChnPropValGet("[1]/Systeme", "length") ' Daten aus Kanal in Array übertragen
  oData.System(i-1) = ChT(i, "[1]/Systeme")
Next
Call SudDlgShow("Dlg1","TestSUD.sud",oData)         ' Dialog anzeigen

Class cData                                         ' Klasse
  Dim Valve(12)                                     ' feste Größe
  Dim System(4)                                     ' mit fester Größe funktioniert es
  'Dim System()                                      ' so leider nicht
End Class


Vielen Dank schon mal
Markus

0 Kudos
Message 1 of 3
(4,142 Views)

Hallo Markus!

Das grundsätzliche Problem liegt wohl darin das der ReDim Befehl nur direkt auf eine Variable funktioniert. Etwas in der Art ReDim oMyObject.avMyArray(10) geht deshalb nicht (egal ob SUD oder nicht).

Was ist nun die Lösung? Da gibt es zwei Möglichkeiten:

1. Man kann der Klasse eine Methode geben, bei dir z.B.:

Class cData                                         ' Klasse
  Dim Valve(12)                                     ' feste Größe
  Dim System()
 
  Public Sub ReDimSystem(ByRef nCount)
    Redim System(nCount)
  End Sub
End Class

und diese dann im SUD aufrufen.

2. Etwas einfacher und IMHO besser lesbar ist es einfach im SUD ein lokales Array anzulegen und dieses via ReDim auf die richtige Größe bringen. Zum Schluss wird es dann einfach der Variable in der Klasse zugewiesen. Diese muss dann nur ohne (), also als 'normale' Variable deklariert sein.

Matthias



Message Edited by Twigeater on 03-02-2008 08:53 AM
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 2 of 3
(4,136 Views)
Hallo Matthias,
vielen Dank für deine Tips. Mit Lösung 1 funkttioniert es genau so wie ich es haben möchte. Hatten uns zwar etwas falsch verstanden, da ich die Festlegung der Größe im Script nach dem anlegegen des Objekts ändern möchte und nicht erst im SUD, aber egal.
Der Vollständigkeit wegen hier noch mal der komplette Code:

Option Explicit  'Erzwingt die explizite Deklaration aller Variablen in einem Skript.
Call DataDelAll()

DataFile = "VSD-Parameter.TDM"
Call DataFileLoad(DataFile)                         ' Parameterdatei

If Not ItemInfoGet("oData") Then
   Call GlobalDim("oData")
End If
Dim i

Set oData = New cData                               ' Objekt anlegen
oData.ReDimSystem(ChnPropValGet("[1]/Systeme", "length"))     ' Größe entsprechend der Kanallänge anlegen, dazu Methode deS Objekts aufrufen

For i = 1 to ChnPropValGet("[1]/Systeme", "length") ' Daten aus Kanal in Array übertragen
  oData.System(i-1) = ChT(i, "[1]/Systeme")
Next
...
..
.

Class cData                                         ' Klasse
  Dim Valve(12)                                     ' feste Größe
  Dim System()                                      ' Variable Größe

  Public Sub ReDimSystem(ByRef nCount)              ' Funktion innerhalb der Klasse um Größe des Array anzupassen
    Redim System(nCount)
  End Sub
End Class

Nochmals danke.
Gruß Markus

0 Kudos
Message 3 of 3
(4,105 Views)