| Autor |
Beitrag |
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 24.03.05 23:45
Ist es möglich (ohne ändern von Compiler-Schaltern) WideStrings unter Delphi 5 zu nutzn?
Konkret geht es darum, einen PWideChar bzw. einen WideString aus einer Datei zu lesen (eigene Lesefunktionen), komme da aber nicht weiter, da er mir beim Anhängen der neuen Zeichen eine ungültige Operation anmeckert. Unter D6 und D7 existieren die Probleme mit dem gleichen SRC AFAIK nicht.
SRC-Schnipsel wird wenn nötig nachgereicht.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Fr 25.03.05 00:38
In meinen ActiveX Controlls verwende ich WideStrings und konnte bis jetzt noch einen Fehler finden. Aber wenn du sagst, dass es unter D6 und D7 läuft und unter D5 nicht, dann ist der Fehler doch auch reproduzierbar. Also dann könntest du hier doch ein Beispiel posten.
_________________ Ciao, Sprint.
|
|
BenBE 
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 25.03.05 00:54
Ausgehend von meiner Funktion Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Procedure TOVFSStream.ReadPAnsiChar(Var Buffer: PAnsiChar); Var TmpC: AnsiChar; Begin Buffer := Nil; While TmpC <> #0 Do Begin ReadAnsiChar(TmpC); Buffer := StrCat(Buffer, PAnsiChar(AnsiString(TmpC))); End; End; | die zwar noch nicht optimal implementiert ist, aber soweit funzen sollte, hab ich das Versucht nach PWideChar zu Übertragen, aber hab keine Support-Funktionen für WideChar-Operationen gefunden, mit denen ich das zusammensetzen durchführen kann: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Procedure TOVFSStream.ReadPWideChar(Var Buffer: PWideChar); Var TmpB: PWideChar; Begin TmpB := Buffer; Repeat ReadWideChar(TmpB^); Inc(TmpB); Until TmpB^ = #0; End; | Fehlt jetzt nur noch die Speicheralloziierung in der Routine. Da ich aber (bis jetzt) nie mit WideChars gearbeitet hab (und bei Delphi keine PWideChar-Funktionen finden konnte, weiß ich net, wie dat von Delphi gehandhabt wird mit den Speicherstrukturen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
BenBE 
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 25.03.05 01:31
Ich hab nochmal etwas gearbeitet und bin bei folgendem jetzt vorerst stehengeblieben:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| Procedure TOVFSStream.ReadPWideChar(Var Buffer: PWideChar); Var X: DWORD; Len: DWORD; Data: Array of WideChar; WC: PWideChar; WCD: WideChar; Begin Len := 4096; SetLength(Data, Len);
X := 0; WC := @Data[X];
Repeat ReadWideChar(WCD); WC^ := WCD; If X = Len - 1 Then Begin SetLength(Data, Len * 2); Len := Len * 2; WC := @Data[X]; end; Inc(WC); Inc(X); Until WCD = #0;
GetMem(Buffer, X * SizeOf(WideChar)); Move(Data[0], Buffer^, X * SizeOf(WideChar)); End; |
Damit bin ich aber noch nicht wirklich zufrieden ... Geht das noch irgendwie einfacher und effektiver?
Anm.: Es stehen zum Lesen von Daten folgende Funktionen zur Verwendung bereit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| Function Read(Var Buffer; Count: StreamInt): StreamInt; Virtual; Abstract; Function Write(Const Buffer; Count: StreamInt): StreamInt; Virtual; Abstract; Function Seek(Offset: StreamInt; Origin: Word): StreamInt; Virtual; Abstract;
Procedure ReadBuffer(Var Buffer; Count: StreamInt); Procedure WriteBuffer(Const Buffer; Count: StreamInt);
Procedure ReadByte(Var Buffer: Byte); Procedure ReadWord(Var Buffer: Word); Procedure ReadDWORD(Var Buffer: DWORD); Procedure ReadSmallInt(Var Buffer: SmallInt); Procedure ReadShortInt(Var Buffer: Shortint); Procedure ReadLongInt(Var Buffer: Longint); Procedure ReadInt64(Var Buffer: Int64); Procedure ReadSingle(Var Buffer: Single); Procedure ReadDouble(Var Buffer: Double); Procedure ReadExtended(Var Buffer: Extended); Procedure ReadChar(Var Buffer: Char); Procedure ReadAnsiChar(Var Buffer: AnsiChar); Procedure ReadWideChar(Var Buffer: WideChar); Procedure ReadPChar(Var Buffer: PChar); Procedure ReadPAnsiChar(Var Buffer: PAnsiChar); Procedure ReadPWideChar(Var Buffer: PWideChar); Procedure ReadString(Var Buffer: String); Procedure ReadStringA(Var Buffer: AnsiString); Procedure ReadStringW(Var Buffer: WideString); Procedure ReadBoolean(Var Buffer: Boolean); Procedure ReadByteBool(Var Buffer: ByteBool); Procedure ReadWordBool(Var Buffer: WordBool); Procedure ReadLongBool(Var Buffer: LongBool); |
Seek sollte vermieden werden, da später auch Decompression-Streams als Quelle dienen könnten und das Suchen dort langwierig ist.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
BenBE 
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 28.01.09 19:07
Hat jemand noch für die genannte Routine einen verbesserungsvorschlag, da die irgendwie noch nicht so nach meinem Geschmack aussieht ... Oder ist der WideChar-Support unter D5 wirklich so bescheiden?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|