Man sollte immer den für die Aufgabe
passenden Typen benutzen, egal in welcher Version von Delphi oder FreePascal (bzw. jeder anderen Programmiersprache). Beispiel:
Delphi-Quellcode:
MessageBox(0, PChar(...));
MessageBoxA(0, PAnsiChar(...));
MessageBoxW(0, PWideChar(...));
Das funktioniert auf allen Delphi-Versionen, egal wie alt oder neu, wahrscheinlich auch mit FreePascal.
Warum nicht sowas wie
MessageBox(0, PWideChar(...));
, von dem du ja sagst, die
IDE meint, der Parameter wäre PWideChar? Nun, bei einem aktuellen Delphi macht das keinen Unterschied, weil PChar nur ein Alias für PWideChar ist (und MessageBox ein Alias für MessageBoxW), d.h. der Compiler liest den Code als
MessageBoxW(0, PWideChar(...));
.
Aber sobald man denselben Code auf einem alten Delphi oder FreePascal benutzen will, kommen Warnungen wegen impliziter String-Umwandlung mit potentiellem Datenverlust. Warum? Weil MessageBox ein Alias ist, genau wie PChar. Der Compiler liest den Code daher als
MessageBoxA(0, PWideChar(...));
- Type mismatch. PAnsiChar, PWideChar sowie MessageBoxA und MessageBoxW sind
keine Aliase sondern konkrete Typen.
Ist eigentlich gar nicht so schwer zu verstehen. Manchmal braucht man konkrete Typen wie PAnsiChar, PWideChar, in allen anderen Fällen sollte man die Aliase (PChar, String usw) benutzen, weil der Code dann ohne Anpassungen wiederverwendbar ist. Manchmal muss man bei Code nicht nur an sich selbst denken sondern auch Code weitergeben; da ist es sehr hilfreich, wenn dieser korrekt funktioniert und keine Warnungen produziert. Warnungen zu bearbeiten, macht nämlich viel Arbeit (ich bearbeite derzeit derartigen fremden Code...).
Grüße
Dalai