Avatar billede jisch Mester
24. september 2018 - 20:51 Der er 5 kommentarer og
1 løsning

Delphi 2009 - CaretPos

TrichEdit og TMemo har begge en Procedure til fastlæggelse af en position i teksten.
Denne Procedure findes desværre IKKE i TEdit. Er der nogen der kan beskrive hvordan jeg kan gøre dette i en Tedit.
Min opgave er, at jeg fylder en TEdit med en Text fra en ekstern kilde og vil gerne have, at Caret står i slutningen af teksten for at ændre den så at sige baglæns.
Håber at nogen kan hjælpe.
Avatar billede falster Ekspert
24. september 2018 - 21:27 #1
Længe siden, at jeg har forsøgt mig med Delphi. Der er noget her, som du muligvis kan tilrette til formålet:

https://www.tek-tips.com/viewthread.cfm?qid=1189107
Avatar billede jisch Mester
25. september 2018 - 00:21 #2
>falster. Tak for svar. Linket indeholder mange spændende ting, men desværre ikke noget der fungerede rigtigt.
Jeg kom til gengæld til at tænke over, at jeg tidligere har brugt Windows API en del og det hjalp. Jeg har fundet følgende smukke (synes jeg selv) løsning:

Edit1.Setfocus;
Edit1.Perform(WM_KeyDown, VK_END, 0);

Det giver endvidere mulighed for at programmere en selvvalgt position via VK_START, VK_END, VK_RIGTH og VK_LEFT.
Avatar billede hrc Mester
26. september 2018 - 13:41 #3
Brug SelStart og SelLength.
Avatar billede jisch Mester
26. september 2018 - 17:15 #4
>hrc: Tak for kommentar. SelStart og SelLength virker ikke - det flytter IKKE Cursor (Caret). Det link som falster sendte mig prøver bl.a dette.
Løsningen fandt jeg selv - se mit indlæg.

Endvidere har jeg skrevet en Function der kan sætte Cursor et hvilket som helst sted i en tekst i TEdit eller TMaskEdit:

Function TextCaretPos(Sender: TControl; L: Integer): Boolean;
// L = Den position Cursor skal sættes
Var
  Ok: Boolean;
  I,  Len: Integer;
  S: String;
Begin
  Ok:=False; S:='';
  If Sender Is TEdit Then S:=(Sender As TEdit).Text
  Else If Sender Is TMaskEdit Then S:=(Sender As TMaskEdit).Text;
  Len:=Length(S);
  Try
    If L>=Len Then Sender.Perform(WM_KeyDown, VK_END, 0)
    Else Sender.Perform(WM_KeyDown, VK_HOME, 0);
    If (L>1) And (L<Len) Then
      For I:=1 To L Do Sender.Perform(WM_KeyDown, VK_RIGHT, 0);
    Ok:=True;
  Except
    //
  End;
  TextCaretPos:=Ok;
End;
Avatar billede hrc Mester
26. september 2018 - 17:51 #5
Jo det gør. Komponenten mangleder fokus. Prøv det her:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.SetFocus;
  Edit1.Text := 'Hello World!';
  // Edit1.SelLength := 0;
  Edit1.SelStart := length(Edit1.Text);
end;
Avatar billede jisch Mester
27. september 2018 - 03:02 #6
>hrc: Tak. Ja, det ser også ud til at virke!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester