Strona g│≤wna

 

Komentarze w RichEdit ( tak jak w Delphi )

Zastanawia│e╢ siΩ kiedy╢ jak mo┐na w RichEdit tworzyµ co╢ w rodzaju komentarzy tak jak w Delphi? Tzn., ┐e je┐eli naci╢niesz { to zmieni siΩ kolor i styl czcionki, a jak naci╢niesz } to styl i kolor powr≤c▒ do poprzedniego. Rozwi▒zanie jest do╢µ proste, ale niezbyt zgrabne :) 

Ot≤┐ stworzymy nowy typ danych mog▒cy zawieraµ tylko cyfrΩ 1 ( lewy nawias: { ) lub cyfrΩ 2 ( prawy nawias: } ). 

type
  chrBuckle = 1..2;

Teraz w sekcji Interface odpowiednie dane - tzn., zamiast pisaµ cyfry oznaczaj▒ce nawias zastosujemy sta│e opisowe:

(*
  Stale symbolizuja dwa znaki - { i }
*)
const
  chrLeft = 1;
  chrRight = 2;

Teraz zmienn▒ wskazuj▒c▒ na nowy typ danych: 

var
  BUCKLE : chrBuckle; // zmienna moze przyjac wartosc 1 lub 2

Oprogramuj teraz zdarzenie "OnKeyPress" komponentu TRichEdit. Wygl▒da to tak:

Listing 5.1


procedure TMainForm.rchTestKeyPress(Sender: TObject; var Key: Char);
begin
(*
  Pobiera numer nacinietego klawisza. Jezeli jest to numer 123 tzn., ze
  nacisniety zostal przycisk odpowiadajacy znakowi {
  Jezeli 125 to znaczy, ze wpisany zostal symbol }
  W zaleznosci jaki znak zostal wcisniety zmienna "BUCKLE" moze
  przyjac dwa parametry - cyfre 1 dla znaku { oraz cyfre 2 dla znaku }
  Zeby latwiej to bylo zapamietac zastosowalem stake, ktore odpowiadaja
  tymze cyfra
*)
  case Ord(Key) of
    123: BUCKLE := chrLeft;
    125: BUCKLE := chrRight;
  end;

  if BUCKLE = chrLeft then  // Jezeli wcisniety jest znak { to....
  begin
    rchTest.SelAttributes.Color := clActiveCaption; //... zmien kolor czionki...
    rchTest.SelAttributes.Style := Font.Style + [fsItalic];//...ustaw pochylenie
  end;
end;

Na pocz▒tek jest sprawdzane jaki klawisz zosta│ naci╢niΩty - je╢li jest to klawisz { to odpowiednio zmie± kolor czcionki w komponencie. Teraz oprogramuj zdarzenie "OnKeyUp" komponentu TRichEdit:

Listing 5.2


procedure TMainForm.rchTestKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
(*
  Pewnie zastanawiasz sie dlaczego ponizszy kod wpisany zostal w procedurze
  "OnKeyUp" zamiast "OnKeyPress"? Otoz zdarzenie "OnKeyUp" wystepuje dopiero
  po puszczeniu klawisza klawiatury i przed dodaniem do RichEdit'a znaku
  mozna zmienic jeszcze kolor czionki jaki bedzie w nim uzyty.
*)
  if BUCKLE = chrRight then
  begin
    rchTest.SelAttributes.Color := clBlack;
    rchTest.SelAttributes.Style := Font.Style - [fsItalic];
  end;
end;

Ca│y kod programu wygl▒da tak:

Listing 5.3


(****************************************************************)
(*                                                              *)
(*      Copyright (c) 2001 by Service for programmers           *)
(*                Build: 24.03.2001                             *)
(*          HTTP://WWW.PROGRAMOWANIE.OF.PL                      *)
(*              E - mail:  boduch@poland.com                    *)
(*                                                              *)
(****************************************************************)
(*
  Program dziala w ten sposob, ze wpisujac w komponencie "RichEdit"
  komentarz w stylu Delphi ( { i } ) usyskujemy efekt zastosowania
  tychrze komentarzy - tzn., czcionka zmienia kolor i staje sie
  pochylona.
*)

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TMainForm = class(TForm)
    rchTest: TRichEdit;
    procedure rchTestKeyPress(Sender: TObject; var Key: Char);
    procedure rchTestKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

{
  Nowy typ danych zawierajacy cyfry jedynie od 1 do 2
}
type
  chrBuckle = 1..2;

(*
  Stale symbolizuja dwa znaki - { i }
*)
const
  chrLeft = 1;
  chrRight = 2;

var
  MainForm: TMainForm;
  BUCKLE : chrBuckle; // zmienna moze przyjac wartosc 1 lub 2

implementation

{$R *.DFM}

procedure TMainForm.rchTestKeyPress(Sender: TObject; var Key: Char);
begin
(*
  Pobiera numer nacinietego klawisza. Jezeli jest to numer 123 tzn., ze
  nacisniety zostal przycisk odpowiadajacy znakowi {
  Jezeli 125 to znaczy, ze wpisany zostal symbol }
  W zaleznosci jaki znak zostal wcisniety zmienna "BUCKLE" moze
  przyjac dwa parametry - cyfre 1 dla znaku { oraz cyfre 2 dla znaku }
  Zeby latwiej to bylo zapamietac zastosowalem stake, ktore odpowiadaja
  tymze cyfra
*)
  case Ord(Key) of
    123: BUCKLE := chrLeft;
    125: BUCKLE := chrRight;
  end;

  if BUCKLE = chrLeft then  // Jezeli wcisniety jest znak { to....
  begin
    rchTest.SelAttributes.Color := clActiveCaption; //... zmien kolor czionki...
    rchTest.SelAttributes.Style := Font.Style + [fsItalic];//...ustaw pochylenie
  end;
end;

procedure TMainForm.rchTestKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
(*
  Pewnie zastanawiasz sie dlaczego ponizszy kod wpisany zostal w procedurze
  "OnKeyUp" zamiast "OnKeyPress"? Otoz zdarzenie "OnKeyUp" wystepuje dopiero
  po puszczeniu klawisza klawiatury i przed dodaniem do RichEdit'a znaku
  mozna zmienic jeszcze kolor czionki jaki bedzie w nim uzyty.
*)
  if BUCKLE = chrRight then
  begin
    rchTest.SelAttributes.Color := clBlack;
    rchTest.SelAttributes.Style := Font.Style - [fsItalic];
  end;
end;

end.

 

Gotowy kod programu mo┐esz ╢ci▒gn▒µ tutaj:

Buckle.zip ( 3 kB )

Adam Boduch