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;
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