Code: |
var frmMain: TfrmMain;
implementation
{$R *.DFM} {$R Smiley.res}
uses RichEdit;
type TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte; cb: Longint; var pcb: Longint): DWORD; stdcall;
TEditStream = record dwCookie: Longint; dwError: Longint; pfnCallback: TEditStreamCallBack; end;
type TMyRichEdit = TRxRichEdit;
// EditStreamInCallback callback function
function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte; cb: Longint; var pcb: Longint): DWORD; stdcall; var theStream: TStream; dataAvail: LongInt; begin theStream := TStream(dwCookie); with theStream do begin dataAvail := Size - Position; Result := 0; if dataAvail <= cb then begin pcb := read(pbBuff^, dataAvail); if pcb <> dataAvail then Result := UINT(E_FAIL); end else begin pcb := read(pbBuff^, cb); if pcb <> cb then Result := UINT(E_FAIL); end; end; end;
// Insert Stream into RichEdit
procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream); var EditStream: TEditStream; begin with EditStream do begin dwCookie := Longint(SourceStream); dwError := 0; pfnCallback := EditStreamInCallBack; end; RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, Longint(@EditStream)); end;
// Load a smiley image from resource
function GetSmileyCode(ASimily: string): string; var dHandle: THandle; pData, pTemp: PChar; Size: Longint; begin pData := nil; dHandle := FindResource(hInstance, PChar(ASimily), RT_RCDATA); if dHandle <> 0 then begin Size := SizeofResource(hInstance, dHandle); dhandle := LoadResource(hInstance, dHandle); if dHandle <> 0 then try pData := LockResource(dHandle); if pData <> nil then try if pData[Size - 1] = #0 then begin Result := StrPas(pTemp); end else begin pTemp := StrAlloc(Size + 1); try StrMove(pTemp, pData, Size); pTemp[Size] := #0; Result := StrPas(pTemp); finally StrDispose(pTemp); end; end; finally UnlockResource(dHandle); end; finally FreeResource(dHandle); end; end; end;
procedure InsertSmiley(ASmiley: string); var ms: TMemoryStream; s: string; begin ms := TMemoryStream.Create; try s := GetSmileyCode(ASmiley); if s <> '' then begin ms.Seek(0, soFromEnd); ms.Write(PChar(s)^, Length(s)); ms.Position := 0; PutRTFSelection(frmMain.RXRichedit1, ms); end; finally ms.Free; end; end;
procedure TfrmMain.SpeedButton1Click(Sender: TObject); begin InsertSmiley('Smiley1'); end;
procedure TfrmMain.SpeedButton2Click(Sender: TObject); begin InsertSmiley('Smiley2'); end;
// Replace a :-) or :-( with a corresponding smiley
procedure TfrmMain.RxRichEdit1KeyPress(Sender: TObject; var Key: Char); var sCode, SmileyName: string;
procedure RemoveText(RichEdit: TMyRichEdit); begin with RichEdit do begin SelStart := SelStart - 2; SelLength := 2; SelText := ''; end; end;
begin If (Key = ')') or (Key = '(') then begin sCode := Copy(RxRichEdit1.Text, RxRichEdit1.SelStart-1, 2) + Key; SmileyName := ''; if sCode = ':-)' then SmileyName := 'Smiley1'; if sCode = ':-(' then SmileyName := 'Smiley2'; if SmileyName <> '' then begin Key := #0; RemoveText(RxRichEdit1); InsertSmiley('Smiley1'); end; end; end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!