Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Memo.Text := Ansistring? nur wie (https://www.delphipraxis.net/127085-memo-text-%3D-ansistring-nur-wie.html)

emsländer 7. Jan 2009 15:15


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

SirThornberry 7. Jan 2009 15:23

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.

mkinzler 7. Jan 2009 15:32

Re: Memo.Text := Ansistring? nur wie
 
Du kannst einer Stringvariablen problemlos einen AnsiString zuweisen. Umgekehrt kann es natürlich Probleme geben

emsländer 7. Jan 2009 15:45

Re: Memo.Text := Ansistring? nur wie
 
Zitat:

Zitat von mkinzler
Du kannst einer Stringvariablen problemlos einen AnsiString zuweisen. Umgekehrt kann es natürlich Probleme geben

nö - geht in der Form leider nicht. Da kommt nur MMüll bei rum, weil der Inhalt des Ansistrings ein verschlüsseter Text ist!

auch mit move geht es nicht - kracht mit einer Access Violation weg.

Delphi-Quellcode:
  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;
wie bringe ich das in eine lauffähige Version?

Gruss

EL

Luckie 7. Jan 2009 16:30

Re: Memo.Text := Ansistring? nur wie
 
Zitat:

Zitat von emsländer
nö - geht in der Form leider nicht. Da kommt nur MMüll bei rum, weil der Inhalt des Ansistrings ein verschlüsseter Text ist!

Kann es sein, dass die Zeichenkette nicht darstellbare Zeichen, wie zum Beispiel Steuerzeichen, enthält?

jbg 7. Jan 2009 16:31

Re: Memo.Text := Ansistring? nur wie
 
[quote="emsländer"]
Delphi-Quellcode:
  if odlg.Execute then begin
    fs := TFileStream.Create(odlg.FileName, fmOpenRead    or fmShareDenyWrite);
    fs.Position := 0;   // File in den String-Stream schreiben
Das ist ja wie "Query.Open;Query.First". Wo steht man denn wohl, wenn man die Datei gerade geöffnet hat.


Zitat:

Delphi-Quellcode:
    sstream := TStringStream.Create;

TStringStream ist bereits ein Unicode-String-Stream. Das wird so also nicht klappen, außer du hast einen UTF16 Text in der Datei.

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;

SirThornberry 7. Jan 2009 16:36

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)

emsländer 7. Jan 2009 16:43

Re: Memo.Text := Ansistring? nur wie
 
Zitat:

Zitat von jbg

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;

Auch das funktioniert nicht und ich habe nur das erste Zeichen von über 8000 im Memo.

Gruss

EL

jbg 7. Jan 2009 16:48

Re: Memo.Text := Ansistring? nur wie
 
Zitat:

Zitat von emsländer
Auch das funktioniert nicht und ich habe nur das erste Zeichen von über 8000 im Memo.

Dann frage ich mal ganz dumm, was steht denn in der Datei (Hex-Edit) Wenn das zweite Zeichen ein #0 ist, dann ist klar, dass da nichts bei rauskommt.

emsländer 7. Jan 2009 16:53

Re: Memo.Text := Ansistring? nur wie
 
Zitat:

Zitat von jbg
Zitat:

Zitat von emsländer
Auch das funktioniert nicht und ich habe nur das erste Zeichen von über 8000 im Memo.

Dann frage ich mal ganz dumm, was steht denn in der Datei (Hex-Edit) Wenn das zweite Zeichen ein #0 ist, dann ist klar, dass da nichts bei rauskommt.

Das zweite Zeichen ist 0 - nur wenn ich die Datei wie vorher beschreiben eingelesen habe, dann war die komplett in dem AnsiString drin. Und das muss in einen normalen String rein. Das ging bei D2008 problemlos - ist ein älteres Projekt.

Gruss

EL


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 Uhr.
Seite 1 von 3  1 23      

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