oh oh,
Bei den Rohrlegern hieß das:
Kinder betet
Vater lötet
Netter Gruß aus dem unterirdischen Schutzraum
Druckbare Version
oh oh,
Bei den Rohrlegern hieß das:
Kinder betet
Vater lötet
Netter Gruß aus dem unterirdischen Schutzraum
So. Ich hab die Doku ein wenig auf den letzten Stand gebracht.
Passende DLL dazu is auch dabei.
(bei den "RnRegist" ist aber noch alles beim Alten)
Neu: Manipulationen mit "Key-Value" unabhängig von RnCom oder sonstwas. (schreiben und lesen)
Also ggf. auch für Commandline bzw. shell-commands
Hab ich noch nicht, aber ich denke, wir werden in den Routinen den Text für "KEY" standardgenmäß links ausrichten, trimmen und uppercase.
"Value" nur ausrichten und trimmen.
Gerade mit ggf. anderen Plattformen ist das einfach sicherer
Bei den "Config" Paramtern und Knoten mach ich es ja auch, das hat sich bewährt.
Da können wir uns ja richtig einig sein.
Manipulation mit Key-Value:
Unabhängigkeit ob Commandline, TCP/IP Message, oder aus der Config Datei,
alles ein Format und eine Routine. Genau.
Formatierung:
Value Case sensitiv lassen ist mir sympathisch. Auch der Rest der Festlegung findet volle Zustimmung.
Eine sehr runde Sache und eine sehr gut lesbare Dokumentation dazu.
.
Verständnissproblem:
Bei einer Sache habe ich noch einen Riss im Hirn.
Wenn ich schreibe FORMPOSX=100,FORMPOSY=200
Ist das Klar.
Das ist bei mir jeweils eine Routine.
Wenn ich eine Routine habe, die zwei Parameter braucht
Ausgedachtes Beispiel:
FORMPOS
Die will x und y übergeben haben.
Wie würde da die Zeile aussehen?
Netter Gruß
Es gibt mehrere Möglichkeiten: Eine davon
Mehrere Values:
FORMPOS=264=128,...
Sowas schreiben:
Sowas LesenCode:RnCsvWrSep(csvref, "FORMPOS")
RnCsvWrVal(csvref, "264")
RnCsvWrVal(csvref, "128")
Da mach ich es aber immer so, daß die Routine ihre Values selber liest oder schreibt, d.h. ich drück' ihn einfach den CSVREF Handle in die HandCode:RnCsvRdSep(csvref, Key)
if Key = "FORMPOS" then
RnCsvRdVal(csvref, X_VAL) ("264")
RnCsvRdVal(csvref, Y_VAL) ("128")
Da kann sich die Routine selber drum kümmern, da sie ja am besten weiss, was sie braucht.Code:RnCsvRdSep(csvref, Key)
if Key = "FORMPOS" then
sub_routine (CsvRef as Integer)
Elseif Key = "SAUBACKE" then
sub2_routine (CsvRef as Integer)
public sub_routine (CsvRef as Integer)
RnCsvRdVal(csvref, X_VAL) ("264")
RnCsvRdVal(csvref, Y_VAL) ("128")
public sub2_routine (CsvRef as Integer)
RnCsvRdVal(csvref, SAU_VAL) ("???")
Da das "RdVal" niemals über das konkrete Element hinauskommt, kann da nix passieren, Also wenn nur ein Value da ist, kann die Sub auch zwanzigmal RdVal sagen, ohne was durcheinander zu bringen.
Andere Variante, auch gern genommen:
In einem solchen String stehen nur Keys und werte für EINE Funktion
Die Funktion als Key ohne value vorne.
"FORMPOS,X=100,Y=20,TOPX=233,TOPY=200"
Dann würde die Hauptroutine nur einen RdKey machen und dann die Funktionen mit dem CsvRef aufrufen, dann soll die selber lesen, was sie braucht.
Dritte Variante, etwas aufwendiger:
Irgendein Value ist selbst ein Key-Value string (Das geht beliebig rekursiv). Das erklär' ich noch, wie das geht
Vielleicht nachgeschossen, falls das nicht gut erklärt wurde:
RnCsvRdKey liest IMMER den NÄCHSTEN KEY, das RnCsvRdVal dazwischen KANN man machen, MUSS aber nicht
z.B. String
"PAR1=ellenlangerschrott,PAR2=wichtig
RnCsvRdKey(ref, KEY) liefert "PAR1"
wenn ich will, kann ich jetzt RnCsvRdVal() machen und krieg "ellenlangerschrott"
So oder so, der nächste
RnCsvRdKey(ref, KEY) liefert "PAR2"
Wie ich das im Moment sehe schließe ich mich deiner Gewohnheit an und drück der Routine den CSVREF Handle in die Hand.
Das bedeutet zwar, dass ich alle Routinen umschreibe aber der Vorteil überwiegt hier.
Ich denke das hast Du gut beschrieben.
Ich werde das mal umsetzen.
Netter Gruß
CSVREF Handle in die Hand drücken:
Bin doch noch etwas unschlüssig geworden.
Da ich die Routinen auch aus der Programmlogik heraus ansprechen will kann es sein, das ich da noch variiere.
Aber Wege hat es ja genug.
Vorschau:
Wenn ich das Key=Value implementiert habe kommt noch ein Net Befehl dazu:
SNAPSHOT
Alle Child -PID in der Liste des Wizards bekommen diesen Befehl und machen einen Snapshot ihrer Parameter.
Länge, Breit, Position, Port, IP, Werterange usw.
Diesen Config Tree senden sie an den Mother –PID (den Wizard)
Der Wizard baut daraus einen Gesamt Tree und speichert den unter einem gewünschten Namen ab.
Das ist dann die Config mit der der Wizard die gespeicherte Session wieder herstellen kann.
Gott steh mir bei.
(PicNick würde da aber auch erstmal reichen)
Netter Gruß
Ps. damit wäre das Thema Config aber auch schon am gewünschten Ende.
(Glaube ich jedenfalls) :-)
Pars ComandLine läuft.
Und wird erkannt und ausgeführt.
Ganz prima.
Was ich noch machen muss damit er das richtige bekommt siehst Du unten:
Aber das weist Du ja.
CsvLen = RnCsvRdKey(CsvRef, Key) ' ergibt “PARAMx”
While CsvLen <> 0
CsvLen = RnCsvRdVal(CsvRef, Val) ' ergibt “Valuex”
'-----------------------------
' auswerten Key=Val
MyKey = Trim(Key) 'Leerzeichen eliminieren
MyVal = Trim(Val) 'Leerzeichen eliminieren
lenk = MyKey.Length 'Länge holen
lenv = MyVal.Length 'Länge holen
MyKey = MyKey.Remove((lenk - 1), 1) 'Bissel Tricky, da muss noch ein verstecktes Zeichen am Ende gekillt werden.
MyVal = MyVal.Remove((lenv - 1), 1) 'Bis ich da drauf gekommen bin......
DoCommand(MyKey, MyVal)
'-----------------------------
CsvLen = RnCsvRdKey(CsvRef, Key) 'Next
End While
Ans Schreiben von Key=Values mach ich mich morgen.
Netter Gruß
Aus den Search and Zerstreu Labs. In good old Berlin
Edit:
Nachtrag:
Die frischeste Version findest Du unter dem Link den ich Dir geschickt habe.
Und sag jetzt nicht Du hast den verbummelt.
Netter Gruß
Tagchen !
Ok, um das trimmen etc. kümmere ich mich, schau nur erstmal, ob du bis dahin irgendwie überlebst.
Pfooaaa ! Der VB ist nix für Rekonvaleszente, Frischoperierte, manisch Depressive und Gemütskranke !
Wenn du sagst Text.Length , gibt er dir die Länge von "new", egal, was da drin steht.
Leider muß man auf jeden Fall folgendes einfügen, damit das ein sauberer String wird:
Ich faß' es nicht.Code:CsvLen = RnCsvRdKey(CsvRef, Key)
While CsvLen <> 0
Key = Key.Remove(CsvLen, Key.Length - CsvLen) NEWNEWNEW
CsvLen = RnCsvRdVal(CsvRef, Val)
Val = Val.Remove(CsvLen, Val.Length - CsvLen) NEWNEWNEW
....
(Geht auch, wenn csvlen = 0, also keine Sorge)
Anbei die DLL mit trimmen und ausrichten, wie besprochen