![]() |
Memo.Text := Ansistring? nur wie
Salvete,
Ich bekomme wegen dem Ansikram graue Haare. Wie bekomme ich den Inhalt eines Ansistring in z.B. Memo.text oder eine normale string-Variable und umgekehrt? D2009 ist da ja recht brutal! Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Ich würde es mit move probieren. Wenn der String jedoch ein Unicodestring ist sollte es mit CharToWideChar oder so ähnlich funktionieren.
|
Re: Memo.Text := Ansistring? nur wie
Du kannst einer Stringvariablen problemlos einen AnsiString zuweisen. Umgekehrt kann es natürlich Probleme geben
|
Re: Memo.Text := Ansistring? nur wie
Zitat:
auch mit move geht es nicht - kracht mit einer Access Violation weg.
Delphi-Quellcode:
wie bringe ich das in eine lauffähige Version?
if odlg.Execute then begin
fs := TFileStream.Create(odlg.FileName, fmOpenRead or fmShareDenyWrite); fs.Position := 0; // File in den String-Stream schreiben sstream := TStringStream.Create; sStream.CopyFrom(fs,fs.size); ansitmp := sStream.DataString; move(ansitmp,stmp,length(ansitmp)); memo1.text := stmp; freeandnil(sstream); freeandnil(fs); end; Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Zitat:
|
Re: Memo.Text := Ansistring? nur wie
[quote="emsländer"]
Delphi-Quellcode:
Das ist ja wie "Query.Open;Query.First". Wo steht man denn wohl, wenn man die Datei gerade geöffnet hat.
if odlg.Execute then begin
fs := TFileStream.Create(odlg.FileName, fmOpenRead or fmShareDenyWrite); fs.Position := 0; // File in den String-Stream schreiben Zitat:
Warum nicht einfach so einlesen:
Delphi-Quellcode:
var
Stream: TFileStream; AnsiTemp: AnsiString; begin ... Stream := TFileStream.Create(odlg.FileName, fmOpenRead or fmShareDenyWrite); try SetLength(AnsiTemp, Stream.Size); if AnsiTemp <> '' then Stream.Read(AnsiTemp[1], Stream.Size); finally Stream.Free; end; Memo1.Lines.Text := string(AnsiTemp); // hier findet ein Aufruf von MultiByteToWideChar() statt end; |
Re: Memo.Text := Ansistring? nur wie
das es bei move kracht liegt daran was du übergibst. Du übergibst ja sozusagen den Pointer und nicht das worauf dieser zeigt (Strings sind ja nicht die Daten an sich sondern ein Gebilde was auf Daten zeigt)
|
Re: Memo.Text := Ansistring? nur wie
Zitat:
Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Zitat:
|
Re: Memo.Text := Ansistring? nur wie
Zitat:
Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Zitat:
Zitat:
Wie du den Codierten Text in einen UnicodeString überträgst, musst du dir noch überlegen. Am besten dekodierst du ihn vor der Konvertierung oder du nutzt nur AnsiString für ihn. |
Re: Memo.Text := Ansistring? nur wie
Zitat:
Wie gesagt, vorher hat mein Programm (besteht aus 45 einzelnen Units und Forms und über 100.000 Zeilen Code) so funktioniert. Diese Datei, die ich da einlese ist mittels JVCeasar verschlüsselt. Ich habe sie immer auf diese Art und Weise eingelesen und dann entschlüsselt - und voila - die in der Datei versteckten XML-Daten waren einwandfrei zu lesen. Mit D2009 klappt das jetzt so nicht mehr! Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Zitat:
Zitat:
|
Re: Memo.Text := Ansistring? nur wie
Zitat:
Bis zum Enschlüsselungscode komme ich ja:
Delphi-Quellcode:
var ansitmp : ansistring;
stmp : string; begin ansitmp := einlesen ... ; => Hier kann ich den kompletten Inhalt im Debugger sehen. stmp := ansitmp; oder alle bisher getesteten Funktionen - nichts funktioniert. Es ist nur das erste Zeichen da. result := entschlüsselung; .... bisher kein Thema, aber im Moment komme ich gar nicht erst hier hin. end; Es muss doch "verdammtnochmal" ne Möglichkeit geben, um das Zeugs in einen String zu packen! Gruss EL Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Zitat:
Zitat:
|
Re: Memo.Text := Ansistring? nur wie
Zitat:
Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Zitat:
Wie schreibst du denn die Daten in die Datei? |
Re: Memo.Text := Ansistring? nur wie
Zitat:
Delphi-Quellcode:
Gruss
try
HttpCon.Post(sURL,strLParam,_sstream); except raise; end; sfiledata := _sstream.DataString; freeandnil(_sstream); _codiert := JvCaesarcipher.EncodeString(fddschl,sfiledata); fs := TFilestream.Create(sTmpFileName,fmCreate or fmShareDenyWrite); try fs.Position := 0; fs.Write(Pointer(_codiert)^,Length(_codiert)); finally freeandnil(fs); end; close; end; EL |
Re: Memo.Text := Ansistring? nur wie
_codiert hast welchen Datentyp?
|
Re: Memo.Text := Ansistring? nur wie
Zitat:
Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Zitat:
EncodeString liefert einen (kodierten) AnsiString zurück. Mit der Zuweisung an _codiert, werden nun Zeichen größer #127 falsch umgesetzt. Und beim Schreiben in die Datei wird nur die Hälfte der Daten geschrieben: Length(_codiert) <> ByteLength(_codiert) |
Re: Memo.Text := Ansistring? nur wie
Zitat:
Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Zitat:
Was du mit Delphi 1-2007 geschrieben hast, kannst du komplett über AnsiString abhandeln. Für das Schreiben reicht es aus, wenn du _codiert als AnsiString deklarierst. Du solltest aber noch prüfen, ob die Daten, die aus dem StringStream zurück kommen auch richtig sind (bei Indy bin ich mir nicht sicher, was die intern so alles mit den Daten anstellen)
Delphi-Quellcode:
uses
JclStrings; var _codiert: AnsiString; sfiledata: string; // = UnicodeString begin ... _codiert := JvCaesarcipher.EncodeString(fddschl, AnsiString(sfiledata)); StringToFile(sTmpFileName, _codiert); end; Beim Lesen darft du erst in einen UnicodeString konvertieren, wenn die Daten bereits entschlüsselt sind:
Delphi-Quellcode:
uses
JclStrings; var Stream: TFileStream; _codiert: AnsiString; sfiledata: string; // = UnicodeString begin _codiert := FileToString(odlg.FileName); sfiledata := string(JvCaesarcipher.DecodeString(fddschl, _codiert)); Memo1.Lines.Text := sfiledata; end; |
Re: Memo.Text := Ansistring? nur wie
Kann es sein, dass du sämtliche String-Warnungen abgeschaltet hast? Denn der Compiler wirft überall, wo du eine implizite Konvertierung von UnicodeString nach AnsiString und andersherum machst, eine Warnung.
|
Re: Memo.Text := Ansistring? nur wie
Zitat:
Vor dem decodieren sieht der codierte String ganz gut aus.... Zitat:
Gruss EL |
Re: Memo.Text := Ansistring? nur wie
Also folgender Code funktioniert bei mir:
Delphi-Quellcode:
var
_codiert: AnsiString; sfiledata: string; // = UnicodeString fddschl: string; sTmpFileName: string; begin sTmpFileName := 'C:\Testdata\Test.txt'; // *** anpassen *** sfiledata := '<xml>'#10'Hallo du Ärger'#10'</xml>'; fddschl := '12'; // write _codiert := JvCaesarcipher.EncodeString(fddschl, AnsiString(sfiledata)); StringToFile(sTmpFileName, _codiert); // read _codiert := FileToString(sTmpFileName); sfiledata := string(JvCaesarcipher.DecodeString(fddschl, _codiert)); Memo1.Lines.Text := sfiledata; end; |
Re: Memo.Text := Ansistring? nur wie
Zitat:
Ich mache noch ein paar Tests - Tests haben funktioniert. Alles Bestens! Vielen Dank für Deine Hilfe Gruss EL |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:17 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