Jak zrobić efekt pisania tekstu w memo?

0

Witam. Jest mi koniecznie potrzebna informacja jak zrobić efekt pisania tekstu w memo. Próbowałem z sleep ale nie działa. Chodzi mi dokładnie o to że po wciśnięciu buttona w memo co 200 milisekund będzie pojawiała się kolejna literka do tekstu aż utworzy całe zdanie. Proszę o pomoc. Chodzi o to że np. tekst "Ala ma kota" napiszę się literka po literce czyli "A", za 200 milisekund "l" itd. Tak jakbym ten tekst pisał ja na klawiaturze.

1

Pokaż, jak robisz to ze sleep.
Moja propozycja:

Const Tekst = 'Hello World!';
Var I: Integer;
Begin
 For I := 1 To Length(Tekst) Do
 Begin
  Memo.Text := Memo.Text+Tekst[I];
  Sleep(200);
  Application.ProcessMessages;
 End;
End;
0

Z sleep robiłem tak:

1 sposób:
Po wciśnięciu przycisku uruchamiał się timer1 ustawiony na 500 ms.

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Memo1.Lines.Text :='U';
    sleep(500);
    Memo1.Lines.Text := Memo1.Lines.Text + 's';
    sleep(500);
    Memo1.Lines.Text := Memo1.Lines.Text + 'u';
    sleep(500);
    Memo1.Lines.Text := Memo1.Lines.Text + 'ń';
    sleep(500);
    Timer1.Enabled :=False;
end;

Tutaj błąd jest taki że tekst po 500ms wyświetla się cały a nie piszę.

2 sposób:
Po wciśnięciu przycisku uruchamiał się timer1 ustawiony na 500 ms.

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Memo1.Lines.Add('U');
    sleep(500);
    Memo1.Lines.Add('s');
    sleep(500);
    Memo1.Lines.Add('u');
    sleep(500);
    Memo1.Lines.Add('ń');
    sleep(500);
    Timer1.Enabled :=False;
end;

Tutaj tekst wpisywał się literka po literce lecz błąd był taki że po każdej literce był wciśnięty ENTER i następna literka była w nowej linijce.

Za chwilę sprawdzę twój sposób.

20:26
Dzięki, twój sposób działa! Masz u mnie wielkiego plusa! Dziękuje!

0

Sposób Patryk27 działa lecz po przekroczeniu 255 znaków występuje błąd, mogę wiedzieć jak zrobić aby pisało więcej niż 255 znaków lub jak połączyć te dwie funkcje aby druga włączała się po tej pierwszej i dopisywała następne 255 znaków?

0

Możesz skorzystać z tablicy dynamicznej, PChar lub zamiast string użyć WideString (~2^30 znaków)

0

Można też tak.

procedure TForm1.Timer1OnTime(Sender: TObject);
const Tekst = 'Hello World';
begin
  if I < Length(Tekst) then
    begin
      Memo1.Text := Copy(Tekst, 1, Timer1.Tag+1);
      Timer1.Tag := Timer1.Tag + 1;
    end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1