Autor Beitrag
del1312
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190



BeitragVerfasst: Do 07.08.03 13:28 
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:
ausblenden 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 user profile iconTino: Delphi- & Quote-Tags hinzugefügt.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 07.08.03 13:45 
Hallo!

Du hast die letzte Klammer zu früh geschlossen!

Gruß
Tino
del1312 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190



BeitragVerfasst: Do 07.08.03 13:56 
hm wo soll ich die denn schliessen? :oops:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 07.08.03 14:25 
Vor dem Semikolen? :roll: Oder wo soll das: ,'C:\email.sav' hingehören?
del1312 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190



BeitragVerfasst: 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'
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 07.08.03 14:55 
Genau. Und wie heißt die Funktion? MoveFile. Wie sieht sie syntaktisch aus?
ausblenden Quelltext
1:
MoveFile(Quelle, Ziel);					

Quelle := foo-Funktion

Daraus wird dann:
ausblenden Quelltext
1:
MoceFile(foo-Funktion(Parameter), Ziel);					


Hier fehlen eindeutig Grundlagen in dem Umgang mit Funktionen und deren Anwendung.
del1312 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190



BeitragVerfasst: 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! :(
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 www.delphi-source.de und www.delphi-treff.de umsehen.
del1312 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190



BeitragVerfasst: 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:
ausblenden Quelltext
1:
MoveFile(GetSpecialFolder(CSIDL_DESKTOP)+'\email.sav','C:\email.sav');					


Gleiche Meldung
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 07.08.03 15:13 
Davon ausgehen, das der Rest korrekt ist:
ausblenden Delphi-Quelltext
1:
MoveFile(PChar(GetSpecialFolder(CSIDL_DESKTOP)+'\email.sav'), 'C:\email.sav');					
del1312 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190



BeitragVerfasst: Do 07.08.03 15:18 
:P *juhu* es klappt vielen Dank für deine Ausdauer und Hilfe.
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: 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 :)

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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: 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)