Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Incompatible typen Fehler, wieso? (https://www.delphipraxis.net/181366-incompatible-typen-fehler-wieso.html)

OrNEC 9. Aug 2014 14:33

Delphi-Version: XE3

Incompatible typen Fehler, wieso?
 
Ich habe in dieser Funktion
Delphi-Quellcode:
DeleteFile(varRecDir + StationRecDir + '\' + FileName);
die Fehlermeldung
Zitat:

main.pas(442,56) Error: Incompatible type for arg no. 1: Got "AnsiString", expected "PChar"
wieso eigentlich? Die Variablen varRecDir, StationRecDir und FileName sind Strings. Die
Delphi-Quellcode:
showmessage(varRecDir + StationRecDir + '\' + FileName);
funktioniert auch problemlos, aber nicht die DeleteFile-Funktion.

Danke für jede Hilfe!

P.S. das ganze passiert in Lazarus

DeddyH 9. Aug 2014 14:51

AW: Incompatible typen Fehler, wieso?
 
DeleteFile erwartet eben einen PChar-Parameter und keinen String.
Delphi-Quellcode:
DeleteFile(PChar(varRecDir + StationRecDir + '\' + FileName));

OrNEC 9. Aug 2014 15:03

AW: Incompatible typen Fehler, wieso?
 
Jaa... in der Hilfe steht davon kein Wort, zumindest in der Lazarus Hilfe.

Captnemo 9. Aug 2014 16:17

AW: Incompatible typen Fehler, wieso?
 
Aber es steht ja zumindest schon in der Fehlermeldung vom Compiler, die du gepostet hast. :wink:

Bernhard Geyer 9. Aug 2014 16:21

AW: Incompatible typen Fehler, wieso?
 
Entweder du hast die sysutils nicht in deiner Usesanweisung oder die Windows-Unit nach diesem Eintrag so das dort die Version mit PChar verwendet wird.

himitsu 9. Aug 2014 17:41

AW: Incompatible typen Fehler, wieso?
 
Komisch ist irgendwie, daß in der Online-Hilfe die Typenbezeichner der "Strings" fehlen :gruebel:
http://lazarus-ccr.sourceforge.net/d...eletefile.html
http://lazarus-ccr.sourceforge.net/d...ilecreate.html

Aber ich möchte fast wetten, daß Lazarus es hier dem Delphi nachgemacht hat, womit es ebenfalls zwei Implementationen gibt.
SysUtils (mit String) und Windows (mit PChar)
Somit solltest du einfach mal aufpassen welche Version du verwendest. :stupid:

[edit]
Ups, nu hab'sch den armen Bernhard glatt übersehn. :oops:

OrNEC 9. Aug 2014 18:23

AW: Incompatible typen Fehler, wieso?
 
OK... verstehe...

Ich habe beide Uses eingebunden, die SysUtils und Windows, aber Lazarus besteht bei dieser Funktion auf PChar, wieso auch immer. Wird da etwa eine Uses bevorzugt? Wenn ja wie kann man das beeinflussen?

Eigentlich ist es mir egal, ob PChar oder String, Hauptsache es ist alles unicodefähig. Und das ist es doch, oder?

vagtler 9. Aug 2014 19:11

AW: Incompatible typen Fehler, wieso?
 
Ist doch schon alles weiter oben im Thread beantwortet.

himitsu 9. Aug 2014 20:05

AW: Incompatible typen Fehler, wieso?
 
Zitat:

Zitat von OrNEC (Beitrag 1268141)
Wird da etwa eine Uses bevorzugt? Wenn ja wie kann man das beeinflussen?

Natürlich.
Immer der Letzte.

Außer man Bindes nur Eines von Beiden ein, oder gibt den gewünschten Namespace (hier die Unit) beim Aufruf mit an.

Zitat:

Zitat von OrNEC (Beitrag 1268141)
Eigentlich ist es mir egal, ob PChar oder String, Hauptsache es ist alles unicodefähig. Und das ist es doch, oder?

Nein.

Entweder du verwendest die "richtige" (gewünschte) Funktion, oder du passt den Parameter an (casten).

Und kein, wenn du die Ansi-Version dieser API verwendest, dann nicht.

OrNEC 9. Aug 2014 20:49

AW: Incompatible typen Fehler, wieso?
 
OK, danke euch... habe wieder was gelernt!

Bernhard Geyer 10. Aug 2014 08:16

AW: Incompatible typen Fehler, wieso?
 
Zitat:

Zitat von OrNEC (Beitrag 1268141)
Eigentlich ist es mir egal, ob PChar oder String, Hauptsache es ist alles unicodefähig. Und das ist es doch, oder?

Da musst du bei Lazarus/FreePascal aufpassen. Dadurch das String = AnsiString geblieben ist kommt es sehr leicht vor das man die Nicht-Unicodefähigen Funktionen verwendet an stellen bei dem man die *native bzw. *utf8-Funktion hätte verwenden sollen.

JamesTKirk 10. Aug 2014 10:05

AW: Incompatible typen Fehler, wieso?
 
Zitat:

Zitat von himitsu (Beitrag 1268138)
Komisch ist irgendwie, daß in der Online-Hilfe die Typenbezeichner der "Strings" fehlen :gruebel:
http://lazarus-ccr.sourceforge.net/d...eletefile.html
http://lazarus-ccr.sourceforge.net/d...ilecreate.html

Das war ein Bug in dem Tool, das zur Generierung der Hilfe verwendet wird. Dort wo die Hilfe eigentlich zu finden ist (nämlich www.freepascal.org/docs.var) ist schon seit dem Release von 2.6.2 die gefixte Dokumentation online: http://freepascal.org/docs-html/rtl/...eletefile.html

Zum Thema unicodefähig noch:
- bis einschließlich der 2.6.x Serie verwendete Free Pascal rein die Ansi Routinen unter Windows
- 2.7.1 unterstützt bereits den "Codepage aware AnsiString" und wir arbeiten auch daran die RTL mehr Unicode-aware zu bekommen, das ist aber noch ein Work In Progress
- Lazarus verwendet standardmäßig UTF-8 als Encoding innerhalb der AnsiStrings; das bedeutet Strings, die du von der LCL bekommst sind in UTF-8 und solche, die du an die LCL übergibst müssen UTF-8 sein; bei der Interaktion mit RTL und FCL Routinen musst du also mit SysToUTF8 bzw. UTF8ToSys entsprechend umwandeln oder du verwendest die UTF-8-fähigen Versionen einiger RTL Funktionen (
Delphi-Quellcode:
DeleteFile
sollte darunter fallen), welche mit einem *UTF8-Suffix versehen in der (glaube ich)
Delphi-Quellcode:
LazUTF8
-Unit zur Verfügung stehen

Gruß,
Sven

OrNEC 10. Aug 2014 11:04

AW: Incompatible typen Fehler, wieso?
 
@JamesTKirk

Weiß Du vllt wie ich die aktuellste Hilfe in mein Lazarus einbaue? So das es mit F1 funktioniert?
Habe Lazarus 1.2.4, da ist noch die Hilfe von Documentation generated on: Aug 02 2012 :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr.

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