|
Antwort |
wollt eigentlich nur mal die ersten Fortschritte eines vor kurzem längerem begonnen Projektes vorstellen
es ist "nur" eine weitere kleine XML-Klasse. der Grund war eigentlich, daß mir andere XML-Projekte zu rießig sind und MSMXL (TXMLDocument) nicht grad schnell. [info] aktuell entwickle ich unter D2009 und direkt kompatibel düfte es bis Delphi 2006 / Turbo Delphi sein und Aufgrund einiger Anfragen versuch ich, sobald es da "gut" läuft, eine Extraversion weiter abwärtskompatibel zu machen ... mal sehn, bis wie weit runter das geht [/info] [add 04.01.2001] aktuell sieht es so aus, als wenn es schonmal bis zu D7 läuft [add/] aktueller Post: http://www.delphipraxis.net/internal...116416#1116416 #193
ansonsten bin ich für Tipps und Vorschläge dankbar [add 13.03.2009] ach ja falls der Name jemandem nich gefällt ... Beschwerden bitte an Matze richten [add] im Beitrag #193 wird etwas über die im Download mit enthalenen anderen XML-Libs geschrieben. [add] Achtung, beim Forenupgrad der DP sind die Dateikommentare verschwunden und die Dateinamen sind unglücklich importiert wurden. himxml_246.7z = v0.9 21.05.2009 himxml_164.7z = v0.99d 12.01.2010 other.7z = 30.12.2010 (only the "other" directory)
$2B or not $2B
Geändert von himitsu (30. Dez 2010 um 09:29 Uhr) |
Delphi 12 Athens |
#121
vieleicht hat's ja schon wer vor Ewigkeiten entdeckt ... in den Tools zu himXML existiert ja schon seit einigen Monaten soeine nette und bisher mehr "funktionsunfähige" Klasse
im Zuge einiger anderer Projekte ist diese inzwischen aber gewachsen sie wird z.B. so eingebunden:
Delphi-Quellcode:
da ich keinen eigenen Auswahldialog eingebunden hab, falls keine Datei gefunden wurde und eine Location gewählt werden muß,
Uses OptionsSelect, himXML_Tools;
Procedure TMainForm.FormCreate(Sender: TObject); Begin _Options := TXMLProjectOptions.Create; _Options.AutorOrCompany := 'FNS Enterprize''s'; _Options.Project := 'SearchSameFiles'; _Options.OptionsVersion := '1.0'; _Options.AllowedLocations := [xpoSession, xpoAppDir, xpoLocalAppDataC]; _Options.FileName := 'SearchSameFiles.xml'; _Options.OnSelectLocation := SelectLocation; _Options.Open; If _Options.Exists('window') Then Begin Left := _Options.Value['window\left']; Top := _Options.Value['window\top']; Width := _Options.Value['window\width']; Height := _Options.Value['window\height']; End; If not _Options.Exists('view') Then ComboBox1.ItemIndex := 1 Else ComboBox1.ItemIndex := _Options.Value['view']; End; Procedure TMainForm.FormDestroy(Sender: TObject); Begin _Options.Free; End; kommt dann z.B. noch sowas dazu: dieses nutzt den Dialog aus dem Anhang
Delphi-Quellcode:
diese Funktion kann sich ja dann jeder gestalten wie er sill ... selbst eine Auswahl durch das Programm ist hier möglich, falls man den User nicht "nerven" möchte ... meiner Klasse ist es ja egal wie und wo die Auswahl getroffen wird
Procedure TMainForm.SelectLocation(Sender: TXMLProjectOptions; Var Location: TXMLPOLocation);
Var OSel: TOptionsSelectForm; L: TXMLPOLocation; S, S2: String; Begin OSel := TOptionsSelectForm.Create(Self); Try For L := Low(TXMLPOLocation) to High(TXMLPOLocation) do If L in Sender.AllowedLocations Then Begin Case L of xpoSession: Begin S := 'session'; S2 := 'the options are not saved' + sLineBreak + 'and are only valid for this runtime'; End; xpoDirect: Begin S := 'direct'; S2 := 'the location is determined by the program'; End; xpoAppDir: Begin S := 'application path'; S2 := 'the options are saved in the same directory where the program is'; End; xpoLocalAppDataCP, xpoLocalAppDataP, xpoLocalAppDataC, xpoLocalAppData: Begin S := 'local application data'; S2 := 'the options are saved in a directory that serves as a data repository for local (nonroaming) applications'; End; xpoRoamingAppDataCP, xpoRoamingAppDataP, xpoRoamingAppDataC, xpoRoamingAppData: Begin S := 'roaming application data'; S2 := 'the options are saved in a directory that serves as a common repository for application-specific data'; End; xpoAllUserAppDataCP, xpoAllUserAppDataP, xpoAllUserAppDataC, xpoAllUserAppData: Begin S := 'all users application data'; S2 := 'the options are saved in a directory containing application data for all users'; End; Else Begin S := 'unknown'; S2 := 'unknown'; End; End; OSel.AddDir(S, Sender.GetPath(L), S2, Ord(L), L = Location); End; If OSel.ShowModal = mrOk Then Location := TXMLPOLocation(OSel.Tag); Finally OSel.Free; End; End; im Beispiel wird einfach eine Form angezeigt, die möglichen/erlaubten Verzeichnisse werden angezeigt und der User darf dann wählen. ja und so werden dann z.B. in SearchSameFiles die Einstellungen für den dortigen Verzeichnisauswahldialog geladen:
Delphi-Quellcode:
// auslesen
i2 := _Options.Value['directory\count']; For i := 0 to i2 - 1 do Start.AddDir(_Options.Value[Format('directory\name%d', [i])]); Start.Edit2.Text := _Options.Value['mask']; Start.CheckBox1.Checked := _Options.Value['fullCompare']; Start.CheckBox2.Checked := _Options.Value['fileCache']; If Start.ShowModal = mrOk Then Begin ... // ändern _Options.BeginUpdate; _Options.Value['directory\count'] := Length(Dirs); For i := 0 to High(Dirs) do _Options.Value[Format('directory\name%d', [i])] := UTF8ToWideString(Dirs[i]); _Options.Value['mask'] := UTF8ToWideString(Mask); _Options.Value['fullCompare'] := Start.CheckBox1.Checked; _Options.Value['fileCache'] := Start.CheckBox2.Checked; _Options.EndUpdate; nötige Dateien sind in der Beta-Version im Post 1# zu finden und die Klasse selber ist aktuell so aufgebaut
Delphi-Quellcode:
Type TXMLPOLocation = (xpoSession, xpoDirect, xpoAppDir,
xpoLocalAppDataCP, xpoLocalAppDataP, xpoLocalAppDataC, xpoLocalAppData, xpoRoamingAppDataCP, xpoRoamingAppDataP, xpoRoamingAppDataC, xpoRoamingAppData, xpoAllUserAppDataCP, xpoAllUserAppDataP, xpoAllUserAppDataC, xpoAllUserAppData); TXMLPOLocations = Set of TXMLPOLocation; TXMLPOSelectLocation = Procedure(Sender: TXMLProjectOptions; Var Location: TXMLPOLocation) of Object; TXMLProjectOptions = Class Constructor Create; Destructor Destroy; Property AutorOrCompany: String; Property Project: String; Property OptionsVersion: String; Property AllowedLocations: TXMLPOLocations; Property FileName: TWideString; Property Protection: AnsiString; Function ExistingLocations: TXMLPOLocations; Function PossibleLocations: TXMLPOLocations; Procedure Open; Procedure Open (Location: TXMLPOLocation); Property ActiveLocation: TXMLPOLocation; Procedure BeginUpdate; Property Value [Name: String]: Variant; Property SerializeObj[Name: String]: TObject; Property Protect [Name: String]: Boolean; Function Exists (Name: String): Boolean; Procedure DeleteValue (Name: String); Procedure EndUpdate; Procedure Save (Location: TXMLPOLocation; DeleteOther: Boolean); Procedure Close; Procedure Delete (Location: TXMLPOLocation); Procedure DeleteAllOptionFiles; Property OnSelectLocation: TXMLPOSelectLocation; Function GetPath (Location: TXMLPOLocation): String; Property Tag: Integer; End; |
Zitat |
|
#122
Tolles Projekt - sehr hilfreich! Danke für Deine Mühe und für das Engagement, das Ergebnis öffentlich zur Verfügung zu stellen!
|
Zitat |
Delphi 2009 Professional |
#123
Hallo himitsu,
ein tolles Projekt (auch wenn ich bisher noch nicht nutzen konnte). Aber ein paar Sachen habe ich da schon. Als Erstes: Und zwar wozu wurde der RadioButton erfunden? Weil du auf dem Selektionsfenster Buttons verwendest. Und dann wäre da noch eine Idee: Und zwar die Möglichkeit, eine Default Funktion und eine Try Funktion (Wie StrToIntDef und TryStrToInt). Und zur Verschlüsselung: Könnte man es einstellen, welche Verschlüsselungsmethode verwendet? Also ein OnEncrypt und OnDecrypt Ereignis? Zum Zweiten Punkt:
Delphi-Quellcode:
Ob das so geht, weiß ich nicht Aber ich denke, damit dürfte klar sein, was ich damit meinte.
function TXMLProjectOptions.ValueDef(const AName : string; const ADefaultValue : Variant) : Variant;
begin if Exists(AName) then Result := Value[AName] else Result := ADefaultValue; end; function TXMLProjectOptions.TryValue(const AName : string; out AValue : Variant) : Boolean; begin if Exists(AName) then begin Result := True; AValue := Value[AName] end else Result := False; end; MfG xZise
Fabian
|
Zitat |
Delphi 12 Athens |
#124
Zitat von xZise:
Als Erstes: Und zwar wozu wurde der RadioButton erfunden? Weil du auf dem Selektionsfenster Buttons verwendest.
nja, mir gefiel die Optik mit Buttons einfach besser im Anhang ist mal die aktuelle Version des Dialogs verbaut - reagiert auf Scrollrad, Pfeiltastentasten und bei Doppelkick direkt als Auswahl - im Popupmenü (der Trees/Dateilisten) wird der Dialog auch zum Ändern der Position wiederverwendet ja und fülle mal die RadioGroup mit "vielen" Einträgen ... wird sehr unübersichtlich, wenn die anfängt alles übereinanderzumalen die 3 Auswahlfelder sind nicht alle möglichen Verzeichnisse - hab nicht alles im Programm freigeschaltet - und nun verkleinere mal meinen Dialod in seiner Höhe und schau was passiert (würde ebenfalls geschehen, wenn noch mehr Verzeichnisse zur Wahl stünden) Aber insgesamt ist es ja halb so schlimm, da du in OnSelectLocation ja einbinden kannst, was DU willst Das mit der Defaultfunktion ist klasse ... warum bin ich da nicht selber draufgekommen da mach ich in mein Programm einige if-exists-Abfragen und damit würde das Ganze hübscher aussehn
Zitat von xZise:
Ob das so geht, weiß ich nicht Aber ich denke, damit dürfte klar sein, was ich damit meinte.
und daas mit der Verschlüsselung ... da gibt es ja schon was in tXMLFile drin und eigentlich wollte ich das auch durchschleifen (hatte ich wohl wieder vergessen) [edit] Testprogramm jetzt im anderem Thread erneuert, drum hier entfernt > siehe dort |
Zitat |
Delphi 11 Alexandria |
#125
Hi himitsu,
erstmal Danke für das tolle Projekt! Ich möchte damit meine eigene Ini-Klasse ersetzen. Meine Ini-Klasse macht erstmal genau das selbe wie Deine TXMLIniFile im Constructor. Ich erzeuge eine Instanz und mache nichts anderes. Dann rufe ich diese Methode auf: XML.RootNode.Nodes.Exists('Nicht\Da\Nein') Diese gibt dann true zurück, obwol keine Node von mir erzeut wurde. Warum? Ist das ein Fehler? |
Zitat |
Delphi 12 Athens |
#126
hast du mal ein ausführlicheres Beispiel dafür?
dieses piept jedenfalls nicht.
Delphi-Quellcode:
oder hast du zufällig vorher auf etwas unterhalb dieses Zweiges zugegriffen? (auch lesend)
XML := TXMLFile.Create;
if XML.RootNode.Nodes.Exists('Nicht\Da\Nein') then beep; per Standard (über XML.Options änderbar) werden ja Nodes automatisch erzeugt, wenn man darauf zugreift S := XML.RootNode.Nodes['Nicht\Da\Nein'].Text; |
Zitat |
Delphi 11 Alexandria |
#127
Zitat von himitsu:
oder hast du zufällig vorher auf etwas unterhalb dieses Zweiges zugegriffen? (auch lesend)
|
Zitat |
Delphi 12 Athens |
#128
Zitat von BlueStarHH:
Ja, das wars! Das hat den Zweig angelegt. Sorry, habe ich übersehen!
hier würde im Falle, daß xoNodeAutoCreate nicht definiert wäre und z.B. "Da" nicht existiert, bei .Text eine Exception ala "Zugriff auf Adresse $0000000x" auftreten, da ja TXMLNode(nil).Text nicht ginge S := XML.RootNode.Nodes['Nicht\Da\Nein'].Text; S := XML.RootNode.Nodes['Nich'].Nodes['Da'].Nodes['Nein'].Text; beim Letzen wäre die Exception sogar schon bei .Nodes['Nein'], da ja dann Nodes['Da'] das NIL zurückgeben würde. |
Zitat |
Delphi 12 Athens |
#129
Hab den Dialog jetzt mit ins Projekt eingefügt, allerdings fehlt dazu noch eine Demo
(aber da gibt's ja weiter oben wenigstens ein paar Beispiele) Die meißten Änderungen gab es vorallem in den Tools, wo die eine Klasse nun so aussieht:
Delphi-Quellcode:
Vorallem die ...Def- und Try...-Funktionen würden überarbeitet/erweitert und es gab Änderungen in der Verzeichnisbehandlung.
TXMLProjectOptions = Class
Constructor Create; Destructor Destroy; Property AutorOrCompany: String; Property Project: String; Property OptionsVersion: String; Property AllowedLocations: TXMLPOLocations; Property FileName: TWideString; Property Protection: AnsiString; Function ExistingLocations: TXMLPOLocations; Function PossibleLocations: TXMLPOLocations; Function Open: Boolean; Function Open (Location: TXMLPOLocation): Boolean; Property ActiveLocation: TXMLPOLocation; Property ReadOnly: Boolean; Procedure BeginUpdate; Property Value [Name: String]: Variant; Property ValueFmt [Name: String; Fmt: Variant]: Variant; Procedure SaveObject (Name: String; Value: TObject); Procedure LoadObject (Name: String; Value: TObject); Property Protect [Name: String]: Boolean; Function Exists (Name: String): Boolean; Function GetValueDef (Name: String; Default: Variant): Variant; Function GetValueDef (Name: String; Default, Min, Max: Variant): Variant; Function TryGetValue (Name: String; Var Value: Variant): Boolean; Function TryLoadObject(Name: String; Value: TObject): Boolean; Procedure DeleteValue (Name: String); Procedure EndUpdate; Procedure Save (Location: TXMLPOLocation; DeleteOther: Boolean); Procedure Close; Procedure Delete (Location: TXMLPOLocation); Procedure DeleteAllOptionFiles; Property OnSelectLocation: TXMLPOSelectLocation; Property OnException: TXMLPOErrorProc; Function GetPath (Location: TXMLPOLocation): String; Property Tag: Integer; End;
Delphi-Quellcode:
Als nächstes wird der SAX-Parser überarbeitet
Self.Left := Options.GetValueDef('window\left', Left);
ComboBox1.ItemIndex := Options.GetValueDef('view', 1, 0, ComboBox1.Items.Count - 1); und es wird eine Umkehrklasse dazu entstehen, also so das man auch sehr sehr große XML-Dateien effektiv erstellen kann. [add] Options.ValueFmt['directory\name%d', i] hatte ich vergessen zu erwähnen ... dort kann man einen Parameter (aktuell leider nur String oder Integer) angeben, welcher dann via Format eingefügt wird ... wollte mir damit etwas das Leben erleichtern, da ich vorher soetwas hatte Options.ValueFmt['directory\name' + IntToStr(i)] |
Zitat |
Delphi 10.2 Tokyo Enterprise |
#130
Wie kann man den die Werte dieser XML Datei laden
XML-Code:
Das ist mein Versuch
<?xml version="1.0"?>
<config> <port>35353</port> <username>frank</username> <password>12345</password> <server>lserv</server> <db>devtest</db> <dbport>3306</dbport> </config>
Delphi-Quellcode:
da kommt aber nie ein Text raus was mach ich falsch
XML:=TXMLFile.Create(nil);
XML.LoadFromFile(FConfigPath+'config.xml'); With XML.RootNode.Node['config'] do Begin FDB.Port:=StrToIntDef(Node['port'].Text,35353); FDB.Server:=Node['server'].Text; FDB.Username:=Node['username'].Text; FDB.Password:=Node['password'].Text; FDB.Database:=Node['db'].Text; End;
Frank
|
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Erstellt von | For | Type | Datum |
xml - MSXML alternative - Stack Overflow | This thread | Refback | 28. Jun 2011 16:34 |
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |