Autor Beitrag
AndrewPoison
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17


Turbo Delphi 2006, Delphi 2009
BeitragVerfasst: Sa 01.08.09 07:57 
Exemplarisch ist mal folgender Code gegeben - das Problem tritt jedoch grundsätzlich mit vielen Programmen auf, die mit Pointern/Windows-API und dergleichen arbeiten:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
 istr: string;
 isize, i: dword;
begin
  setlength(istr, 4000);
  isize := QueryDosDevice(nil, @istr[1], 4000);
  for i := 1 to isize do
    if istr[i] = #0 then istr[i] := #10;
  memo1.lines.CommaText := istr;
end;


Delphi 2009 spuckt mir bei der Ausgabe nur ein "Global" in das TMemo aus, während Turbo Delphi 2006 - auf dem selben Rechner natürlich - mir in drei Zeilen "rm1", "Form1" und "Left" ausgibt. Mal ganz abgesehen davon, dass beide Ausgaben nicht so richtig dass sind, was sie seien sollten: Delphi 2009 macht bei sowas immer die meisten Fehler. Hab leider grad kein Beispiel zur Hand wo man ganz eindeutig sehen kann, dass D2006 richtige und D2009 falsche Ergebnisse liefert.

Woran liegt das? Viele meiner API-Intensiven Anwendungen kann ich nicht in Delphi 2009 compilieren, weil die Anwendung danach nicht mehr läuft und die seltsamsten Fehler auftreten. Habe auch schon die Compiler-Einstellungen der beiden geprüft und angeglichen, sie sind jetzt identisch - dennoch produzieren sie unterschiedliche Ergebnisse.

Ich bin ja der Meinung, dass es an Delphi 2009 liegen muss, da alle anderen Versionen von Delphi die ich hatte sich niemals so verhalten haben. Auch eine Neuinstallation vom 2009er Delphi lies mich keine Veränderung feststellen.

Ich hab jetzt sozusagen "Angst", dass die irgendwas in der IDE/dem Compiler absichtlich verändert haben was dieses Verhalten hervorruft und was dann auch in den kommenden Delphi-Versionen so bleibt.

Möchte eigentlich nur so schnell wie möglich weg von 2 Delphi-Versionen auf einem System, da die sich immer so ein wenig beißen, und wollte wegen der Komponenten-Vielfalt, den Spracherweiterungen und der Erweiterbarkeit eigentlich mit D2009 arbeiten - aber so wird das nichts.

Also: hat jemand einen Tipp woran es liegen könnte? An der Parallel-Installation von D2006 und D2009 liegt es nicht, da ich das 2006er erst testweise installiert hatte, als das 2009er eben diese seltsamen Dinge machte.

Moderiert von user profile iconmatze: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 01.08.09 08:21 
Delphi 2009 benutzt Unicode. Deshalb ist ein Zeichen 2 Byte groß. Bis Delphi 2007 ist ein String ein AnsiString mit AnsiChars mit der Größe 1 Byte, ab Delphi 2009 ein UnicodeString mit Chars mit einer Größe von 2 Byte.

Mehr dazu gibt es im Internet, u.a. von Nick Hodges hier:
edn.embarcadero.com/article/38437
edn.embarcadero.com/article/38498
edn.embarcadero.com/article/38693

Probleme gibt es immer dann, wenn man zeichenweise oder byteweise auf Strings zugreift ohne zu beachten, dass ein Buchstabe nicht unbedingt nur 1 Byte groß ist. Oder wenn man auf den Speicherbereich zugreift und dabei davon ausgeht, dass dieser Length(...) Byte groß ist statt Length(...) * SizeOf(Char) groß, usw., dies kommt u.a. dann vor, wenn man Strings als Datencontainer missbraucht.

Wenn man explizit AnsiStrings benutzen möchte, muss man die Variablen auch entsprechend deklarieren statt als String.
AndrewPoison Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17


Turbo Delphi 2006, Delphi 2009
BeitragVerfasst: Sa 01.08.09 08:41 
Na, dass ist doch mal etwas, mit dem ich zumindest was anfangen kann: Danke!

Dann guck ich mal, ob sich mein Quellcode vergleichsweise leicht anpassen lässt (also mal abgesehen davon, alle Strings/Chars als Ansi zu definieren).