Numerowanie linii

Adam Boduch

Kod, który tutaj prezentuje numeruje zaznaczony tekst w
komponencie Memo. Nie jest to skomplikowane. Pętla rozpatruje każdą
linię tekstu wstawiając na początek numer zaznaczonego tekstu.

Procedura zawiera "w sobie" drugą procedurę
ustawiającą w komponencie kusor na wybranej linii:

procedure TForm1.btnNumberClick(Sender: TObject);

procedure SetCursor(Row, Column: Integer);
begin
{
  Pierwsze polecenie ustawia kursor w linii okreslonej parametrem Row.
  Drugie polecenie dodaje do tego wartosc parametru Column, ktore oznacza
  numer znaku w linii.
}
  Memo1.SelStart := Memo1.Perform(EM_LINEINDEX, Row, 0);
  Memo1.SelStart := Memo1.Perform(EM_LINEINDEX, Row, 0) + Column;
end;

var I, Y, Count: Integer;

begin
  Count := 0; // wyzeruj licznik
{
   Najpierw pobierz pierwsza linie zaznaczonego tekstu. Zwiekszajac
   te liczbe o jeden ( w komponencie Memo pierwsza linia oznaczona
   jest przez cyfre 0 ) dostajemy numer linii, w ktorej znajduje sie kursor.
}
  Y := Memo1.Perform(EM_LINEFROMCHAR, $FFFF, 0);
  Inc(Y);

{
   Petla wykonuje sie od zmiennej Y ( pierwsza linia zaznaczonego tekstu ) do
   zmiennej CaretPos - koniec zaznaczonego testku.
}
  for I := Y to Memo1.CaretPos.y + 1 do
  begin
    Inc(count); // zwieksz licznik
    SetCursor(i -1, 0); // ustaw na poczatek linii
    Memo1.SelText := Format('%d. ', [Count]); // wstaw numerowany tekst
    Memo1.SetFocus; // ustaw komponent jako aktywny
  end;
end;

4 komentarzy

Hmmm ... po co ustawiac Focus na Memo1 przy kazdym obrocie petli ?
Poza tym po pierona ustawiac kursor ... Adamek juz to napisal, ale przyeciez wystarczy zlozyc stringa z samego siebie i jego numeru (czy na odwrot).

Nie wiem dlaczego ale u mnie procedura wykonywała numerowanie tylko ostatniej linii nadając jej numer 1.

Zamiast tej całości na górze można napisać tak:
For n:=0 to RichEdit1.Lines.Count do
RichEdit1.Lines.Strings[n]:=inttostr (n+1)+'. '+RichEdit1.Lines.Strings[n];

W 5 linijce od konca powinno byc
Memo1.SelText := Format('%d. ', [Count]);
a tak w ogole to bardzo przydatna procedura