Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MaxLength-Eigenschaft in Komponente integrieren (https://www.delphipraxis.net/135141-maxlength-eigenschaft-komponente-integrieren.html)

BAMatze 5. Jun 2009 13:15


MaxLength-Eigenschaft in Komponente integrieren
 
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

sirius 5. Jun 2009 13:22

Re: MaxLength-Eigenschaft in Komponente integrieren
 
Hast du mal zwei Breakpoints gesetzt? Es sieht so aus, als ob du MaxLength eher setzt als CreateWnd aufgerufen worde.

BAMatze 5. Jun 2009 13:35

Re: MaxLength-Eigenschaft in Komponente integrieren
 
Zitat:

Zitat von sirius
Hast du mal zwei Breakpoints gesetzt? Es sieht so aus, als ob du MaxLength eher setzt als CreateWnd aufgerufen worde.

Jap das war es. Thx


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz