Ho ripreso a scrivere una funzione che controlli la correttezza formale dei caratteri immessi in una TEdit.
Tempo fa, Qui (http://www.lazaruspascal.it/index.php?topic=2527.msg16308#msg16308) ho scoperto che "i:= TEdit.SelStart", fornisce la posizione del cursore all'interno di TEdit.
Perfetto, ma, avendo una
TEdit1.Text := 'ABCDE'
e forzando:
trovo il cursore posizionato prima della lettera "B".
Se Ora voglio trasferire quella lettera nella stringa1 e scrivo:
stringa1:= TEdit1.Text[1]
in "stringa1" vi trovo trasferita la lettera "A" e non la lettera "B".
Ciò perchè sono diversioi due criteri di indicizzazione dei singoli caratteri di una stringa, infatti, nell'istruzione:
- TEdit1.SelStart:= 1 -> il contatore indice comincia a contare i caratteri, a partire da 0;
- stringa1:= TEdit1.Text[1] -> il contatore indice comincia a contare i caratteri, a partire da 1;
Ciò mi impedisce di gestire bene i puntamenti sui caratteri contenuti nella Tedit1.Text.
Ricordo però di avere letto, ma non ricordo dove, che è possibile dire al Pascal di contare gli elementi di un array, partendo sempre da zero.
Ricordo male?
In Pascal, per definizione, un array può avere l'indice di partenza a qualsiasi valore, anche negativo (ovviamente anche l'indice "finale").
Quindi definizioni come:
var
s: array [-1..4] of char = '123456';
s: array [0..5] of char = '123456';
s: array [1..6] of char = '123456';
s: array [0..6] of char = '123456'#0; //Compatibile con PChar
Sono tutte valide. Per default vigono due ulteriori regole:
1) Un array dinamico ha sempre l'indice di partenza a zero (indipendentemente dal contenuto).
2) Le stringhe hanno sempre l'indice di partenza a 1 per l'accesso ai caratteri (sia che siano ShortString, che AnsiString che UniCode).
3) Altra cosa ancora sono i PChar (richiesti molte volte per compatibilità con le chiamate a funzioni del "C").
Il fatto che l'accesso diretto e i parametri delle funzioni di manipolazione delle stesse abbiano regole diverse di "ingaggio" è normale. Ciò deriva da ragioni storiche o di definizione del linguaggio.
In particolare poi, stai facendo un paragone tra una proprietà di componente (SelStart) e l'accesso diretto ad un altra proprietà definita di sistema come "string".
Purtroppo è necessario conoscere correttamente la definizione delle singole proprietà per riuscire a lavorare correttamente.
Ciao