Programowanie w języku Delphi » Gotowce

Numerowanie linii

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 komentarze

toyman 2005-05-10 09:41

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).

Adamek 2005-03-30 10:42

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

Adamek 2005-04-15 13:45

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

a_s_f 2003-08-25 22:16

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