![]() |
Komponentenentwicklung
Hallo,
also ich hab mir jetzt ein paar Komponenten-Entwicklungs-Tutorials durchgelesen, aber so richtig schlau bin ich daraus noch nicht geworden. Und das was mir mit Abstand am unklarsten ist, wie wo und ob ich überhaupt eine Instanz der neuen Komponente in der Definition erstellen soll/muss. In den Tuts sind so abgemagerte Beispiele drin das da auch keine Instanz erzeugt wird. Ich wolllte als ersten Versuch eine Ableitung des Edits namens AdvancedEdit schreiben. Die Besonderheit des Edits sollte sein dass man nur Ziffern eingeben kann, was ich in einem Programm bereits nutze:
Code:
wenn ich das aber so als komponente installiere, akzeptiert das AdvancedEdit Buchstaben genauso wie alles andere.
procedure TAdvancedEdit.KeyPress(Sender: TObject; var Key: char);
var AdvancedEdit1: TAdvancedEdit; begin if not (key in ['0'..'9', #46, #8]) then key := #0; end; Dann wollte ich noch in dem obigen Code den selstart am ende des textes setzen, das geht aber nur wenn man eine Instanz des AdvancedEdits erzeugt, aber eine Instanz eines Types zur Hilfe seiner eigenen Definition verwenden?? Kurz gesagt: Ich bin ratlos. Wenn jemand eine kleine aber nicht minimale Komponente geschrieben hat und sie hier oder in der CodeBibliothek veröffentlichen würde, würtde mir das vielleicht auch schon weiterhelfen. Gruß Black Lightning |
Das ist jetzt zwar nicht wirklich das, was Du wolltest, aber ein Anfang. (Copy&Paste und ähnliches fängt diese Lösung nicht ab). Aber immerhin eine Komponente...
Code:
unit AdvancedEdit;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TAdvancedEdit = class(TEdit) private { Private declarations } procedure WMChar(var Msg: TWMChar); message WM_CHAR; protected { Protected declarations } public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('gate(n)etwork', [TAdvancedEdit]); end; { TAdvancedEdit } procedure TAdvancedEdit.WMChar(var Msg: TWMChar); begin if ((Msg.CharCode >= $30) and (Msg.CharCode <= $39)) then inherited else Msg.Result := -1; end; end. |
hilft mir leider nicht weiter :?
|
Moin Black Lightning,
könntest Du vielleicht mal ein wenig von der Deklaration posten. Ich denke, dass es dann etwas einfacher wird Dir weiterzuhelfen. |
Moin Christian,
freut mich dich hier wieder zu treffen :wink: also hier der komplette Code, der Compilierbar und installierbar ist, aber nicht funktioniert.
Code:
Gruß Black Lightning
unit AdvancedEdit;
interface uses Windows, Messages, SysUtils, Classes, Controls, StdCtrls; type TAdvancedEdit = class(TEdit) private { Private declarations } protected procedure KeyPress(Sender: TObject; var Key: char); override; { Protected declarations } public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TAdvancedEdit]); end; procedure TAdvancedEdit.KeyPress(Sender: TObject; var Key: char); var AdvancedEdit1: TAdvancedEdit; begin if not (key in ['0'..'9', #46, #8]) then key := #0; AdvancedEdit1 := TAdvancedEdit.Create(self); AdvancedEdit1.SelStart := length(AdvancedEdit1.Text); end; end. |
Hallo Black Lightning,
in deinem Code:
Code:
erezugst du bei jedem KeyPress Event ein neues Edit Feld und setzt dort die Eigenschaft SelStart. Du solltest die erste Zeile weglassen und die zweite Zeile wie folgt benutzen:
AdvancedEdit1 := TAdvancedEdit.Create(self);
AdvancedEdit1.SelStart := length(AdvancedEdit1.Text);
Code:
Self.SelStart := length(Self.Text);
|
Hi,
ich hatte gestern keine Zeit mehr noch was zum Code zu schreiben, aber ich will jetzt noch ein, zwei Worte dazu loswerden. Ich habe genau wie Du damit angefangen, die AdvancedEdit Box von der Standard Edit Box abzuleiten. Anschließend habe ich einen neuen Nachrichten Handler (WM: Windows Message) eingesetzt. procedure WMChar(var Msg: TWMChar); message WM_CHAR; Die Nachrichten vom Typ WM_CHAR werden automatisch an diesen Handler gesandt, bevor diese verarbeitet werden. In der Prozedur teste ich, ob der gesandte Wert im Bereich '0'..'9' liegt. if ((Msg.CharCode >= $30) and (Msg.CharCode <= $39)) then Wenn dieses der Fall ist, dann rufe ich den Standard WM_CHAR Message Handler auf, damit die Zeichenfolge auch an das Editfeld gesandt wird. inherited Bei anderen Tasten teile ich Windows mit, sich die Nachricht zu "verkneifen" Msg.Result := -1; Ich hoffe, dass Dir das ein wenig weiterhilft. 8) |
der Code lässt sich zwar nun auch compilieren, hat aber keinerlei Auswirkung.
Muss man eine Methode nicht am Ende mit dem Schlüsselwort override versehen das die neue Methode die alte überschreibt? Nur wenn ich das tue, dann kommt eine Fehlermeldung vonwegen differs from previous declaration. |
Ich zitiere mal kurz die englische Delphi Hilfe zum Thema Message Handler
Zitat:
Das heisst - virtuell ist "illegal" für Event Handler. Warum der jetzt nicht funktioniert hat ... :?: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 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