Einzelnen Beitrag anzeigen

BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

MaxLength-Eigenschaft in Komponente integrieren

  Alt 5. Jun 2009, 14:15
Hallo und guten Tag an alle DP´ler,

Ich überarbeite gerade eine meiner Komponenten, da sie wie ich derzeit feststelle noch nicht 100%ig so funktioniert, wie ich mir das vorstelle.

Die Komponente besteht aus einem Label und einem Edit. Wenn die Komponente angeklickt wird (aktiviert wird) ist das Eidt sichtbar, damit ein Wert eingegeben wird. Wenn die Komponente deaktiviert ist (sie verliert den Focus) dann ist das Label sichtbar. Dies benötige ich für die Darstellung einer technischen Zeichnung.

Jetzt ergibt sich folgendes Problem. Die maximale Anzahl an Zeichen soll für das Edit vorgegeben werden und eigentlich möchte ich, dass meine Komponente die ursprüngliche Property von dem normalen TEdit erbt. Dies gelingt mir allerdings noch nicht. Habe folgendes an Quellcode erstellt:

Delphi-Quellcode:
type TLabEdit = Class(TWinControl)
  private
  // Eigenschaftsvariablen
    FiTextLength, FiMaxTextLength: integer;
  // Komponenten
    FsTextWert: string;
    FLblAnzeige: TLabel;
    FEdEingabe: TEdit;
  // Eventvariablen
    FOnClick: TNotifyEvent;
    FOnChange: TOnChangeEvent;
  // create-Funktionen für das Label und das Edit
    function CreateLabel(PosX, PosY, Textgroesse: integer; visible: boolean): TLabel;
    function CreateEdit(PosX, PosY, Width, Height, Textgroesse: integer; visible: boolean): TEdit;
  // Interaktions-Prozeduren
    procedure FLblOnClick(Sender: TObject);
    procedure FEdKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  // Änderungs-Prozeduren
    procedure ChangeEmbeddedEdit;
  // Setter- und Getter
    function GetTextLength: integer;
    procedure SetMaxTextLength(iWert: integer);
    function GetMaxTextLength: integer;
  // Event-Prozeduren
    procedure WMMouseClick(var Msn: TMessage); message MouseClick;
    procedure CMMouseOver(var Msn: TMessage); message MouseOver;
    procedure CMMouseLeave(var Msn: TMessage); message MouseLeave;
  protected
    procedure createWnd; override;
  published
    property OnChange: TOnChangeEvent read FOnChange write FOnChange;
    property Enabled;
    property Visible;
    property Text;
    property Font;
    property MaxLength: integer read GetMaxTextLength write SetMaxTextLength;
  public
    constructor create(AOwner: TComponent); override;
    destructor destroy; override;
    property Length: integer read GetTextLength;
End;

...

procedure TLabEdit.SetMaxTextLength(iWert: integer);
begin
  FiMaxTextLength := iWert;
  FEdEingabe.MaxLength := FiMaxTextLength; // <--- Hier entsteht ein Fehler
end;

function TLabEdit.GetMaxTextLength: integer;
begin
  result := FiMaxTextLength;
end;

...

function TLabEdit.CreateEdit(PosX, PosY, Width, Height, Textgroesse: integer; visible: boolean): TEdit;
begin
  result := TEdit.Create(nil);
  result.Parent := Self;
  result.Left := PosX;
  result.Top := PosY;
  result.Width := Width;
  result.Font.Assign(Font);
  result.Text := Caption;
  result.Visible := visible;
end;

...

procedure TLabEdit.CreateWnd;
begin
  inherited createwnd;
  FLblAnzeige := CreateLabel(3, 3, 18, true);
  FLblAnzeige.OnClick := FLblOnClick;
  FEdEingabe := CreateEdit(0,0, FLblAnzeige.Width + 20, FLblAnzeige.Height, FLblAnzeige.Font.Height, false);
  FEdEingabe.OnKeyDown := FEdKeyDown;
  FiMaxTextLength := 100000;
  ChangeEmbeddedEdit;
end;
In der gekennzeichneten Stelle wird jetzt ein Fehler gemeldet: "Zugriffsverletzung bei Adresse ... in Modul ProjKomponente. Lesen von Adresse..."
Wie kann ich möglichst unter Verwendung der Eigenschaft der TEdit-Komponente die MaxLength-Eigenschaft in der Komponente setzen?

Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat