Delphi - TMemo komponens kiegészítése kurzor-információk megjelenítésével

forráskód letöltése
Három új property-t kap a TMemo komponens e cikkünkben. Ezek használatával megtudhatjuk, hogy a szövegkurzor aktuálisan hányadik sorban áll, azon belül melyik karakternél, valamint arról is tájékozódhatunk, hogy hány karakterből áll az aktuális sor.
A mellékelt példaprogram megnyitása előtt a MemoX.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component – Install Component menüpontot.
Az új komponenst a TMemo-ból származtatjuk. A LinePosition property-ből tudjuk meg, hogy hányadik sorban van a kurzor, a CharPosition árulja el a soron belüli pozíciót, míg a LineLength az aktuális sor hosszát adja meg.
Az OnPositionChange esemény akkor következik be, ha a fenti három property közül valamelyiknek megváltozik az értéke.
Erre akkor kerülhet sor, amikor a felhasználó a komponens területén kattint valahol, vagy felengedi az éppen lenyomott billentyűt. Ebben az esetben kerülhet új helyre a kurzor. Ennek figyelésére felülírjuk a Click és a KeyUp eljárásokat. Amikor ezekre kerül a vezérlés, akkor meghívjuk a ValueUp belső eljárásunkat, mely meghatározza a három új property értékét, abban az esetben, ha a komponens futási időben van.
procedure TMemoX.ValueUp;
begin
  if not (csDesigning in ComponentState) then begin
A sor számát a Memo komponens EM_LINEFROMCHAR üzenete küldi meg válaszként.
    FLinePosition:=Perform(EM_LINEFROMCHAR, SelStart, 0);
A soron belüli karakterpozíciót az EM_LINEINDEX üzenetre kapjuk meg, itt paraméterként meg kell adnunk azt, hogy melyik sorról is van szó.
    FCharPosition:=Perform(EM_LINEINDEX, FLinePosition, 0);
A sor hosszát az EM_LINELENGTH üzenet küldése szolgáltatja.
    FLineLength:=Perform(EM_LINELENGTH, FCharPosition, 0);
    FLinePosition:=FLinePosition+1;
    FCharPosition:=SelStart-FCharPosition+1;
Az értékek számítása után aktivizáljuk az OnPositionChange eseményt.
    if Assigned(FOnPositionChange) then begin
      FOnPositionChange(Self);
    end;
  end;
end;