AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte himXML (gesprochen himix ML)
Thema durchsuchen
Ansicht
Themen-Optionen

himXML (gesprochen himix ML)

Ein Thema von himitsu · begonnen am 12. Mär 2009 · letzter Beitrag vom 11. Nov 2020
Antwort Antwort
Seite 15 von 26   « Erste     5131415 161725     Letzte »    
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#1

Re: himXML (gesprochen himix ML)

  Alt 19. Jul 2009, 18:35
eigentlich kaum erwähnenswert, aber da ich vorhin eine Nachricht bekam, daß etwas nicht mehr geht ...
  • die Interfaces werden jetzt wieder richtig "deaktiviert", wenn sie nicht benötigt werden, da einige Compiler (D2006 & D2007) nicht mit überladenen Defaultproperties in Interfaces klar kommen.
  • es wurden die Projektdateien für's "alte" BDS hinzugefügt (*.bdsproj & *.groupproj), damit auch diese Nutzer in den Demos die voreingestellten Suchpfade der Projektoptionen nutzen können.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#2

Re: himXML (gesprochen himix ML)

  Alt 1. Aug 2009, 16:00
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:
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;
da ich keinen eigenen Auswahldialog eingebunden hab, falls keine Datei gefunden wurde und eine Location gewählt werden muß,
kommt dann z.B. noch sowas dazu:
dieses nutzt den Dialog aus dem Anhang
Delphi-Quellcode:
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;
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

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 Hier im Forum suchenSearchSameFiles 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;
Miniaturansicht angehängter Grafiken
dialog_187.png  
Angehängte Dateien
Dateityp: dfm optionsselect_112.dfm (2,2 KB, 4x aufgerufen)
Dateityp: pas optionsselect_100.pas (1,7 KB, 4x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von TheJeed
TheJeed

Registriert seit: 11. Jun 2009
Ort: Leipzig
57 Beiträge
 
#3

Re: himXML (gesprochen himix ML)

  Alt 3. Aug 2009, 19:01
Tolles Projekt - sehr hilfreich! Danke für Deine Mühe und für das Engagement, das Ergebnis öffentlich zur Verfügung zu stellen!
Teitmaschine Go!
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: himXML (gesprochen himix ML)

  Alt 3. Aug 2009, 20:27
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:
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;
Ob das so geht, weiß ich nicht Aber ich denke, damit dürfte klar sein, was ich damit meinte.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#5

Re: himXML (gesprochen himix ML)

  Alt 3. Aug 2009, 21:32
Zitat von xZise:
Als Erstes: Und zwar wozu wurde der RadioButton erfunden? Weil du auf dem Selektionsfenster Buttons verwendest.
DER ist häßlich

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.
sieht beides OK aus und dürfte auch funktionieren ... wird gleich eingebaut

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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
857 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: himXML (gesprochen himix ML)

  Alt 13. Aug 2009, 19:23
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#7

Re: himXML (gesprochen himix ML)

  Alt 13. Aug 2009, 20:29
hast du mal ein ausführlicheres Beispiel dafür?

dieses piept jedenfalls nicht.
Delphi-Quellcode:
XML := TXMLFile.Create;
if XML.RootNode.Nodes.Exists('Nicht\Da\Nein') then
  beep;
oder hast du zufällig vorher auf etwas unterhalb dieses Zweiges zugegriffen? (auch lesend)

per Standard (über XML.Options änderbar) werden ja Nodes automatisch erzeugt, wenn man darauf zugreift
S := XML.RootNode.Nodes['Nicht\Da\Nein'].Text;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
857 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: himXML (gesprochen himix ML)

  Alt 14. Aug 2009, 11:15
Zitat von himitsu:
oder hast du zufällig vorher auf etwas unterhalb dieses Zweiges zugegriffen? (auch lesend)
Ja, das wars! Das hat den Zweig angelegt. Sorry, habe ich übersehen!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#9

Re: himXML (gesprochen himix ML)

  Alt 14. Aug 2009, 12:04
Zitat von BlueStarHH:
Ja, das wars! Das hat den Zweig angelegt. Sorry, habe ich übersehen!
Du kannst das Verhalten, wie gesagt auch abschalten, aber dann würde mindestens NIL für einen Knoten zurückgegeben, welcher nicht existiert und im schlimmsten Falle gäbe es natürlich Probleme, wenn du auf etwas nichtexistierendes zugreifst.

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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#10

Re: himXML (gesprochen himix ML)

  Alt 26. Aug 2009, 08:59
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:
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;
Vorallem die ...Def- und Try...-Funktionen würden überarbeitet/erweitert und es gab Änderungen in der Verzeichnisbehandlung.
Delphi-Quellcode:
Self.Left := Options.GetValueDef('window\left', Left);
ComboBox1.ItemIndex := Options.GetValueDef('view', 1, 0, ComboBox1.Items.Count - 1);
Als nächstes wird der SAX-Parser überarbeitet
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)]
Angehängte Dateien
Dateityp: 7z himxml_543.7z (1,09 MB, 3x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 15 von 26   « Erste     5131415 161725     Letzte »    


Forumregeln

Es 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

Gehe zu:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
xml - MSXML alternative - Stack Overflow This thread Refback 28. Jun 2011 15:34

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz