Ein bisschen aus dem Zusammenhang gerissen, sorry, aber -
Zitat von
Muetze1:
Was aber genauso wenig laufen würde [...]
Deswegen schrieb ich ja, dass es in
einigen Fällen ausreicht nach pchar zu casten. Dabei fallen mir erst mal hauptsächlich Membervariablen von irgendwelchen Records ein, die als pchar deklariert sind. Bspw. der Filter bei "GetOpenFileName/GetSaveFileName". Oder auch die Beschreibung (lpszTitle) bei "SHBrowseForFolder". In solchen Fällen kannst du Strings und PChars nochmal nach pchar casten, was
IMHO keine Probleme verursacht.
Blödes Beispiel mit dem Record für "SHBrowseForFolder", aber es geht:
Delphi-Quellcode:
GetMem(bla,MAX_PATH); // var bla : pchar;
try
ZeroMemory(bla,sizeof(bla));
lstrcpy(bla,'Hallo, Du! ');
// "BrowseInfo" mit Werten füllen
ZeroMemory(@BrowseInfo,sizeof(BrowseInfo));
{ ... }
BrowseInfo.lpszTitle := pchar(bla + 'Wähle einen Ordner!');
// usw.
{ ...}
finally
FreeMem(bla);
end;
Dagegen würde dein Vorschlag von oben
BrowseInfo.lpszTitle := bla + pchar('Wähle einen Ordner');
nicht funktionieren sondern die Compilermeldung
Zitat:
[Fehler] fldbrows.pas(260): Operator ist auf diesen Operandentyp nicht anwendbar
verursachen.
Wenn du allerdings kein pchar benutzt sondern selbst ein Zeichenarray deklarierst und als Ziel benutzt, dann funktioniert beides nicht:
Delphi-Quellcode:
var
bla : array[0..MAX_PATH]of char;
begin
bla := 'Hallo Du! ';
// [Fehler] Unit1.pas(31): Inkompatible Typen: 'Array' und 'PChar'
bla := pchar(bla + 'Wähle einen Ordner');
// [Fehler] Unit1.pas(32): Operator ist auf diesen Operandentyp nicht anwendbar
bla := bla + pchar('Wähle einen Ordner');
end;
In dem Fall brauchst du
API- oder SysUtils-Funktionen.
Es ist also eine Typfrage.
Aber ich nehme an, dass du das auch sagen wolltest?