class helper / Methode ersetzen

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

class helper / Methode ersetzen

Beitrag von Mathias »

Ich möchte die Farbe der Edits ändern, da habe ich folgendes probiert.
Ist sowas überhaupt möglich ?
Oder muss man dafür eine komplett neue Komponente erstellen ?

Die Idee dahinter, das man nicht bei jedem Edit in dem Form-Designer die Ereignisse manuell anpassen muss.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { THelperEdit }
 
  THelperEdit = class helper for TEdit
    procedure OnEnter;
    procedure OnEditingDone;
  end;
 
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ THelperEdit }
 
procedure THelperEdit.OnEnter;
begin
  ShowMessage('hell');
  Color := $FF;
end;
 
procedure THelperEdit.OnEditingDone;
begin
  ShowMessage('hell');
  Color := $FFFF;
end;
 
end.  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 2122
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: class helper / Methode ersetzen

Beitrag von Warf »

Schon mal das Schlüsselwort override versucht?

Die Methoden sind Teil von TCustomEdit, dem Vorfahre von TEdit (Oder sogar noch weiter Oben im Erbbaum), und nicht von TEdit selbst, daher würde ich es mit override versuchen.

Das Funktioniert allerdings afaik nur mit MODE Delphi, und nicht mit ObjFPC, darum würde ich die Helferklasse in eine Separate Unit packen mit Mode Delphi

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: class helper / Methode ersetzen

Beitrag von Mathias »

Folgendes

Code: Alles auswählen

unit Unit1;
 
//{$mode objfpc}{$H+}
{$mode delphi}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { THelperEdit }
 
  THelperEdit = class helper for TEdit
    procedure OnEnter; override;
    procedure OnEditingDone; override;
  end; 
.......... 
bringt nur

Code: Alles auswählen

unit1.pas(16,15) Error: There is no method in an ancestor class to be overridden: "OnEnter;"
unit1.pas(17,15) Error: There is no method in an ancestor class to be overridden: "OnEditingDone;"
 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: class helper / Methode ersetzen

Beitrag von wp_xyz »

Hier ein Hack, den man bei Delphi immer wieder sieht, und der auch mit Lazarus funktioniert (zum Testen: einfach ein Formular mit zwei normalen TEdit-Controls):

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  TEdit = class(StdCtrls.TEdit)
  protected
    procedure DoEnter; override;
    procedure DoExit; override;
  end;
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
procedure TEdit.DoEnter;
begin
  inherited;
  Color := clRed;
end;
 
procedure TEdit.DoExit;
begin
  inherited;
  Color := clWindow;
end;
 
end. 
Falls man dieses modifzierte TEdit in mehreren Units benötigt, kann man den code dafür (type TEdit = class(StdCtrls.TEdit)....) in eine eigene Unit z.B. "modEdit") auslagern. Diesen Unitnamen muss man in der Formulardeklaration allen TEdits voranstellen (Edit1: modEdit.TEdit)

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: class helper / Methode ersetzen

Beitrag von Mathias »

Danke, so klappt es.
Diesen Unitnamen muss man in der Formulardeklaration allen TEdits voranstellen (Edit1: modEdit.TEdit)
Bei mir geht es ohne.

Die modEdit muss einfach am Schluss im Uses-Klausel stehen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: class helper / Methode ersetzen

Beitrag von wp_xyz »

Mathias hat geschrieben:Die modEdit muss einfach am Schluss im Uses-Klausel stehen.
Nur ist bei großen Projekten, wenn Units von mehreren anderen abhängen, nicht immer klar, ob das wirklich so ist.

Antworten