Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi StringList LoadFromFile -> Memo soll Inhalt anzeigen (https://www.delphipraxis.net/181604-stringlist-loadfromfile-memo-soll-inhalt-anzeigen.html)

Alex_ITA01 28. Aug 2014 13:10


StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
im Anhang ist eine Textdatei, die ich wie folgt lade:

Delphi-Quellcode:
MyStringList.LoadFromFile(Dateiname);
Memo1.Lines.Text := MyStringList.Text;
MyStringList ist vom Typ TStringList und ist auch initialisiert.
Diese Stringliste wird benötigt, da ich diese noch woanders verwende.

Der Inhalt der Datei soll in dem Memo angezeigt werden nur leider wird nach einer bestimmten Stelle in der Zeile 2 abgebrochen (nach der "...62"). Ich weiß allerdings nicht warum, habt ihr eine Idee?

Gruß


Edit:
nach der ...62 kommt Hex 00 01
Das habe ich grad im Hexeditor gesehen.
Das 01 steht für SOH.
ich möchte aber wie in der Datei wirklich vorhanden ist auch darstellen.

Alex_ITA01 28. Aug 2014 13:30

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Anscheind kommt die StringList mit Steuerzeichen nicht klar.
Wie kann ich es irgendwie hinbekommen das die Steuerzeichen beim einlesen evtl. ignoriert werden oder ähnliches, da ich die StringList wirklich benötige (Funktionen wie Clear, Count usw. werden alle gebraucht).

Grüße

Union 28. Aug 2014 13:32

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Das Null-Byte wird aber als Stringende interpretiert. Du solltest Die Datei über einen Stream einlesen und jedes Byte in einen Hexcode umwandeln. Das kannst Du dann in das Memo schreiben. Alternativ könntest Du auch nur die Zeichen mit einem Code < 32 in eine andere Notation wandeln (z.b. $00) und dann in den Text einmischen.

Eine Stringlist hat eben diese Einschränkungen, dass diese Seuerzeichen interpretiert werden. Wenn Du das nicht willst, musst Du Dir eine eigene Stringliste schreiben.

himitsu 28. Aug 2014 13:33

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Erstmal muß man beim Laden in die TStringList auf das PChar #0 achten, denn das wird eventuell als Endemarker interpreteirt.

Und dann nutzt seit 2009 die TStirngList ein Encoding, welches standardmäßig den Text von ANSI nach Unicode umwandelt.



Also,

Textdaten in TStringList oder TStringStream = OK (man sollte eventuell das Encoding beachten, wenn nicht ANSI und kein BOM vorhanden)
Binärdaten = böst, es geht nicht alles und wenn man es dennoch versucht, dann muß man halt Einiges beachten



PS: Selbst wenn die TStringList die #0 nicht beachtet ... das Memo hört da dennoch auf, da PChar-API.

Alex_ITA01 28. Aug 2014 13:48

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Das ist ja echt blöd...

@Embacadero:
Hiermit beantrage ich mal eine Funktion, die das kann. Das wäre ja mal was, was auch jemand braucht/gebrauchen kann. Könnt ihr ja mal nachdenken in XE7 nachzurüsten. Ansonsten lohnen sich nämlich eure neuen Versionen für mich leider überhaupt nicht, da ich nur für Win32/64 programmiere.

Also, denkt mal über Änderungen an diesen Sachen nach und nicht immer den anderen Plattformen nachrennen...

Grüße

Sir Rufo 28. Aug 2014 13:59

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Ja so eine DeveloperMind API. Eine Komponente draufklatschen und schon macht das Programm das, was sich der Entwickler gedacht hat. Das würde die Entwicklungszeiten erheblich verküzen. :roll:

Alex_ITA01 28. Aug 2014 14:02

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
ok, soweit muss es ja in XE7 noch nicht gehen.
Irgendwas soll ja in XE8 auch noch implementiert werden ;-)

Nein aber im Ernst, man könnte der Stringliste ja irgendwie eine Eigenschaft verpassen "UseControlChars"...

Viele Grüße

Sir Rufo 28. Aug 2014 14:07

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Oder man berücksichtigt das, was dort in der Datei gespeichert ist und das ist eben nicht nur Text.

Spätestens jetzt sollte hier das :idea: angehen, dass man diese Datei eben nicht so behandeln kann, als wäre da nur Text drin.

Union 28. Aug 2014 14:09

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Du kriegst das dann aber trotzdem nicht angezeigt, da der Text in das Memo per WM_SETTEXT übertragen wird. Und diese Nachricht übermittelt die Adresse eines PChar an das Betriebssystem.

Alex_ITA01 28. Aug 2014 14:10

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Verstanden habe ich es schon :idea:

Schön wäre es ja trotzdem wenn es geht :-D

Egal jetzt. Thema ist durch :thumb:

himitsu 28. Aug 2014 14:17

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Delphi-Quellcode:
MyStringList.LoadFromFile(Dateiname);
Memo1.Lines.Text := MyStringList.Text;

// oder

MyStringList.LoadFromFile(Dateiname);
Memo1.Lines.Assign(MyStringList);

// oder

MyStringList.LoadFromFile(Dateiname);
Memo1.Lines.Clear;
Memo1.Lines.AddStrings(MyStringList);

// oder einfach nur

Memo1.Lines.LoadFromFile(Dateiname);
Beim LoadFromFile siehe Encoding-Parameter.


Und daß das Memo bei #0 aufhört, ist völlig normal ... es ist eine Sache der WinAPI und da kann Emba auch rein garnichts machen.
Es währe grob fahrlässig, wenn Emba hier einfach eine Zeichenkonvertierung in die TStringList einbaut, nur weil du keine Lust hast die Daten richtig zu laden und notfalls "ungültige" Zeichen zu ersetzen.

Neutral General 28. Aug 2014 14:21

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Was willst du überhaupt angezeigt haben?
Und wofür? Ich hab so das Gefühl dass dein ganzer Steuerzeichen-Kram nicht so das Wahre ist.

Oder anders gefragt: Was hast du überhaupt vor in deinem Projekt?

Alex_ITA01 28. Aug 2014 14:26

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Eins vorab:
Ich habs verstanden warum es nicht geht und hoffe keine weitere Diskussion draus zu machen.

Es liegen mir eben manchmal Dateien vor, die Steuerzeichen enthalten und manchmal eben nicht.
Ich möchte aber mit ein und der selben Routine, diese Datei einlesen und anzeigen.

Ich möchte eben auch die Funktionen wie Delete, Count usw. einer TStringList nehmen, deswegen gehe ich auch über die TStringList.

Wichtig für mich sind nicht die Steuerzeichen anzuzeigen oder kryptische Zeichen, ich will den normalen Text, der dahinter vielleicht wieder kommt sehen.

Ich könnte mir also die TStringList überschreiben und beim Laden evtl. vorhandene Steuerzeichen einfach raus löschen.
Ich will die ja gar nicht haben/sehen.

Grüße

Sir Rufo 28. Aug 2014 14:28

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Wenn so ein Dateiinhalt angezeigt werden soll, dann muss man sich in Abhängigkeit von der verwendeten Anzeigekomponente um die Präsentierung der Daten kümmern.

Ein TMemo kann nur Text anzeigen und bei einem #0 wird alles danach verworfen (nicht angezeigt).
Also kann man für die Anzeige diese #0 durch etwas anderes ersetzen (z.B. mit
Delphi-Quellcode:
'#00'
). Das eignet sich natürlich nicht mehr zum Bearbeiten.

Oder man bemüht eine andere Komponente (im Zweifelsfall muss man sich eine selber erstellen), die dass dann so anzeigt, wie es Notepad++ macht.

Alex_ITA01 28. Aug 2014 14:30

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Ich will es doch gar nicht anzeigen !!
:twisted:

Sir Rufo 28. Aug 2014 14:31

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1270160)
Es liegen mir eben manchmal Dateien vor, die Steuerzeichen enthalten und manchmal eben nicht.
Ich möchte aber mit ein und der selben Routine, diese Datei einlesen und anzeigen.

Niemand hält dich davon ab, alle Daten zunächst durch eine Methode zu jagen, wo alle unliebsamen Steuerzeichen entfernt werden (wenn die unnötig sind).

Sind keine enthalten, werden die auch nicht entfernt.

himitsu 28. Aug 2014 14:44

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Es gibt nunmal einige Zeichen, die nicht "darstellbar" sind.

Das sind vorallem die Contols C0 (also alles vor dem Leerzeichen > #0 bis #31)
und auch im Controls C1 (#128..#159) sind manchmal solche Zeichen drin. (je nach Codepage, bzw. Interpreter)

http://www.unicode.org/charts/

Und weiter oben im Unicode gibt es ebenfalls bestimmte Bereiche, wo dieses gilt.
Vorallem siehe unten die komplette rechte Spalte (Specials bis Noncharacters in Charts)

Für die Contols C0 gibt es "sichtbare" Zeichen, welche man als Ersatz für die Steuerzeichen nutzen kann, wenn man sie anzeigen will.
Technical Symbols > Control Pictures



Steuercodes sind Steuercodes. Sie steuern also irgendwas und (standardmäßig) zeigen nichts an, jenachdem wer sie ob und wie interpretiert.

Und dann kommt es auch noch auf die verwendete Schriftart und registrierte Weiterleitungen drauf an, welche Zeichen letztendlich tatsächlich darstellbar sind.

DeddyH 28. Aug 2014 14:46

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Du willst es in ein Memo schreiben, aber nicht anzeigen? :gruebel:

Alex_ITA01 28. Aug 2014 14:48

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Ja ich will die Datei im Memo anzeigen und nein, ich will in dem Memo die Steuerzeichen nicht sehen.

Ich werde jetzt einfach vor dem Laden der Datei prüfen, ob ich Steuerzeichen darin finde, diese dann ggf. rauslöschen und wieder meine Stringlist Routine zum einlesen nehmen.

Grüße

DeddyH 28. Aug 2014 14:51

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Das ist doch im Wesentlichen das, was Sir Rufo beschrieben hat.

Alex_ITA01 28. Aug 2014 15:00

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
genau :thumb:

Und deswegen hat sich das Thema auch für mich jetzt erledigt ;-)

hoika 28. Aug 2014 15:59

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Hallo,

ich muss trotzdem meinen Senf hinzugeben.

über einen TFileStream die Datei laden,
rein in einen TMemoryStream.
Jetzt den MemStream durchlaufen und sämtliche Sonderzeichen rauswerfen,
besonders ja das #0.

siehe auch
http://stackoverflow.com/questions/8...-tmemorystream

Und dada -> ein ins Memo.

Warum soll das mit ein bisschen Coderei nicht gehen.

BTW:
Stream gibt es mindestens seit Delphi 1 ...


Heiko

p80286 28. Aug 2014 17:34

AW: StringList LoadFromFile -> Memo soll Inhalt anzeigen
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1270146)

@Embacadero:
Hiermit beantrage ich mal eine Funktion, die das kann. Das wäre ja mal was, was auch jemand braucht/gebrauchen kann.

Das gibt es schon längst, nennt sich Stream. Und auf diesen Stream wird dann ein entsprechender Interpreter losgelassen.
Was Du willst, sind die Funktionalitäten eines Hex-Editors gleich in Notepad eingebaut.

Vielleicht wäre es sinnvoll mal zu beschreiben was Du eigentlich vorhast.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz