Programowanie w języku Delphi » Gotowce

Komentarze

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:

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:

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:

(****************************************************************)
(*                                                              *)
(*      Copyright (c) 2001 by Service for programmers           *)
(*                Build: 24.03.2001                             *)
(*          HTTP://WWW.PROGRAMOWANIE.OF.PL                      *)
(*              E - mail:  [email protected]                    *)
(*                                                              *)
(****************************************************************)
(*
  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.