Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ? (https://www.delphipraxis.net/194272-pchar-pansichar-pwidechar-integer-lparam.html)

p80286 4. Nov 2017 20:43

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Nicht daß es zu Mißverständnissen kommt. Wenn Du einen Pwidechar übergibst, der auf einen Ansistring zeigt, dann ist das formal durchaus korrekt, aber der Inhalt des Strings wird höchstwahrscheinlich falsch interpretiert.

Gruß
K-H

Glados 4. Nov 2017 20:58

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Ich definiere grundsätzlich
Delphi-Quellcode:
string
.

DeddyH 4. Nov 2017 21:04

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
AnsiString oder UnicodeString?

Glados 4. Nov 2017 21:05

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Ehrlich gesagt.... weiß ich nicht. Einfach nur
Delphi-Quellcode:
string
:thumb:
Aber ich nehme an es ist automatisch Unicode.

DeddyH 4. Nov 2017 21:08

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Ab Delphi 2009 schon. Worauf ich hinauswollte: wenn man einen PChar auf einen String zeigen lassen möchte, dann sollte man das auch so schreiben und nicht einerseits den Typalias benutzen und andererseits wieder nicht.
Delphi-Quellcode:
var
  Dings: string;
...
  ApiFunc(PChar(Dings)); //immer richtig
  ApiFunc(PWideChar(Dings)); //erst ab Delphi 2009 richtig
  ApiFunc(PAnsiChar(Dings)); //nur bis Delphi 2007 richtig

Glados 4. Nov 2017 21:14

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Delphi-Quellcode:
ApiFunc(PChar(Dings)); //immer richtig .. //erst ab Delphi 2009 richtig
Ich benutze ab sofort nur PWideChar denn ich habe keine Absicht zurück zu D2009 oder drunter zu gehen.

Warum sollte man auch.

DeddyH 4. Nov 2017 21:17

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Ab Delphi 2009 entspricht PChar PWideChar. Wieso also nicht konsequent die richtigen Typaliase verwenden? Da fehlt mir ehrlich gesagt das Verständnis.

Glados 4. Nov 2017 21:24

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Meinst du damit jetzt, dass man ab D2009 PChar oder PWideChar nutzen soll?

DeddyH 4. Nov 2017 21:43

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Nein, ich meine damit, dass man bei Verwendung von String auch PChar verwenden soll. Erst, wenn man das aus welchen Gründen auch immer nicht kann, sollte man die expliziten Typen nehmen (die Funktion gibt es nur in Ansi? AnsiString und PAnsiChar nehmen).

Dalai 4. Nov 2017 21:48

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
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
Delphi-Quellcode:
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
Delphi-Quellcode:
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
Delphi-Quellcode:
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz