Entwickler-Ecke
Dateizugriff - Warum klappt das moven nicht?
del1312 - Do 07.08.03 13:28
Titel: Warum klappt das moven nicht?
Wollte eine Datei vom Desktop in ein Verzeichnis schieben. Vorher wird das Desktop Verzeichnis des Users ermittel. Von dort aus soll er die Datei z. B in C:\ verschieben. Aber ich bekomme ne Fehlermeldung:
Was ist daran falsch:
Delphi-Quelltext
1:
| MoveFile (GetSpecialFolder(CSIDL_DESKTOP)+'\email.sav'),'C:\email.sav'; |
Dieser Fehler kommt dann immer ich weiss aber nicht wie ich den Wert in umwandle:
| Zitat: |
| [Fehler] Unit1.pas(78): Inkompatible Typen: 'String' und 'PAnsiChar' |
Moderiert von
Tino: Delphi- & Quote-Tags hinzugefügt.
Tino - Do 07.08.03 13:45
Hallo!
Du hast die letzte Klammer zu früh geschlossen!
Gruß
Tino
del1312 - Do 07.08.03 13:56
hm wo soll ich die denn schliessen? :oops:
Delete - Do 07.08.03 14:25
Vor dem Semikolen? :roll: Oder wo soll das: ,'C:\email.sav' hingehören?
del1312 - Do 07.08.03 14:50
hm nee warum soll da die Klammer hin? ich will doch die datei email.sav auf dem desktop(GetSpecialFolder(CSIDL_DESKTOP)+'\email.sav')
nach c:\ moven also 'C:\email.sav'
Delete - Do 07.08.03 14:55
Genau. Und wie heißt die Funktion?
MoveFile. Wie sieht sie syntaktisch aus?
Quelltext
1:
| MoveFile(Quelle, Ziel); |
Quelle := foo-Funktion
Daraus wird dann:
Quelltext
1:
| MoceFile(foo-Funktion(Parameter), Ziel); |
Hier fehlen eindeutig Grundlagen in dem Umgang mit Funktionen und deren Anwendung.
del1312 - Do 07.08.03 15:00
aso meinst du das ok, dann probier ich es nochmal. wenn ich ahnung hätte würde ich doch nicht fragen! :(
Delete - Do 07.08.03 15:04
Hat ja auch keiner was dagegen, dass du fragst. Ich würde meinen Kommentar als Hinweis nehmen, wo du noch Wissenslücken anscheinend hast. Um diese zu schließen, solltest du dich mal bei den Tutorials auf
http://www.delphi-source.de und
http://www.delphi-treff.de umsehen.
del1312 - Do 07.08.03 15:09
ja so versteh ich es auch. hab mir dort schon ne menge angeeignet aber nun versuch ich mal wieder was neues und da muss man eben erstmal testen probieren und sich alles zusammenfragen :D
nochmal zum dem prob, also das funzt immer noch nicht hab es jetzt so ausprobiert:
Quelltext
1:
| MoveFile(GetSpecialFolder(CSIDL_DESKTOP)+'\email.sav','C:\email.sav'); |
Gleiche Meldung
Delete - Do 07.08.03 15:13
Davon ausgehen, das der Rest korrekt ist:
Delphi-Quelltext
1:
| MoveFile(PChar(GetSpecialFolder(CSIDL_DESKTOP)+'\email.sav'), 'C:\email.sav'); |
del1312 - Do 07.08.03 15:18
:P *juhu* es klappt vielen Dank für deine Ausdauer und Hilfe.
DaRkFiRe - So 17.08.03 02:31
Falls jemand grübelt:
MoveFile ist eine WinAPI-Funktion und die erwartet null-terminierte Strings (quasi <string>#0)
pchar(<variable>) weist den Compiler an, die Variable als PChar zu interpretieren.
Durch die Verkettung von Strings durch "+" wird es automatisch zum Delphi-typischen (ANSI-) String, der gewissermaßen inkompatibel zum Delphi-STRING ist (er ist speicherintern anders aufgebaut).
Die Konstante 'C:\email.sav' ist PChar und String in einem - der Compiler verwertet ihn, wie er gebraucht wird, und da die Funktion einen PChar erwartet, wird er als PChar kompiliert.
So irgendwie :)
Delete - So 17.08.03 04:35
| DaRkFiRe hat folgendes geschrieben: |
Durch die Verkettung von Strings durch "+" wird es automatisch zum Delphi-typischen (ANSI-) String, der gewissermaßen inkompatibel zum Delphi-STRING ist (er ist speicherintern anders aufgebaut).
|
Wie denn nun? Ein Delphi-typische ANSI-String ist inkompatible zum typischen Delphi-String?
Einfach gesagt: Die Funktion erwartet einen Zeiger auf einen nullterminierenden String. Code ich den String hard, wird er vom Compiler interpretiert, wie er gebraucht wird. Bastele ich mir einen String mit + zusammen, wird er vom Compiler als ANSI-String interpretiert, weil man nullterminierende Strings nicht so verketten kann. Deswegen ist in diesem Fall ein Cast nach PChar notwendig.
Will man nicht casten kann man auch einen Zeiger auf das erste Zeichen übergeben:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var s: String; begin s := 'Hello World'; Messagebox(0, @s[1], 'Foo', 0); |
Alternativ kann man noch nach Pointer casten, da die Funktion, wie gesagt, einen Zeiger auf einen Speicherbereich erwartet:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var s : String; begin s := 'Hello World'; Messagebox(0, pointer(s), 'Foo', 0); |
Am effektivsten ist übrigens der Cast nach Pointer, weil da keine Delphi internen Funktionen mehr aufgerufen müssen. Und im Fehlerfall, liefert der Casst nil zurück. Es passiert also nichts.
Wer mehr zu dem Thema und Code-Optimierung erfahren will, der sei auf diese Seite verwiesen:
http://www.optimalcode.com 8leider scheint diese Seite down zu sein. Sollte sich deren Adresse geändert haben, würde ich mich über eine Mitteilung freuen. Danke)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!