MsxRead
obj -> MsxRead(int1, var2[, int3]) : int
Nachrichtenkanal lesen
Details
- obj: Deskriptor des Nachrichtenkanals
- int1:
- Nachrichtenbereich:
_MsxMessage_MsxItem_MsxData_MsxEnd
- var2: Inhalt
- int3: Länge (optional)
- Resultat:
intFehlerwert_ErrOKLesen erfolgreich_ErrEndOfDataKeine weiteren Nachrichten (bei_MsxFile)_ErrDataAllgemeiner Datenfehler_ErrSck...Socket-Fehler_ErrFsi...Fehler externe Dateioperationen - Siehe: Verwandte Befehle ,
MsxOpen (),MsxWrite ()
Diese Anweisung liest die verschiedenen Bereiche einer Nachricht. Eine Nachricht kann aus folgenden Bereichen bestehen:
_MsxMessageDamit wird eine neue Nachricht geöffnet. In (var2) muss eine Variable vom Typintübergeben werden, in der Anschließend die Nachrichten-ID steht. Anhand der ID kann ein benutzerdefinierter Nachrichtentyp ermittelt werden. Eine bereits geöffnete Nachricht wird durch diese Operation automatisch geschlossen. Sind keine weiteren Nachrichten vorhanden wird dies über den Rückgabewert der Funktion übermittelt. Dabei werden die Fehlerkonstanten des entsprechenden Mediums verwendet. Bei der Verwendung von Sockets wird_ErrTimeoutzurückgegeben, wenn keine weiteren Daten vorhanden sind und_ErrSckRead, wenn die Verbindung beendet wurde. Falls in einer externen Datei keine weiteren Daten vorhanden sind, ist das Resultat_ErrEndOfData._MsxItemDamit wird ein neues Element geöffnet. In (var2) muss eine Variable vom Typintangegeben werden, in der anschließend die Item-ID steht. Anhand der ID kann ein benutzerdefinierter Elementtyp ermittelt werden. Ein bereits geöffnetes Element wird durch diese Operation automatisch geschlossen, eventuell noch nicht gelesene Daten werden dabei übersprungen._MsxItemkann nur verwendet werden, wenn zuvor eine Nachricht geöffnet wurde. Falls kein weiteres Element mehr vorhanden ist, wird eine Item-ID von0zurückgeliefert, wobei das Funktionsresultat_ErrOkist._MsxDataDamit werden Daten aus einem Element gelesen. In (var2) wird eine Variable des erforderlichen Typs übergeben. Optional kann in (int3) eine maximale Datenlänge angegeben werden, die die Anzahl der in die Variable zu übertragenen Bytes beim Datentypalphabeschränkt. Alle Daten werden seriell gelesen. Dabei müssen nicht zwingend alle Datenfelder ausgelesen werden._MsxDatawird nur bei einem offenen Element verwendet._MsxEndDamit wird die offene Nachricht geschlossen, eventuell noch nicht gelesene Daten oder Elemente werden übersprungen.
Eine Nachricht kann immer nur eine Nachrichten-ID besitzen. Die Nachrichten-ID 0 ist dabei unzulässig. IDs von Items dürfen sich wiederholen. Auch hier ist die ID 0 nicht zulässig. Der eigentliche Nachrichteninhalt befindet sich in einem oder mehreren Datenfeldern pro Item. Beim Lesen von Nachrichten können einzelne Items übersprungen werden. Es wird dann einfach das nächste Item gelesen.
Üblicherweise erfolgt die Auswertung einer Nachricht in einem switch-Konstrukt. Wobei die verschiedenen Abschnitte einzeln verarbeitet werden.
Beispiel:
tMsx # MsxOpen(_MsxSocket | _MsxRead, aHandle);
if (tMsx > 0)
{
try
{
tMsx->MsxRead(_MsxMessage, tMessageID);
tMsx->MsxRead(_MsxItem, tItemID);
while (tItemID > 0)
{
switch (tItemID)
{
case mMsgHeader :
{
tMsx->MsxRead(_MsxData, tSenderName);
...
}
case mMsgAction :
{
tMsx->MsxRead(_MsxData, tAction);
tMsx->MsxRead(_MsxData, tRecordID);
...
}
}
tMsx->MsxRead(_MsxItem, tItemID);
}
tMsx->MsxRead(_MsxEnd, 0);
}
tMsx->MsxClose();
}
Mögliche Laufzeitfehler:
_ErrHdlInvalid: Der übergebene Deskriptor in (obj) ist ungültig._ErrFldType: Die Variable oder das Feld in (var2) hat nicht den passenden Datentyp._ErrValueInvalid: In (int1) wurde ein falscher Wert übergeben.