PDA

Ver la Versión Completa : Creacion de componente


joseprad
01-08-2015, 20:38:58
Hola amigos:

Estoy intentando crear un componente TRichEdit con un corrector ortografico basado en Hunspell. De momento funciona correctamente y me marca en rojo las palabras incorrectas.
Al hacer clic sobre la palabra desearía crear un panel para poder, mediante un memo visulizar las palabras correctas.
Pero no se como hacerlo, he conseguido crear un panel pero dentro del RichEdit y claro yo necesito que se cree fuera.
Adjunto el código del componente por si alguien puede ayudarme.

type
TRichDic = class(TRichEdit)
private
FOldBackColor: TColor;
FColorOnEnter: TColor;
FHunspell: TNHunspell;
FDic: TStringList;
Paraula: string;
property OldBackColor: TColor read FOldBackColor write FOldBackColor;
procedure UpdateDics;
procedure ComprovarParaula(ValorLl, ValorIn, ValorOut: integer);
protected
procedure DoEnter; override;
procedure DoExit; override;
procedure KeyPress(var Key: Char); override;
procedure Click; override;
public
constructor Create(AOwner: TComponent); override;
destructor destroy; override;
{ Public declarations }
published
property ColorOnEnter: TColor read FColorOnEnter write FColorOnEnter;
{ Published declarations }
end;
procedure Register;

implementation

procedure Register;
begin
RegisterComponents('jrComponents', [TRichDic]);
end;

{ TRichDic }

procedure TRichDic.ComprovarParaula(ValorLl, ValorIn, ValorOut: integer);
var
tmpStr: TUnicodeStringList;
POsi: integer;
begin
if TNHSpellDictionary(FDic.Objects[0]).Spell(Paraula) then
SelAttributes.Color := clBlack
else begin
selStart := ValorIn;
SelLength := ValorLl;
SelAttributes.Color := clRed;
SelText := Paraula;
SelAttributes.Color := clBlack;
end;
end;

constructor TRichDic.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FColorOnEnter := Color;
UpdateDics;
end;

destructor TRichDic.destroy;
begin
inherited;
end;

procedure TRichDic.DoEnter;
begin
OldBackColor := Color;
Color := ColorOnEnter;
inherited;
end;

procedure TRichDic.DoExit;
begin
Color := OldBackColor;
inherited;
end;

procedure TRichDic.KeyPress(var Key: Char);
var
inici, Fi: integer;
PosIni, Llarc: integer;
begin
inici := 0;
// Polsat la barra espaiadora
if Key = #32 then begin
if Length(Paraula) > 0 then begin
Fi := selStart;
Llarc := Length(Paraula);
inici := Fi - Llarc;
ComprovarParaula(Llarc, inici, Fi);
Paraula := '';
Llarc := 0;
end;
end
else begin
// Controlem que les tecles siguin lletres o numeros
if (Key > #64) and (Key < #142) then begin
Paraula := Paraula + Key;
Inc(Llarc);
end;
// si s'ha polsat tecla backspace'
if (Key = #8) then begin
Paraula := '';
// with FRichEdit do begin
PosIni := selStart;
while text[selStart] <> ' ' do begin
Paraula := text[selStart] + Paraula;
selStart := selStart - 1;
end;
selStart := PosIni;
end;
// end;
end;
end;

procedure TRichDic.Click;
begin
inherited;

Aqui deberia crear el Panel
end;

procedure TRichDic.UpdateDics;
begin
with Hunspell do begin
ReadFolder(ExtractFilePath
('E:\RAD Studio\Projects\PRESSUPOSTOS\catalan.oxt'));
FDic := TStringList.Create;
FDic.AddObject('Diccionari', SpellDictionaries[0]);
SpellDictionaries[0].Active := True;
UpdateAndLoadDictionaries;
end;
end;

Muchas gracias

Neftali [Germán.Estévez]
03-08-2015, 11:50:54
...he conseguido crear un panel pero dentro del RichEdit y claro yo necesito que se cree fuera.

No tengo claro cual es exactamente el problema, pero puedes probar esto, a ver si es lo que necesitas:


pnl := TPanel.Create(Self.Owner);
pnl.Parent := TForm(Self.Owner);
pnl.Height := 100;
pnl.Width := 100;
pnl.Visible := True;
pnl.BringToFront;

AgustinOrtu
03-08-2015, 18:00:18
Yo usaria un PopupMenu, de hecho podrias implementar el corrector estilo Word, que con el click derecho te muestre las distintas correcciones y seleccionar la mas adecuada

joseprad
04-08-2015, 13:42:00
Hola a todos.

Con la respuesta de Neftali se crea el panel fuera del componente tal como yo deseo, pero se pone debajo. Ademas lo que yo desaria es posicionarlo con respecto al componente y lo que hace es posicionarse con respecto al Form.

También me valdría un PopupMenu, tal como apunta Agustin, pero no se manejar-lo en tiempo de ejecución.

Buscando he encontrado este post de Neftali http://www.clubdelphi.com/foros/showthread.php?t=15001 que funciona perfecto, pero falta posicinar-lo con respecto al componente.

Muchas gracias por las respuestas

ecfisa
04-08-2015, 14:15:49
Hola joseprad.

Tu componente deriva de TRichEdit, ¿ Probaste asignando el TPopupMenu creado en ejecución a la propiedad PopupMenu de TRichDic ?

Saludos :)

joseprad
04-08-2015, 15:26:22
Perfecto.
Muchas gracias de nuevo