Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Novembre 06, 2021, 05:53:35 pm

Titolo: [R]forzare evento onclick da codice per spostare il cursore interno ad una Tedit
Inserito da: petrusic - Novembre 06, 2021, 05:53:35 pm
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:
Codice: [Seleziona]
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?
Titolo: Re:forzare evento onclick da codice per spostare il cursore interno ad una Tedit
Inserito da: DragoRosso - Novembre 06, 2021, 06:19:14 pm
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.
Codice: [Seleziona]
  //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.
Titolo: Re:forzare evento onclick da codice per spostare il cursore interno ad una Tedit
Inserito da: xinyiman - Novembre 06, 2021, 09:24:57 pm
Mi sembra di ricordare qualcosa di simile
Edit1.SetFocus;
Edit1.SelStart := Length(Edit1.Text);
Titolo: Re:forzare evento onclick da codice per spostare il cursore interno ad una Tedit
Inserito da: petrusic - Novembre 06, 2021, 10:26:35 pm
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:
Codice: [Seleziona]
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.