Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Agosto 07, 2022, 04:31:14 pm

Titolo: [Risolto] indice di Tedit1.SelStart e indice di stringa1:= TEdit1.Text[x]
Inserito da: petrusic - Agosto 07, 2022, 04:31:14 pm
Ho ripreso a scrivere una funzione che controlli la correttezza formale dei caratteri immessi in una TEdit.
Tempo fa, Qui (https://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:
Codice: [Seleziona]
TEdit1.SelStart:= 1
trovo il cursore posizionato prima della lettera "B".

Se Ora voglio trasferire quella lettera nella stringa1 e scrivo:
Codice: [Seleziona]
 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?








Titolo: Re:indice di Tedit1.SelStart e indice di stringa1:= TEdit1.Text[x]
Inserito da: petrusic - Agosto 07, 2022, 04:57:52 pm
Forse ho trovato la risposta. Impostando infatti la lunghezza di una String ad un valore fisso, il pascal imposta l'indice dei suoi caratteri a partire da zero , per una lunghezza di "n - 1" caratteri.
Vi faccio sapere.
Titolo: Re:indice di Tedit1.SelStart e indice di stringa1:= TEdit1.Text[x]
Inserito da: DragoRosso - Agosto 07, 2022, 05:47:42 pm
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:

Codice: [Seleziona]
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
Titolo: Re:indice di Tedit1.SelStart e indice di stringa1:= TEdit1.Text[x]
Inserito da: petrusic - Agosto 07, 2022, 10:15:47 pm
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.
In realtà, conosco molto poco di Pascal. Hai ragione. Evidentemente ho letto a suo tempo un qualcosa di cui non ho ricordato più niente. Ora è tutto molto chiaro. Grazie!