![]() |
Fastreport eine Textdatei laden
Hallo Zusammen,
unter Delphi5 konnte ich mit FastReport4 zur Laufzeit eine Textdatei in ein MemoView laden. Die Textdatei enthält wirklich planen Text. Exakt das gleiche funktioniert unter Delphi XE2 nicht mehr. Vermutlich wegen Unicode. Schaue ich mir das Textfile mit Notepad an, ist alles in Ordnung. Lade ich den gleichen Text in ein MemoView wie unten angezeigt, so sehe ich Chinesische Schriftzeichen. Hat jemand eine Idee wie ich das umgehen kann?
Delphi-Quellcode:
Gruß Kostas
procedure TfrmReport.frxReport1BeginDoc(Sender: TObject);
begin inherited; case aReportFormular of rfSEPALastschriftProtokoll: SetTextFileInMemoView('TextDatei',PrgPath+'\SEPA\ErgebnisLast.txt'); end; end; {--------------------------------------------------------------------} {}procedure TfrmReport.SetTextFileInMemoView(ObjectName,Datei:String); {--------------------------------------------------------------------} begin with TfrxMemoView(frxreport1.findobject( ObjectName )) do begin if FileExists(Datei) then begin Visible := true; Memo.clear; Memo.LoadFromFile(Datei); end;{if} end;{with} end;{SetTextFileInMemoView} |
AW: Fastreport eine Textdatei laden
Sorry, habe die Lösung gefunden.
Den Text einfach vorher in ein TStringList laden dann gehts.
Delphi-Quellcode:
Gruß Kostas
{--------------------------------------------------------------------}
{}procedure TfrmReport.SetTextFileInMemoView(ObjectName,Datei:String); {--------------------------------------------------------------------} var st:TStringList; begin with TfrxMemoView(frxreport1.findobject( ObjectName )) do begin if FileExists(Datei) then begin Visible := true; st:=TStringList.Create; st.LoadFromFile(Datei); Memo.clear; Memo.Assign(st); st.Free; end;{if} end;{with} end;{SetTextFileInMemoView} |
AW: Fastreport eine Textdatei laden
Das
Delphi-Quellcode:
kannst du dir übrigens schenken.
Memo.Clear
Und noch eine kleine Anmerkung zu deinem Kommentarstil. Diese Kommentarlinien verbrauchen nur Zeit beim Tippen und bei jeder Änderung der Agumente bist du wieder dabei nutzlose Zeilen zu editieren. Verwende diese Zeit lieber dazu ganz am Anfang der Unit mit wenigen Zeilen zu beschreiben worum es in der Unit geht. Kommentierte End-Zeilen wie z.B.
Delphi-Quellcode:
sind ebenfalls Zeitverschwendung.
end; {with}
Besser man sorgt dafür dass Funktionen so klein sind dass man diese Hilfestellung nicht braucht. Immer prüfen, ob man eine Funktion nicht zerlegen kann und Teile davon in weitere Funktionen auslagern kann. Und noch ein Hinweis: ich werde hier nicht weiter darüber diskutieren wie man Sourcecode kommentieren sollte. Das führt nur zu langwierigen und fruchtlosen Diskussionen. Ich gebe nur meine langjährigen Erfahrungen weiter und man kann diese annehmen oder auch nicht. Vielleicht sind die Kommentarlinien auch von jemand anderem vorgegeben worden; ich weiß es nicht. Meiner Erfahrung behindert es mehr als es bringt.
Delphi-Quellcode:
// lade Dateiinhalt in ein Memoview des Reports
procedure TfrmReport.SetTextFileInMemoView(const MemoName,Dateiname:String); var st:TStringList; begin with TfrxMemoView(frxreport1.FindObject( MemoName )) do begin if FileExists(Dateiname) then begin st:=TStringList.Create; try st.LoadFromFile(Datei); Memo.Assign(st); finally st.Free; end; Visible := true; end; end; end; |
AW: Fastreport eine Textdatei laden
Dankeschön für den Hinweis.
Das mit den Kommentaren ist so eine dumme Gewohnheit. Ich mache das so automatisch das ich es nicht merke. In der Zeit überlege ich völlig andere Dinge. :-) Das mit dem try finally ist natürlich Pflicht und hatte ich auch eingebaut. Ich wollte nur schnell posten damit sich niemand unnötig mit dem Thread beschäftigt. Nochmals herzlichen Dank für den Hinweis ich weis das sehr zu schätzen. Dir noch eine schöne Zeit. Gruß Kostas |
AW: Fastreport eine Textdatei laden
Wirklich
Delphi-Quellcode:
und nicht
Memo.LoadFromFile(Datei);
Delphi-Quellcode:
Memo.Lines.LoadFromFile(Datei);
Hat da vielleicht jemand bei FastReport ein bissl "Mist" gebaut? (Fehlplanung) (abgesehn davon, daß ein WideString nicht grade ein "optimales" Speichermanagement besitzt) Zitat:
TWideStrings verwendet per Default Unicode und nicht ANSI, so wie das TStrings. Resultat: Der Code ist nicht kompatibel. (oder hatten sie die Dateien vor D2009 wirklich schon als UTF-16 gespeichert?) Lösung:
Delphi-Quellcode:
Memo.LoadFromFile(Datei, TEncoding.Default);
[edit] OMG, das Property "Memo" ist das "Lines" ... also intuitiv ist was Anderes :wall: |
AW: Fastreport eine Textdatei laden
Zitat:
Was mich aber nicht abhalten wird, denn du hast hier nichts zu verbieten: Bei größeren verschachtelten Strukturen ist es allemal besser, das Ende eines Blocks zu kommentieren, als hinterher mühevoll hoch- und runterscrollen zu müssen, wenn man das Ende eines Blocks sucht. |
AW: Fastreport eine Textdatei laden
Kommentierung hin und her ...
Das Einzige, was ich wirklich an dem Code hätte auszusetzen, ist der fehlende Resourcenschutzblock (Try-Finally) Und ja, Assign macht intern quasi auch nochmal ein Clear, aber doppelt hält ja bekanntlich besser. :angel: |
AW: Fastreport eine Textdatei laden
Zitat:
Es ist nur ein Hinweis darauf, dass eine Diskussion über Kommentare wie, wann und wo in seinen Augen müßig ist und er sich daran nicht weiter beteiligen würde. Er gibt hier nur seine eigene Erfahrung wieder. Mit keinem Wort wird dort irgendwem - noch nicht mal dir :mrgreen: - irgendwas verboten. Er weist nur darauf hin, dass er sich an einer potentiell aufkommenden KommentarWoWannWieUndWieOftDiskussion nicht beteiligen wird. Warum man sich da jetzt persönlich angegriffen fühlt entzieht sich mir leider. Versuch doch mal die Bürste nicht immer gegen den Strich zu ziehen :mrgreen: |
AW: Fastreport eine Textdatei laden
Frag doch mal andersrum: Wieso muß er das extra erwähnen, daß er keine Diskussion über seine ungebetenen Ratschläge wünscht? Er könnte Kritik oder Widerspruch ja auch unkommentiert stehen lassen, ohne extra zu betonen, daß er keine Diskussion darüber wünscht. In dem Fall würde sich keiner dran stören. Deshalb meine Formulierung "liest sich wie ...". Natürlich wird er es nicht wagen, hier explizit ein Verbot auszusprechen. Mein Kommentar ist eben meine Ansicht und entspricht meiner Erfahrung, die ich hier wohl genau so wiedergeben darf wie SX. Wenn ich etwas in irgend einer Form anstößig finde, dann sag ich das auch: Es steht ihm nicht zu, sich in einem Diskussionsforum Kommentare zu verbeten, denn das entspricht dem Wunsch, man möge es nicht gestatten, seine Kommentare zu kritisieren oder ihnen gar zu widersprechen. Dieser seltsame "Hinweis" ist reine Provokation, ansonsten macht er keinen Sinn.
Laßt doch die Leute ihre Kommentare in den Quelltext schreiben, wie sie lustig sind. Als ich damals mit Delphi bzw. mit Turbo Pascal anfing, hab ich erstmal auch sehr viel kommentiert, weil ich dann nicht immer wiederholt nachschlagen mußte, was denn dieser oder jener Befehl bedeutet. Schließlich war ich ja noch am Lernen. Heute, nach knapp 20 Jahren Pascal und über 10 Jahren Delphi kommentiere ich auch viel sparsamer, wenn ich das alleine entscheiden darf. Nicht wenige Auftraggeber schreiben jedoch vor, wie kommentiert und formatiert werden soll. Kürzlich verlangte sogar einer von mir durchgehend Großschreibung bei bestimmten Tokens: FUNCTION, PROCEDURE, BEGIN, END, FOR, TO, DO usw. sollten immer in Großbuchstaben geschrieben werden. Andere verlangen Kommentare, wo ich keine setzen würde, der eine besteht darauf, daß Kommentare immer in geschweifen Klammern stehen, der andere will unbedingt immer den Doppelslash. Was soll's, da würd' ich auch keine Diskussion mit dem Geldgeber anfangen. Ich hatte auch schon völlig unkommentierten Fremdcode zu bearbeiten, da verbringe ich erstmal ein paar Tage mit Testen und Kommentieren. Es gibt so viele unterschiedliche Aspekte des Kommentierens, daß es schon fast überheblich klingt, einem neuen Forenmitglied gleich mal die eigenen Kommentiergepflogenheiten in dieser fast schon autoritären Weise auf's Auge drücken zu müssen. Ohne diesen seltsamen Hinweis, der eigentlich besagt, "diskutiert wird darüber nicht", wäre das eher harmlos aufzufassen. Aber hier, in einem Diskussionsforum zu verlangen, man möge von kritischen Äußerungen zu seinen Kommentargepflogenheiten absehen, ist dann schon ein starkes Stück. Mit anderen Worten: Es ist schon arg seltsam, einerseits Empfehlungen zur Kommentierung reinzuschreiben, gleichzeitig aber Diskussionen über Kommentierung als fruchtlos zu bezeichnen, und das alles nur, weil er meint, seine Kommentargepflogenheiten seien die einzig Wahren. Da brauch ich nicht gegen den Strich bürsten, da sträuben sich mir die Nackenhaare von ganz alleine :roll: |
AW: Fastreport eine Textdatei laden
Ist es eigentlich nicht mehr möglich einfach nur eine Frage zu beantworten ohne sich dann über unwichtige Kleinigkeiten in die Haare zu bekommen? :gruebel:
|
AW: Fastreport eine Textdatei laden
Stimmt (ich weiß, wovon ich rede :mrgreen:). Man hat einfach zuviel Zeit.
Aber um nochmal Feuer ins Gies zu ölen: Anstatt zu sagen 'Ich sag zu dem Thema nichts mehr' wäre es einfacher, einfach nichts zu dem Thema zu sagen. Andererseits: Wieso kann man nicht einfach mal Senf dazugeben aber mit der Bitte, diesen Senf heute mal nicht zu kommentieren. Ach ja, weil man Leute mit ihrem 20m langen und 5m breiten Schlips per se nicht verfehlen kann. Eine seltsame Mode, diese Riesenschlipse. :-D |
AW: Fastreport eine Textdatei laden
Hallo Zusammen,
sorry dass der Thread so aus dem Ruder läuft :-( Zur Sache wollte ich noch berichten, ich habe alle folgende Varianten nacheinander ausprobiert doch ohne Erfolg. Ich sehe immer Chinesische Zeichen. Es funktioniert nur über den Umweg einer TStringList.
Delphi-Quellcode:
Gruß Kostas
...
with TfrxMemoView(frxreport1.findobject( ObjectName )) do begin ... Lines.LoadFromFile(Datei); Lines.LoadFromFile(Datei, TEncoding.Default); Lines.LoadFromFile(Datei, TEncoding.ANSI); Lines.LoadFromFile(Datei, TEncoding.ASCII); Lines.LoadFromFile(Datei, TEncoding.BigEndianUnicode); Lines.LoadFromFile(Datei, TEncoding.Unicode); Lines.LoadFromFile(Datei, TEncoding.UTF7); Lines.LoadFromFile(Datei, TEncoding.UTF8); Memo.LoadFromFile(Datei); Memo.LoadFromFile(Datei, TEncoding.Default); Memo.LoadFromFile(Datei, TEncoding.ANSI); Memo.LoadFromFile(Datei, TEncoding.ASCII); Memo.LoadFromFile(Datei, TEncoding.BigEndianUnicode); Memo.LoadFromFile(Datei, TEncoding.Unicode); Memo.LoadFromFile(Datei, TEncoding.UTF7); Memo.LoadFromFile(Datei, TEncoding.UTF8); ... end; ... |
AW: Fastreport eine Textdatei laden
Zitat:
|
AW: Fastreport eine Textdatei laden
Zu dem Lines hatte ich grade noch was in meinem letzten Post geändert. (siehe das [edit] am Ende)
Aber grade sah ich das im Code.
Delphi-Quellcode:
Es geht also Lines und Memo. (ich würde dennoch zu Lines raten, denn das stimmt wenigstens mit der VCL ala TMemo überein, aber egal)
// analogue of Memo property
property Lines: TWideStrings read FMemo write SetMemo; So wie der Code für XE aussieht, sollten diese Vier
Delphi-Quellcode:
funktionieren. (eher Default, für dem entsprechen Code wo früher die ANSI-Funktionen verwendet wurde)
Lines.LoadFromFile(Datei, TEncoding.Default);
Lines.LoadFromFile(Datei, TEncoding.ANSI); Memo.LoadFromFile(Datei, TEncoding.Default); Memo.LoadFromFile(Datei, TEncoding.ANSI); Eine "aktuelle" FastReport-Version benutzt du aber? Nja, wenn es dennoch nicht geht, dann hat da wirklich mal jemand richtig Mist gebaut. (bei FastReport oder Embarcadero) Aber Hauptsache es gibt wenigstens eine funktionierende Lösung. :D |
AW: Fastreport eine Textdatei laden
Ich verwende aktuell Fastreport Version 4.13.3
Werde ich gleich mal aktualisieren und danach nochmals testen. Gruß Kostas |
AW: Fastreport eine Textdatei laden
Die klassische Foren-Situation. Da stellt wer eine harmlose Frage und Dritte (!) bekommen sich wegen Nichtigkeiten in die Haare.
Fügt etwas inhaltliches zum Thema bei oder lasst es bitte bleiben. Nicht jedem Krumen (Kommentare) muss man aufpicken. Wirklich nicht. |
AW: Fastreport eine Textdatei laden
Nur mal doof zum Thema gefragt:
Zitat:
Bin da am Rande auch an dem Thema interessiert, weil ich mit D6 eine CGI für ein Web-Portal in HTML5 und daher UTF-8 erstellen soll, wo auch Textbausteine aus Dateien kommen. Aber auch Daten aus einer Datenbank (MS SQLServer) wo Charset der Felder noch irgendein Ascii ISO ist. |
AW: Fastreport eine Textdatei laden
Wenn die Datei keine Codierungsinformationen enthält (bei textdateien das BOM), dann kann man versuchen die Bytes zu anlysieren (funktioniert aber nicht ganz sicher)
oder man verwendet ein Stantardformat. Bei Textdateien gehen viele Windows-Programme von ANSI aus. (z.B. bei XML ist es per Spezifikation überall UTF-8) Das TWideStrings geht aber ohne Info (Vorgabe per Encoding-Parameter oder über ein vorhandenes BOM) einfach von UTF-16 aus, was beim "chinesisch" enden muß, wenn es vorher ANSI oder UTF-8 war. TStrings/TStringList nimmt ohne Info daher CP_ACP also die ANSI-CodePage des Systems, damit der Code zu alten ANSI-Delphis (vor D2009) kompatibel bleibt. |
AW: Fastreport eine Textdatei laden
Hallo Zusammen,
FastReport ist soeben aktualisiert worden in der Version 4.15.9 Doch leider ohne Erfolg. Die Textdatei wird von einem fremden Tool generiert. Es ist das Inhaltsprotokoll einer SEPA XML-Datei. Ich bin mir nicht sicher ob Notepad++ die aktuelle Codierung anzeigt. Die StatusBar zeigt Dos\Windows ANSI und im Menu-Format ist der Punkt auf ANSI. Gruß Kostas |
AW: Fastreport eine Textdatei laden
Bei XML steht die eigentliche Codierung eigentlich in der XML-Processorinfo
XML-Code:
.
<?xml ... encoding="UTF-8"?>
Für reine Texteditoren sieht das dann aber eher wie ANSI aus, da XML kein BOM vorschreibt. Und wenn nichts angegeben ist, dann ist es, wie schon erwähnt, immer UTF-8. (außer bei Programmen die XMLs erstellen und sich nicht an die Spezifikation halten) |
AW: Fastreport eine Textdatei laden
Dann mach doch einen Hex-Dump, dann weiß man was man hat.
Gruß K-H |
AW: Fastreport eine Textdatei laden
Hallo Zusammen,
um jetzt nicht noch mehr Verwirrung rein zu erzeugen, die Textdatei ist nicht das XML-File welcher parallel dazu erzeugt wird. Die Textdatei ich meine, ist eine reine Textdatei die alle Rechnungen auflistet die in dem XML-File enthalten sind.
Delphi-Quellcode:
Gruß Kostas
---------------------------------------------------------------------------------------------------------
SEPA-PAKET-NR 46 - LASTSCHRIFTEN - PER 05.03.2014 --------------------------------------------------------------------------------------------------------- EMPFÄNGER-NAME BIC IBAN BETRAG AUFTRAGGEBER-NAME VERWENDUNGSZWECK 1 END-TO-END-ID VERWENDUNGSZWECK 2 --------------------------------------------------------------------------------------------------------- |
AW: Fastreport eine Textdatei laden
Memo.Ansitext zuweisen?
|
AW: Fastreport eine Textdatei laden
Zitat:
|
AW: Fastreport eine Textdatei laden
Zitat:
Delphi-Quellcode:
frComp := TfrxMemoView.Create(frBand);
frComp.Font.Charset := RUSSIAN_CHARSET; // Unicode: Види по спецификациjа на оригиналната амбалажа. frComp.AnsiText := 'Âèäè ïî ñïåöèôèêàöèjà íà îðèãèíàëíàòà àìáàëàæà.'; // Siehe Angaben auf der Original-Verpackung |
AW: Fastreport eine Textdatei laden
Du erzeugst das Objekt vermutlich im Reporter da du auf das Band Object als Owner angibst oder du holst es vorher.
Wenn das Objekt MemoView instanziiert wird, gibt es das Property "Ansitext" Bei mir ist es so dass ich über den Designer ein Report erstelle und zur Laufzeit wenn der Event OnBeginDoc feuert das MemoView über dessen Namen abfrage und das Textfile lade.
Delphi-Quellcode:
Innerhalb von With... ist das Property Ansitext nicht verfügbar. Das ist mir so auch noch nie begegnet.
with TfrxMemoView(frxreport1.findobject( ObjectName )) do
Gruß Kostas |
AW: Fastreport eine Textdatei laden
Das geht bei mir genauso:
Delphi-Quellcode:
TFrxMemoView(frxVbsLabel.FindComponent('qrlHerstell')).Ansitext := 'Ïðîèçâîäèòåë:' // Производител: ;
|
AW: Fastreport eine Textdatei laden
Ah, jetzt habe ich verstanden. Wir reden aneinander vorbei.
Ansitext gibt es schon und ist vom Typ AnsiString. Dieser Typ hat keine Methode um direkt eine Datei zu laden wie AnsiString.LoadFromFile. Deshalb muss ich über eine TStringList gehen. Das funktioniert auch einwandfrei. Gruß Kostas |
AW: Fastreport eine Textdatei laden
Delphi-Quellcode:
uses
IOUtils; TFrxMemoView(frxVbsLabel.FindComponent('qrlHerstell')).Text := TFile.ReadAllText('test.txt'); // oder TFrxMemoView(frxVbsLabel.FindComponent('qrlHerstell')).Text := TFile.ReadAllText('test.txt', TEncoding.ANSI); |
AW: Fastreport eine Textdatei laden
jo, jetzt funkts.
Fragt sich nur was ReadAllText macht, ich habe nicht nachgeschaut. :-)
Code:
procedure TfrmReport.SetTextFileInMemoView(ObjectName,Datei:String);
begin with TfrxMemoView(frxreport1.findobject( ObjectName )) do begin if FileExists(Datei) then begin Visible := true; AnsiText := TFile.ReadAllText(Datei, TEncoding.ANSI); end; end; end; Besten Dank an alle. So werde ich es in Zukunft anwenden. Gruß Kostas |
AW: Fastreport eine Textdatei laden
TFile.ReadAllText gibt es natürlich als Unicode zurück (Result = String) und der Compiler sollte jetzt meckern, daß da eventuell ein Datenverlust eintreten könnte (UnicodeString => AnsiString).
Drum hatte ich auch einfach mal "blind" .Text verwendet, für die Zuweisung. Im Prinzip macht er das Selbe, wie auch die TStringList beim Laden. Die Datei in einen Puffer laden, Diesen via TEncoding decodieren und dann den UnicodeString an das Result übergeben. (die TStringList zerlegt dann nur noch den UnicodeString in einzelne Zeilen) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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