Quando, in una Tedit, viene immesso un carattere formalmente non corretto, riesco a scoprirlo solamente dentro il suo evento Change, confrontando il contenuto della Tedit, a prima dell'ultima immissione; e quello, a dopo l'ultima immissione:
procedure TForm2.EImportFormulaChange(Sender: TObject);
begin
. . .
for i:= 1 to (lun) do
begin
case EImportFormula.Text[i] of
'+', '-', '*', '/':
begin
if (EImportFormula.Text[i - 1] = '+') or (EImportFormula.Text[i - 1] = '-') or (EImportFormula.Text[i - 1] = '*') or (EImportFormula.Text[i - 1] = '/') or (EImportFormula.Text[i - 1] = '(') then
begin
EImportFormula.Text:= striPrec; // striPrec contiene la Tedit, a prima dell'uiltima immissione
Break;
end;
if (i < lun) then
begin
if (EImportFormula.Text[i + 1] = '+') or (EImportFormula.Text[i + 1] = '-') or (EImportFormula.Text[i + 1] = '*') or (EImportFormula.Text[i + 1] = '/') or (EImportFormula.Text[i + 1] = ')') then
begin
EImportFormula.Text:= striPrec; // striPrec contiene la Tedit, a prima dell'uiltima immissione
Break;
end;
end;
end;
end;
end;
end;
Ripristinando il precedente contenuto della TEdit, il puntamento al suo interno non mantiene la vecchia posizione, ma si sposta all'inizio della Tedit.
Per riportarlo alla posizione che aveva prima dell'ultimo carattere immesso, ho pensato che potrei sfruttare l'evento OnClick, ma come faccio a dire all'evento OnClick che deve puntare la TEdit, alla posizione, per es., 5?
Non penso ci sia un metodo semplice per fare ciò che dici.
Non ricordo alcuna proprietà che riguardi la posizione del cursore in una TEdit.
Inoltre seguire la posizione tracciando i tasti non è semplice .... basta spostarsi con il mouse e sei "fregato".
Ciò che farei è simulare la pressione del tasto freccia a destra.
Questo è il codice .... ripetilo quante volte serve ad arrivare in posizione.
//Queste tre righe simulano un tasto
postmessage(Edit1.Handle, WM_KEYDOWN, VK_RIGHT, 0);
sleep(100);
postmessage(Edit1.Handle, WM_KEYUP, VK_RIGHT, 0);
Ciao
EDIT: Ehmmm funziona sotto Windows ovviamente.
Nel pomeriggio ho trovato che non occorre ricorrere all'evento OnCliuck, perchè basta richiamare la proprietà SelStart e dare il n° del carattere al quale puntare l'immissione del carattere da immettere:
procedure TForm2.EImportFormulaChange(Sender: TObject);
. . .
for i:= 1 to (lun) do
begin
case EImportFormula.Text[i] of
'+', '-', '*', '/':
begin
if (EImportFormula.Text[i - 1] = '+') or (EImportFormula.Text[i - 1] = '-') or (EImportFormula.Text[i - 1] = '*') or (EImportFormula.Text[i - 1] = '/') or (EImportFormula.Text[i - 1] = '(') then
begin
EImportFormula.Text:= striPrec;
ixEImportFormula:= (i - 1); // per memorizzare l'indice di puntamento internamente alla TEdit
Break;
end;
if (i < lun) then
begin
if (EImportFormula.Text[i + 1] = '+') or (EImportFormula.Text[i + 1] = '-') or (EImportFormula.Text[i + 1] = '*') or (EImportFormula.Text[i + 1] = '/') or (EImportFormula.Text[i + 1] = ')') then
begin
if (EImportFormula.Text[i] = striPrec[7]) then
begin
ixEImportFormula:= i; // per memorizzare l'indice di puntamento internamente alla TEdit
end
else begin
ixEImportFormula:= i - 1; // per memorizzare l'indice di puntamento internamente alla TEdit
end;
EImportFormula.Text:= striPrec;
Break;
end;
end;
end;
end;
end;
if (ixEImportFormula > 0) then
begin
EImportFormula.SelStart:= ixEImportFormula; // qui imposto l'indice di puntamento corretto
ixEImportFormula:= 0;
end;
Come suggerito anche da xinyiman, dopo l'impostazione data nel codice riportato sopra, la TEdit viene ripulita dell'ultimo carattere formalmente non corretto e posso riprendere la digitazione proprio nel punto in cui la TEdit si trovava prima.
Non occorre dare il SetFocus, perchè la TEdit lo possiede già.
Grazie a entrambi.