![]() |
Seltsames Memo LoadFomFile inculde Phänomen
Hallo DP !
Ich habe ein recht seltsames Verhalten, welches ich mir nicht erklären kann. Ich validiere eine XML gegen eine XSD Datei. Das funktioniert zwar prima, allerdings NUR wenn die XSD Datei per OpenTextFileDialog in das Memo geladen wird. Denn dann wird auch die "include" Zeile berücksichtigt. Funktioniert:
Delphi-Quellcode:
Funktioniert nicht:
procedure TFmain.button_open_xsdClick(Sender: TObject);
begin open_xmlorxsd.InitialDir := ExtractFilePath(Application.ExeName); open_xmlorxsd.filter := '.xsd'; open_xmlorxsd.filename := '*.xsd'; if open_xmlorxsd.Execute then memo_xsd.Lines.LoadFromFile(open_xmlorxsd.FileName); end; if validate_xml_memo(memo_xml.Lines.Text,memo_xsd.Lines.Text) = TRUE then Showmessage('Hurra');
Delphi-Quellcode:
XSD:
xsd := ExtractFilePath(Application.ExeName) + filename + '.xsd';
memo_xsd.lines.loadfromfile(xsd); if validate_xml_memo(memo_xml.Lines.Text,memo_xsd.Lines.Text) = TRUE then Showmessage('Hurra');
Code:
Wie gesagt der Pfad zu beiden XSD Dateien ist in beiden Fällen gleich. Per OpenTextFileDialog wird die include Zeile berücksichtigt, wenn ich die Datei einfach per LoadFromFile lade, wird die include Datei nicht gefunden.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.hoppsassa.com/rr/schna/Types" elementFormDefault="qualified" targetNamespace="http://www.hoppsassa.com/rr/schna/Types">
<xs:include schemaLocation="Types_Enhanced.xsd"/> <xs:element type="tns:Cool" name="Cool"/> </xs:schema> Woran liegt das? |
AW: Seltsames Memo LoadFomFile inculde Phänomen
Zitat:
Das include gibt einen Pfad "relativ zum aktuellen Verzeichnis" an. |
AW: Seltsames Memo LoadFomFile inculde Phänomen
Nicht vermutlich, sondern mit Sicherheit.
Darum soll man auch nicht mit relativen Pfaden arbeiten. Und dieses
Delphi-Quellcode:
ist auch eine geährliche Angelegenheit.
if myboolean = True then
Am Besten wäre es, wenn man dem validate_xml_memo einen Pfad für Include-Dateien mitgeben könnte, oder man muß ebenfalls am aktuellen Pfad rumfummeln. Und warum heißt das eigentlich Memo? (validate_xml_memo) Die Methode bekommt zwei Strings und keine Memos rein. Zitat:
Zitat:
Dann kannst du die Parameter auch gleich alle im OI angeben. Aber: Dein FileName ist falsch, denn darin hat ein * nichts zu suchen. (leer lassen, einen richtigen DefaulFileNamen reinschreiben oder auf leer setzen, um den letzten Aufruf zurückzusetzen) Der Filter hält sich auch nicht an die Definition. (schau mal in die OH) Dann könnte man eventuell noch FilterIndex und DefaultFilter setzen. Und nein, deine Fehleranalyse ist falsch, denn am LoadFromFile liegt es nicht, da es immer richtig funktioniert, egal ob mit oder ohne OpenDialog. Das Problem liegt ausschließlich in deinem validate_xml_memo. |
AW: Seltsames Memo LoadFomFile inculde Phänomen
Hi,
Okay habe den Filter abgändert:
Delphi-Quellcode:
die Funktion sieht wie folgt aus:
open_xmlorxsd.filter := 'XSD schemas (*.xsd)|*.XSD';
Delphi-Quellcode:
Die XSD Dateien liegen in einem benutzerdefinierten Ordner, dessen Pfad beim Starten des Programms aus einer ini gelesen wird.
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// validate_xml_memo +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++} Function validate_xml_memo(xml,xsd: string):Boolean; procedure AddParseError(E: IXMLDOMParseError); begin if E.errorCode <> 0 then begin Showmessage('Validation Error: '+E.reason+#13#10+E.srcText) end else result:=TRUE; end; var Doc: IXMLDOMDocument2; Schema: IXMLDOMDocument2; SchemaCache: IXMLDOMSchemaCollection; sNameSpace: String; begin try // Load XML document Doc := CoDOMDocument60.Create; Doc.async := False; Doc.resolveExternals := True; Doc.validateOnParse := True; if not Doc.loadXML(xml) then begin AddParseError(Doc.parseError); Exit; end; // Load schema Schema := CoDOMDocument60.Create; Schema.async := False; Schema.resolveExternals := True; Schema.validateOnParse := True; if not Schema.loadXML(xsd) then begin AddParseError(Schema.parseError); Exit; end; // put in schema cache SchemaCache := CoXMLSchemaCache60.Create; sNameSpace := VarToStr(Schema.documentElement.getAttribute('targetNamespace')); SchemaCache.add(sNameSpace, Schema); //load schema with the correct namespace // assign schema cache to a document Doc.schemas := SchemaCache; // Validate AddParseError(Doc.validate); result:=TRUE; except on E: Exception do Showmessage(E.message); end; end; |
AW: Seltsames Memo LoadFomFile inculde Phänomen
Nur mal so am Rande
Was möchtest du mit
Delphi-Quellcode:
erreichen?
try
... except on E: Exception do Showmessage(E.message); end; Soll bei einer Exception ein Dialog mit der Fehlermeldung erscheinen? Dann entferne diesen
Delphi-Quellcode:
Block, denn die Anwendung macht das von ganz alleine!
try .. except
Was du jetzt hast ist eine Funktion, die bei einer Exception die Exception-Message ausgibt (der Exception-Typ fällt unter den Tisch) und dann irgendeinen nicht kontrollierbaren Rückgabewert an den Aufrufer zurückliefert. Wenn du Pech hast, dann siehst du diese Fehlermeldung und direkt danach die Meldung "Hurra". Wem soll das denn nun etwas sagen? Irgendwie gibt deine Funktion egal wie nur gesichert ein
Delphi-Quellcode:
heraus, ein
True
Delphi-Quellcode:
wird nie explizit gesetzt. Wahrscheinlich musst du deswegen auch den Rückgabewert auf
False
Delphi-Quellcode:
prüfen, sonst siehst du sehr selten Hurra.
True
|
AW: Seltsames Memo LoadFomFile inculde Phänomen
Noch besser, wenn vorher der Code abgebrochen ist, das AddParseError aufrief und der Fehlercode zufällig 0 ist, dann gibt die Funktion auch True zurück, obwohl garnicht alles abgearbeitet wurde.
Und AddParseError fügt nichts irgendwo hinzu, sondern gibt nur eine Fehlermelung aus, also eher ein ShowParseError. :stupid: Zitat:
Zitat:
und zu 0,4% wird ein "False" genau das True (=1) ergeben. |
AW: Seltsames Memo LoadFomFile inculde Phänomen
Zitat:
Wollen wir das mit dem 'beweisen' vielleicht nochmal üben? Und gleich danach, oder besser davor noch, Grundlagen der Logik? :lol: (*) Und der, der mich jetzt auf den Widerspruch hinweist und dabei den Witz nicht kapiert, kriecht'n Keks. Was aber natürlich stimmt, ist, das man die Warnhinweise des Compilers ernst nehmen und (fast) alles daran setzen sollte, diese auf 0 zu bekommen ohne sie auszuschalten. PS: Und 'ja', mir ist langweilig :stupid: |
AW: Seltsames Memo LoadFomFile inculde Phänomen
OT: @himitsu
Und dieses
Delphi-Quellcode:
ist auch eine geährliche Angelegenheit.
if myboolean = True then
Könntest Du mal aufhören, ständig diesen Unsinn zu posten? |
AW: Seltsames Memo LoadFomFile inculde Phänomen
Zitat:
|
AW: Seltsames Memo LoadFomFile inculde Phänomen
Zitat:
Delphi-Quellcode:
procedure Main;
var myBoolean: Boolean; I: Integer; begin I := 2; Move(I, myBoolean, Sizeof(myBoolean)); if myBoolean = (myBoolean = true) then Writeln('OK!') else Writeln('Shit!'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 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