Autor Beitrag
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 25.03.05 00:54 
Ausgehend von meiner Funktion
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 25.03.05 01:31 
Ich hab nochmal etwas gearbeitet und bin bei folgendem jetzt vorerst stehengeblieben:

ausblenden volle Höhe 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:
31:
Procedure TOVFSStream.ReadPWideChar(Var Buffer: PWideChar);
Var
    X: DWORD;
    Len: DWORD;
    Data: Array of WideChar;
    WC: PWideChar;
    WCD: WideChar;
Begin
    //TODO -oBenBE -cVFS, Stream : Implement ReadPWideChar for Delphi 5
    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:
ausblenden 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; VirtualAbstract;
        Function Write(Const Buffer; Count: StreamInt): StreamInt; VirtualAbstract;
        Function Seek(Offset: StreamInt; Origin: Word): StreamInt; VirtualAbstract;

        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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.