Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi inkompatibilität von dateitypen (https://www.delphipraxis.net/66689-inkompatibilitaet-von-dateitypen.html)

happyaura 2. Apr 2006 18:30


inkompatibilität von dateitypen
 
Delphi-Quellcode:
      const datenpfad='c:\test\';
      backuppfad='c:\test\BU\';

var s='123.txt';

Windows.CopyFile(datenpfad+s, BackupPfad+'testBU.txt',false);
gibt die fehlermeldung "incompatible types: 'String' and 'PChar'"

was kann ich dagegen tun?

Gruß Martin

Martin K 2. Apr 2006 18:31

Re: inkompatibilität von dateitypen
 
Delphi-Quellcode:
CopyFile(PChar(datenpfad+s), PChar(BackupPfad+'testBU.txt'),false);

SirThornberry 2. Apr 2006 18:33

Re: inkompatibilität von dateitypen
 
du musst den String zum PChar umwandlen (casten)
Delphi-Quellcode:
Windows.CopyFile(PChar(datenpfad+s), PChar(BackupPfad+'testBU.txt'),false);
Du hast schlichtweg den Falschen Typ übergeben. Es wurde ein PChar verlangt und du hast versucht einen String zu übergeben. Das wäre ungefähr so als würdest du bei einer Funktion die einen Integer als Parameter verlangt einen String übergeben.

[Edit]Hab das trotzdem mal gepostet, trotz dessen das die Antwort schon da war damit der Fragende auch den Grund für die Meldung des Compilers erfährt[/Edit]

3_of_8 2. Apr 2006 18:33

Re: inkompatibilität von dateitypen
 
Delphi-Quellcode:
CopyFile(@(datenpfad+s)[1], @(BackupPfad+'testBU.txt')[1],false);

Martin K 2. Apr 2006 18:35

Re: inkompatibilität von dateitypen
 
@SirThornberry:
Sag ich doch!

PChar(...)

Das Windows. kann man auch weglassen, wenn Winduws in uses eingebunden ist.

3_of_8 2. Apr 2006 18:36

Re: inkompatibilität von dateitypen
 
*flüster* Das ist der Fluch des roten Kastens...

SirThornberry 2. Apr 2006 18:38

Re: inkompatibilität von dateitypen
 
@Martin: Jup, du hattest die richtige Lösung bereits geschrieben. Ich wollte eben damit sich der Fragende weiterbilden kann, das Wort "Cast" noch erwähnen und ein Beispiel warum es falsch ist (vergleich Integer<>String).

Martin K 2. Apr 2006 18:40

Re: inkompatibilität von dateitypen
 
@SirThornberry:
Jo, war ja nicht bös gemeint.

toms 2. Apr 2006 18:45

Re: inkompatibilität von dateitypen
 
Google haette auch hier die Loesung geliefert.

happyaura 2. Apr 2006 18:46

Re: inkompatibilität von dateitypen
 
besten Dank, das wort casten ist mir gerade nicht eingefallen, aber genau sowas suchte ich.

Delphi-Quellcode:
CopyFile(@(datenpfad+s)[1], @(BackupPfad+'testBU.txt')[1],false);
sowas ähnliches hab ich auch schon probiert, nur leider ohne @ und mit einer 0 statt einer 1...

gruß Martin

3_of_8 2. Apr 2006 18:50

Re: inkompatibilität von dateitypen
 
@ erzeugt einen Pointer und das [1] lässt ihn aufs erste Zeichen des Strings zeigen. Ein String ist 1-basiert, nicht wie normale dynamische Arrays 0-basiert. Bei "alten" Strings kann man mit s[0] auf die Länge des Strings zugreifen, bei den "neuen" geht das nicht mehr.

Ein PChar ist definiert als Pointer auf das erste Zeichen einer Zeichenkette, terminiert durch ein Nullbyte.

Mit @s[1] machst du genau das. PChar(s) kann man genauso hernehmen.

happyaura 2. Apr 2006 19:08

Re: inkompatibilität von dateitypen
 
das hab ich eben durch rumspielen und fehlermeldungen interpretieren auch noch mal rausbekommen. bin sonst eher in der c welt unterwegs, da sind die strings ein wenig anders organisiert...
besten dank noch mal für Deine erläuterungen.

qb-tim 7. Apr 2006 14:50

Re: inkompatibilität von dateitypen
 
Was genau ist PChar?

Integer = ganze Zahl
Real = Zahl
String = Text
PChar = :?:

mkinzler 7. Apr 2006 14:53

Re: inkompatibilität von dateitypen
 
Pointer to Char: Ein Zeiger auf eine Char7erstes Zeichen eines nullterminierten Strings.

qb-tim 7. Apr 2006 14:54

Re: inkompatibilität von dateitypen
 
Noch 'ne Frage:

Was bewirkt das false (bzw. true) bei CopyFile?

Delphi-Quellcode:
CopyFile(PChar('Datei1.bsp'),PChar('Datei2.bsp'),false);

Dale 7. Apr 2006 15:03

Re: inkompatibilität von dateitypen
 
Ist der Parameter "False", dann wird eine schon vorhandene Datei überschrieben, ansonsten liefert die Funktion "False" zurück.

mkinzler 7. Apr 2006 15:05

Re: inkompatibilität von dateitypen
 
Die Delphihilfe hätte dir gesagt, das der 3.Paramter angibt ob bei Existieren der Zieldatei ein Fehler ausgelöst wird oder diese überschrieben wird.

[Edit: war wohl zu langsam ...]

raiguen 7. Apr 2006 16:38

Re: inkompatibilität von dateitypen
 
Moin :-)
Der letzte Parameter (True oder False) gibt an, was geschehen soll, wenn die Zieldatei schon vorhanden ist -> bei False wird die Zieldatei ohne Rückfrage überschrieben, bei True bricht die CopyFunktion ab.

Um zu verhindern, dass ggf. eine vorhandene Datei überschrieben wird, entweder VOR dem CopyFile(...) mit FileExists(...) abfragen oder aber so
Code:
if CopyFile(...) = 0 then //Fehler->ZielDatei bereits vorhanden
  ...

Zitat:

Zitat von Dale
Ist der Parameter "False", dann wird eine schon vorhandene Datei überschrieben, ansonsten liefert die Funktion "False" zurück.

DIe Funktion gibt keinen Boolschen Wert zurück, sondern einen Integer: bei Fehler ist der Wert 0, bei erfolgreichem Kopieren ist der Wert größer Null.

himitsu 7. Apr 2006 19:37

Re: inkompatibilität von dateitypen
 
Zitat:

Zitat von raiguen
Code:
if CopyFile(...) = 0 then //Fehler->ZielDatei bereits vorhanden
  ...

Die Fehlerbeschreibung gefällt mir aber nicht wirklich, denn ein Fehler kann genauso sein:
-zuwenig Speicher
-Quelldatei nicht vorhanden/oder keine Leserechte
-Dateiname der Zieldatei fehlerhaft
-Zieldatei bereits vorhanden
...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 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 by Thomas Breitkreuz