Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Prism Problem bei ReadBuffer ;( (https://www.delphipraxis.net/27568-problem-bei-readbuffer-%3B.html)

Curse4Life 12. Aug 2004 10:16


Problem bei ReadBuffer ;(
 
Hi, ich habe jetzt seit ein paar Tagen .net und arbeite jetzt ein wenig damit.
So wollte ich eine alte Unit von mir in einer VLC Anwendung verwenden, hat auch vieles geklappt, aber bei dieser Procedure bekomme ich einen Fehler:

Delphi-Quellcode:
procedure BIB_FileReplaceString(FileName, searchstring, replacestring: string);
var
  fs: TFileStream;
  S: string;
begin
   // Erstellen der Variablen für die Datei
   fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
   try
      SetLength(S, fs.Size);
      fs.ReadBuffer(S[1], fs.Size);
   finally
      fs.Free;
   end;

   // Ersetzen des Textes
   S := StringReplace(S, SearchString, replaceString, [rfIgnoreCase]);
   fs := TFileStream.Create(FileName, fmCreate);
   try
      fs.WriteBuffer(S[1], Length(S));
   finally
      fs.Free;
   end;
end;

Durch ausschneiden compilieren, ausschneiden kompilieren habe ich den Fehler gefunden, es liegt an dieser Zeile:
Delphi-Quellcode:
fs.ReadBuffer(S[1], fs.Size);

Die Fehlermeldung lautet:
[Error] BIB_Dateibearbeitung.pas(253): String element cannot be passed to var parameter


Ich hoffe jemand kann mir helfen


mfg
Curse4Life

neolithos 12. Aug 2004 10:22

Re: Problem bei ReadBuffer ;(
 
Delphi-Quellcode:
procedure BIB_FileReplaceString(FileName, searchstring, replacestring: string);
var
  fs: TFileStream;
  S: string;
begin
   // Erstellen der Variablen für die Datei
   fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
   try
      SetLength(S, fs.Size);
      fs.Read(PChar(S)^, fs.Size);
   finally
      fs.Free;
   end;

   // Ersetzen des Textes
   S := StringReplace(S, SearchString, replaceString, [rfIgnoreCase]);
   fs := TFileStream.Create(FileName, fmCreate);
   try
      fs.Write(PChar(S)^, Length(S));
   finally
      fs.Free;
   end;
end;
Ich würde das so gestalten. Denn hinter einen Long-String steht eigentlich ein PChar.

Curse4Life 12. Aug 2004 11:19

Re: Problem bei ReadBuffer ;(
 
Deine Variante funktioniert leider nicht! ;(

neolithos 12. Aug 2004 11:30

Re: Problem bei ReadBuffer ;(
 
Was funktioniert wie nicht, etwas genauer bitte?

Curse4Life 12. Aug 2004 11:38

Re: Problem bei ReadBuffer ;(
 
Diese Fehlermeldung bei der Zeile mit dem Read

[Error] BIB_Dateibearbeitung.pas(240): Invalid typecast


mfg

neolithos 12. Aug 2004 12:07

Re: Problem bei ReadBuffer ;(
 
Kann ich leider mit Delphi7 Prof nicht nachvollziehen.

Delphi-Quellcode:
  aStream.Read(PChar(Result)^, dwLen);
Result : String;
dwLen : Cardinal;

Funktioniert einwandfrei. :gruebel:

Welche Delphiversion?

Curse4Life 12. Aug 2004 12:08

Re: Problem bei ReadBuffer ;(
 
8, .net eben :)


mfg

neolithos 12. Aug 2004 14:58

Re: Problem bei ReadBuffer ;(
 
Da geht es natürlich nicht!

-> Delphiversion angegeben!!!

Mit D8 kenne ich mich nicht aus! Das einzige was ich mache ich C#.

Schau mal nach der Convert-Klasse. Binärstrom.

sakura 12. Aug 2004 15:05

Re: Problem bei ReadBuffer ;(
 
Zitat:

Zitat von neolithos
-> Delphiversion angegeben!!!

Hm, ist doch die Delphi.NET Sparte :roll:

...:cat:...

Dannyboy 12. Aug 2004 15:20

Re: Problem bei ReadBuffer ;(
 
Zitat:

fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
Muss die Datei in diesem Fall nicht zum Schreiben geöffnet sein? :gruebel:
Ich kenne mich nur mit read und write aus, jedoch nicht mit readBuffer
und writeBuffer.
DANNYBOY

sakura 12. Aug 2004 16:15

Re: Problem bei ReadBuffer ;(
 
Also für das Lesen geht es unter .NET wie folgend:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  TByteArray = array of Byte;
var
  FileStream: TFileStream;
  ByteArray: TByteArray;
begin
  FileStream := TFileStream.Create('C:\Temp\dp.txt', fmOpenRead or fmShareDenyNone);
  try
    SetLength(ByteArray, FileStream.Size);
    FileStream.ReadBuffer(ByteArray, FileStream.Size);
    Caption := System.Convert.ToString(ByteArray);
  finally
    FileStream.Free;
  end;
end;
Schreiben sollte analog dazu sein ;)

...:cat:...

Memo 12. Aug 2004 16:25

Re: Problem bei ReadBuffer ;(
 
Das wusste er schon. :?

sakura 12. Aug 2004 16:28

Re: Problem bei ReadBuffer ;(
 
Zitat:

Zitat von Memo

Danke :?

@Curse4Life: Wir haben in der DP nichts gegen sogenannte Cross-Postings, aber wir würden schon gerne die Lösung erfahren (oder einen Link dahin), wenn Du diese woanders bekommst.

...:cat:...

GuenterS 12. Aug 2004 17:21

Re: Problem bei ReadBuffer ;(
 
Es ist leider nicht möglich, alte D7 Sourcen in D8 zu verwenden, da einige Methoden von Klassen anders auch mit anderen Parametern implementiert wurden. Soviel zu dem, dass man die Schnittstellen nicht verändern sollte.

Gerade diese FileStream Methode hat es leider ziemlich verändert, schau dir da einmal die genaue Deklaration an. Ich denke das wird aufschlussreich sein.

Curse4Life 12. Aug 2004 23:53

Re: Problem bei ReadBuffer ;(
 
Tut mir leid, dass nächste mal werde ich die Lösung dann hier sofort posten!


mfg

Robert_G 13. Aug 2004 19:24

Re: Problem bei ReadBuffer ;(
 
Warum macht ihr euch das so schwer?
Eine Datei in einen String zu lesen ist unter .Net ein Einzeiler (solange man diese komischen VCL.Net -klassen nicht verwendet :? ).


Die erste Möglichkeit kommt IMHO aus dem Framework 2.0, die zweite sollte aber sogar mit Delphi8 funktionieren (die 2. ist eigentlich ein Zweizeiler ;) ):
Delphi-Quellcode:
  strTextFile := System.IO.File.OpenText(strPath2TextFile).ReadToEnd();
Delphi-Quellcode:
  strTextFile := System.IO.StreamReader.Create(strPath2TextFile, true).ReadToEnd();
In beiden Fällen kann man einfach durch StreamReader.ReadToEnd den gesamten Stream als ein String bekommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 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