Autor Beitrag
sintec
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Do 15.03.07 12:16 
Kann mir einer erklären warum ich ein '€' (Eurozeichen) statt gewünschtem ';' (Semikolon) bei der Übergabe aus einem Editfeld in eine Variable bekomme?

der Code sieht bei mir so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
...
var zeichen: char;
begin
zeichen := char(edit1);
...


bei einzeln Anweisungen habe ich rausbekommen, dass danach in der var zeichen ein € sitzt.

bitte um eine Erklärung
Robinator
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Do 15.03.07 12:19 
Edit1 ist kein Char sondern ein Pointer. Ich hab zwar nur die hälfte von dem was du geschrieben hast verstanden, aber vermutlich suchst du das:

ausblenden Delphi-Quelltext
1:
  zeichen := Edit1.Text[1];					


gruss

_________________
erare humanum est
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 15.03.07 12:35 
Das geht z.B. so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
var zeichen: Pchar;
begin
 zeichen := PChar(edit1.text);
 Showmessage(zeichen);


Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Do 15.03.07 13:13 
Ich halte es für gefährlich, einfach einen String einem PChar zuzuweisen, ohne Speicher für den PChar zu reservieren

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 15.03.07 13:19 
user profile iconHelgeLange hat folgendes geschrieben:
Ich halte es für gefährlich, einfach einen String einem PChar zuzuweisen, ohne Speicher für den PChar zu reservieren
PChar ist ein Zeiger, welcher dann auf den String zeigt. Füre was willst du Speicher reservieren?

_________________
Markus Kinzler.
Backslash
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: Do 15.03.07 13:23 
Er meint wahrscheinlich damit, dass wenn das Editfeld beispielsweise dynamisch erzeugt wird oder sich auf einem anderen Formular befindet der Zeiger ins Leere zeigt, wenn das Editfeld bzw. das Formular freigegeben wird.

Ich würde auch die Lösung mit "zeichen := Edit1.Text[1];" bevorzugen :)
sintec Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Do 15.03.07 13:26 
vielen dank euch
hat geklappt
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8550
Erhaltene Danke: 478

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 15.03.07 13:28 
Vorsicht! PChar ist nicht gleich Char!

PChar ist ein nullterminierter String, Char ein Character, d.h. ein Buchstabe!

Die Konvertierung eines AnsiStrings (Standard, wenn man bei Delphi was von String schreibt) in ein PChar geht problemlos über Typecasting, z.B. PChar(Edit1.Text). Dabei wird afaik aber nicht nur ein Zeiger auf den vorhandenen String gesetzt, sondern tatsächlich im Speicher umkopiert. Stichpunkte wären Referenzzähler/Länge bei Ansistrings (gibts nicht bei PChar) und Terminierungsbyte bei PChar (gibts nicht bei AnsiString).

Will man einen 1-Zeichen-langen String in eine Char-Variable speichern, dann sollte man das nicht über PChar machen (denn dann hat man immer noch einen String-Typen), sondern wie jetzt schon mehrfach gesagt über MeinChar := MeinString[1].

_________________
We are, we were and will not be.
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Do 15.03.07 13:56 
ich habe mal was rausgesucht dazu :

Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// WARNING: BAD EXAMPLE
  var
    S: string;
    P: PChar;
  begin
    S := ParamStr(0); // say, this returns 'C:\Test.exe';
    P := PChar(S);
    S := 'Something else';

If S is changed to 'Something else', P will not be changed with it, and still point to 'C:\Test.exe'. Since P is not a string reference to that text, and there is no other string variable pointing to it, its reference count will become 0, and the text will be discarded. That means, that P now points to invalid memory.


Hoffe, das hilft :)

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw