Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Creacion de componente (https://www.clubdelphi.com/foros/showthread.php?t=88797)

joseprad 01-08-2015 20:38:58

Creacion de componente
 
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.
Código Delphi [-]
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

Cita:

Empezado por joseprad (Mensaje 495136)
...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:

Código Delphi [-]
  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


La franja horaria es GMT +2. Ahora son las 13:59:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi