Auf das Thema antworten  [ 1 Beitrag ] 
Anleitung und Download 
Autor Nachricht
Administrator
Benutzeravatar

Registriert: Sa 15. Dez 2012, 19:15
Beiträge: 137
Wohnort: Karlsruhe
Mit Zitat antworten
Hallo Leute!

Um Daten und Einstellungen zu speichern habe ich eigentlich die magonyORG.Storage entwickelt. Dort kann man die Daten auch in Klartext speichern - allerdings sind die Daten nicht besonders gut zu lesen, weil trotzdem Byte-Code verwendet werden muss (für die Token und Separatoren).

Weil ich das Abspeichern der Einstellungen für das Update-Programm von TaDuMa allerdings einfach halten wollte - sodass der Benutzer sie auch leicht ändern kann - habe ich nach einer Alternative gesucht. Tatsächlich gibt es da viele verschiedene Konzepte: XML, YAML und die INI sind nur einige davon. Ich hatte mich für eine einfache Implementation einer Initialisierungsdatei entschieden. Allerdings wollte ich eine universellere Implementation und ein einfacheres Konzept als all die ganzen anderen Konzepte. Deshalb habe ich ein eigens Konzept entworfen und ein Programm, um ein Beispiel für das Speichern, Auslesen und für eine Darstellung in Baum-Form anbieten zu können.

Bild


Beispieltext
Code:
 
#Test-Note
<Map 1
 <Block 1
  Skalar 1
: 123
  Skalar 2
: 456
  Skalar 3
: 789
#Block 1.1
  <Block 1.1
   Skalar 1
: 111
   Skalar 2
: 222
   Skalar 3
: 333
   <Block 1.1.1
    Skalar 4
: 4444
#Empty
    <Block 1.1.1.1
  Skalar 5
: 5555
  -Listenpunkt 1
  -Listenpunkt 2
  -Listenpunkt 3
    Skalar 6
: 6666
   Skalar 4
: 2345
  Skalar 4
: 4567
  - Listenpunkt 1
  - Listenpunkt 2
 


Wenn der obige Text analysiert wurde, wird er, sobald die Daten erneut gespeichert werden, in einen geordneten Text gespeichert (der obige Text ist zu Testzwecken etwas durcheinander gebracht worden).
Code:
 
# Test-Note
<Map 1
 <Block 1
 Skalar 1
: 123
 Skalar 2
: 456
 Skalar 3
: 789
 Skalar 5
: 5555
 Skalar 4
: 4567
 - Listenpunkt 1
 - Listenpunkt 2
 - Listenpunkt 3
 - Listenpunkt 1
 - Listenpunkt 2
  # Block 1.1
  <Block 1.1
  Skalar 1
: 111
  Skalar 2
: 222
  Skalar 3
: 333
  Skalar 4
: 2345
   <Block 1.1.1
   Skalar 4
: 4444
   Skalar 6
: 6666
    # Empty
    <Block 1.1.1.1
 


Warum ich das Konzept "BlockTree" - also "BlockBaum" - genannt habe, sollte offensichtlich sein. Man kann - damit es noch ein bisschen besser lesbar wird - statt einem Leerzeichen auch ein Tab-Zeichen verwenden. Jedoch sind diese problematisch. Viele Editoren fügen stattdessen einfach Leerzeichen ein. Die Anzahl der Leerzeichen allerdings bestimmt die Zugehörigkeit der Zeile zu einem Block.

BlockTrees unterstützen Kommentare, geschachtelte Sektionen, Schlüssel mit Werten und Aufzählungen. Damit lässt sich jede beliebige Datenstruktur beschreiben. Sei es die Daten einer instanziierten Klasse, Datenbanken oder Einstellungen - alles wird speicherbar. Darüber hinaus wurden auf "überflüssige" Zeichen verzichtet. Also zum Beispiel End-Tags. Mehrzeiliger Text muss allerdings modifiziert gespeichert werden, weil in jeder Zeile ein Eintrag zu stehen hat. Jedoch könnte man wiederherum einen mehrzeiligen Text auch als Sub-Sektion und die Zeilen als Listenpunkte speichern.

Wenn man Leerzeichen verwendet, dann kann man auch ein Syntax-Highlighting erreichen wenn man die Syntax als YAML interpretieren lässt. Außerdem werden die Blöcke (zumindest mit Notepad++) reduzierbar.


Codebeispiel
Um das obige Ergebnis zu bekommen ist der folgende Code notwendig:
Code:
 
BlockTree root = new BlockTree();
 
BlockTree.Block map1 = new BlockTree.Block(root, null, "Map 1", "Test-Note");
 
BlockTree.Block block1 = new BlockTree.Block(root, map1, "Block 1");
block1.Attributes.Add("Skalar 1", "123");
block1.Attributes.Add("Skalar 2", "456");
block1.Attributes.Add("Skalar 3", "789");
block1.Attributes.Add("Skalar 5", "5555");
block1.Attributes.Add("Skalar 4", "4567");
block1.Values.Add("Listenpunkt 1");
block1.Values.Add("Listenpunkt 2");
block1.Values.Add("Listenpunkt 3");
block1.Values.Add("Listenpunkt 1");
block1.Values.Add("Listenpunkt 2");
 
BlockTree.Block block1_1 = new BlockTree.Block(root, block1, "Block 1.1", "Block 1.1");
block1_1.Attributes.Add("Skalar 1", "111");
block1_1.Attributes.Add("Skalar 2", "222");
block1_1.Attributes.Add("Skalar 3", "333");
block1_1.Attributes.Add("Skalar 4", "2345");
 
BlockTree.Block block1_1_1 = new BlockTree.Block(root, block1_1, "Block 1.1.1");
block1_1_1.Attributes.Add("Skalar 4", "4444");
block1_1_1.Attributes.Add("Skalar 6", "6666");
 
BlockTree.Block block1_1_1_1 = new BlockTree.Block(root, block1_1_1, "Block 1.1.1.1", "Empty");
 


Zunächst wird eine neue BlockTree-Instanz initiiert. Wenn man direkt auch einen Text analysieren lassen möchte, kann man diesen in einer Überladung als Parameter mit angeben. Dies kann auch später über die Methode Parse(string text [bool clearBlocks]) nachgeholt werden. So kann man weitere Blöcke hinzufügen oder die alten durch neue ersetzen.

Dann werden die einzelnen Blöcke deklariert. Dabei ist zu beachten, dass die Blöcke sich selbst dem Parent (also dem übergeordneten Block) oder dem Blocktree hinzufügen. Die Signatur für eine neue Block-Instanz ist (BlockTree root, Block parent, string name, params string[] notes).

Attribute, Aufzählungspunkte und Notizen können beliebig hinzugefügt werden. Blöcke allerdings nur durch die Initiierung dieser und Angabe des Parents. Mit der Methode Move() eines Blocks kann dieser einem anderen Block untergeordnet werden und ggf. den Root zu wechseln, Delete() löscht den Block und Copy() kopiert alle Daten in eine neue Block-Instanz und gibt diese zurück.

Das Feld Path eines jeden Blocks gibt den Pfad eines Blocks in einem TreeView zurück. Damit können alle übergeordneten Blöcke bis hin zur Wurzel zurückverfolgt werden. Z.B. ist der Pfad des Blocks 1.1.1 "Map 1\Block 1\Block 1.1\Block 1.1.1".


BlockTree
Die BlockTree-Instanz besitzt ein Feld UseTabb. Wenn dieser Wert true ist, werden Tabs anstatt Leerzeichen für das Einrücken von untergeordneten Blöcken verwendet. Ansonsten bietet eine instanzierte BlockTree-Klasse noch die Methoden ToLines(), welche die Daten der Blöcke in einem string-Array zurückgibt, ToText(), die diese Daten als Text mit Zeilenumbruch zurückgibt und die Methode GetTreeViewNodes(), welche die Pfade aller Blöcke zurückgibt üb sie in einem TreeView anzeigen zu lassen. Dazu kann man den TreeViewMaker verwenden.


Download
Die Beispielanwendung und die Bibliothek.


Schöne Grüße,
Magony

_________________
Bei Fragen, Lob, Kritik, Vorschläge, hilfreiche Hinweise oder Alternativvorschläge: Beitrag, neues Thema oder PN.
Für Dinge die diskutiert werden sollten, bitte neues Thema im jeweiligen Forum.
Wenn du nicht weißt wohin: Forum Unsortiert.


Mi 14. Mai 2014, 12:38
Diesen Beitrag melden
Profil Website besuchen
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Auf das Thema antworten   [ 1 Beitrag ] 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst neue Themen in diesem Forum erstellen.
Du darfst Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software
Deutsche Übersetzung durch phpBB.de

Impressum