*argh* (globale und lokale variablen)

procedure TForm1.Edit1Change(Sender: TObject);
var ch : char;
begin
ch:=edit1.text[1];
edit1.text:=’’;
end; {Der Quelltext geht, und wisst ihr warum? Na weil ich
alles richtig geschrieben habe}

und warum geht das nicht wenn ich ch global deklariert habe?

var
Form1: TForm1;
ch : char;

implementation

{$R *.DFM}

procedure TForm1.Edit1Change(Sender: TObject);
begin
ch:=edit1.text[1];
edit1.text:=’’;
end; {Der Compiler gibt keine Fehlermeldung, aber wenn ich dann was im editfeld ändere wird die procedure ausgeführt und das System hängt sich komplett auf *argh* probierts mal aus wenn ihr es nicht glaubt}
______________________________________________________________

Und auf bestimmte positionen von einem String kann ich auch nur zugreifen wenn dieser String lokal deklariert wurde also z.B.

also

text[5]:=‚A‘;

geht nur wenn text als lokaler String deklariert wurde, nicht aber wenn er global deklariert wurde.

Warum ist das so? kann ich das mit einer bestimmten Compileroption abstellen?

thx MfG Roman

procedure TForm1.Edit1Change(Sender: TObject);
var ch : char;
begin
ch:=edit1.text[1];
edit1.text:=’’;
end; {Der Quelltext geht, und wisst ihr warum? Na weil ich
alles richtig geschrieben habe}

Hi Roman,

mich wundert es, daß er geht, denn eigentlich müßte das Programm immer abstürzen, egal, ob „ch“ lokal oder global vereinbart wurde. Am Anfang mag das Editfeld einen gewöhnlichen String wie etwa ‚Ich bin dumm‘ enthalten (wer ist das nicht? :wink:). Dann drückst Du eine Taste. Edit1.text[1] (in diesem Falle = „I“) wird daraufhin „ch“ zugewiesen. Dann wird Edit1 aufgrund der Zeile „edit1.text:=’’“ gelöscht. Damit ändert sich der Inhalt des Editfelds und infolgedessen wird das Event „OnChange“ erneut ausgelöst (es findet tatsächlich eine Art Rekursion statt). Edit1.Text ist aber jetzt leer und daher existiert Edit1.Text[1] nicht. Daß sich das Programm an dieser Stelle nur aufhängt, wenn ch global ist, ist wahrscheinlich nur Zufall.

Grundsätzlich mußt Du bei Abfragen der Art „Edit.Text[p]“ immer vorher checken, ob die Länge des betreffenden Strings auch ausreichend groß ist, also: „IF Length(Edit.Text)>=p THEN…“.

Mit freundlichem Gruß
Martin

Ja du hast recht, daran habe ich gar nicht gedacht :smile:
aber wenn ich den String (edit1.text) mit dem Befehl
edit1.Text:=’’;
leere wird meines Wissens nach nur Position 0 verändert,
also dasselbe wie
edit1.Text[0]:=#0;
also alles andere Bleibt im String und man kann auch auf alles noch zugreifen und es verändern weil das einzige was verändert wurde ist Index [0] in dem jetzt steht das der String keine Länge besitzt.

Ich kenne das so von Pascal, ich kann mich aber auch täuschen und werde das ganze jetzt erstmal durchprüfen.

Danke dir für die Antwort
MfG Roman

Du hattest recht!!!
In Delphi ist ein String irgendwie anders aufgebaut,
man muss die länge ja auch mit SetLength ändern,
allerdings gibt es noch den Typen ShortString, bei dem man auch den Längenstring mit stringname[0]:=chr(laenge); ändern kann
oder man deklariert einen string mit

var s : string[zahl]; wobei zahl

:smile:
Hi Roman,

In Delphi ist ein String irgendwie anders aufgebaut,
man muss die länge ja auch mit SetLength ändern,
aber die normalen Strings in Delphi sind irgendwelche
Dynamischen Arrays wie ich es in der Hilfe gelesen habe ?!?

es ist genau so, wie Du sagst! Ich war davon ausgegangen, daß Dir bekannt war, daß die Delphi-Strings (die standardmäßigen „langen“, nicht die „SHORTSTRINGS“) intern ganz anders funktionieren als die alten Pascal-Strings. Deshalb habe ich Dich nicht auf diesen Punkt hingewiesen. Na, jedenfalls ist Dir der Unterschied jetzt klar (es ist auch ziemlich wichtig, das zu wissen, denke ich).

Bei den langen Strings gibt es zu beachten, daß Längenänderungsaktionen a la „Vorname[0]=60“ absolut tabu sind (IMMER „SetLength“ verwenden!), und daß Zeichenausleseaktionen a la „ErsterBuchstabe := Vorname[1]“ zwar grundsätzlich funktionieren, aber sichergestellt sein muß, daß der String lang genug ist (wenn er es nicht ist, kann das Programm abstürzen).

Die Delphi-Strings haben u. a. den Vorteil, daß sie beliebig lange sein können (keine Beschränkung auf 255 Zeichen wie in Pascal). Wenn Du willst, kannst Du also z. B. problemlos eine ganze Datei in einen String einlesen.

PS: wisst ihr irgendeine Möglichkeit wie ich einen einzigen
Buchstaben schön von einem Benutzer einlesen kann ohne ein
Edit-Feld dafür zu Benutzen?

Das ist etwas zu wenig an Info; beschreib Dein Problem genauer. Wieso willst Du kein Editfeld verwenden – das ist doch auch für Ein-Zeichen-Strings gut zu gebrauchen (wenn jemand mehr als ein Zeichen eingibt, kommt halt ne Fehlermeldung)? Wenn Du eine Aktion über einen Tastendruck auslösen willst, bietet sich dagegen an, das OnKeyPress-Ereignis des Formulars zu bearbeiten.

Mit freundlichem Gruß
Martin