| DaRkFiRe hat folgendes geschrieben: |
Durch die Verkettung von Strings durch "+" wird es automatisch zum Delphi-typischen (ANSI-) String, der gewissermaßen inkompatibel zum Delphi-STRING ist (er ist speicherintern anders aufgebaut).
|
Wie denn nun? Ein Delphi-typische ANSI-String ist inkompatible zum typischen Delphi-String?
Einfach gesagt: Die Funktion erwartet einen Zeiger auf einen nullterminierenden String. Code ich den String hard, wird er vom Compiler interpretiert, wie er gebraucht wird. Bastele ich mir einen String mit + zusammen, wird er vom Compiler als ANSI-String interpretiert, weil man nullterminierende Strings nicht so verketten kann. Deswegen ist in diesem Fall ein Cast nach PChar notwendig.
Will man nicht casten kann man auch einen Zeiger auf das erste Zeichen übergeben:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var s: String; begin s := 'Hello World'; Messagebox(0, @s[1], 'Foo', 0); |
Alternativ kann man noch nach Pointer casten, da die Funktion, wie gesagt, einen Zeiger auf einen Speicherbereich erwartet:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var s : String; begin s := 'Hello World'; Messagebox(0, pointer(s), 'Foo', 0); |
Am effektivsten ist übrigens der Cast nach Pointer, weil da keine Delphi internen Funktionen mehr aufgerufen müssen. Und im Fehlerfall, liefert der Casst nil zurück. Es passiert also nichts.
Wer mehr zu dem Thema und Code-Optimierung erfahren will, der sei auf diese Seite verwiesen:
www.optimalcode.com 8leider scheint diese Seite down zu sein. Sollte sich deren Adresse geändert haben, würde ich mich über eine Mitteilung freuen. Danke)