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 Komponentenentwicklung (https://www.delphipraxis.net/104-komponentenentwicklung.html)

Black Lightning 11. Jun 2002 16:08


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:
procedure TAdvancedEdit.KeyPress(Sender: TObject; var Key: char);
var AdvancedEdit1: TAdvancedEdit;
begin
  if not (key in ['0'..'9', #46, #8]) then
    key := #0;
end;
wenn ich das aber so als komponente installiere, akzeptiert das AdvancedEdit Buchstaben genauso wie alles andere.

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

sakura 11. Jun 2002 17:35

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.

Black Lightning 11. Jun 2002 23:16

hilft mir leider nicht weiter :?

Christian Seehase 11. Jun 2002 23:39

Moin Black Lightning,

könntest Du vielleicht mal ein wenig von der Deklaration posten. Ich denke, dass es dann etwas einfacher wird Dir weiterzuhelfen.

Black Lightning 12. Jun 2002 00:25

Moin Christian,
freut mich dich hier wieder zu treffen :wink:

also hier der komplette Code, der Compilierbar und installierbar ist, aber nicht funktioniert.

Code:
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.
Gruß Black Lightning

MrSpock 12. Jun 2002 07:06

Hallo Black Lightning,

in deinem Code:

Code:
  AdvancedEdit1 := TAdvancedEdit.Create(self);
  AdvancedEdit1.SelStart := length(AdvancedEdit1.Text);
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:

Code:
   Self.SelStart := length(Self.Text);

sakura 12. Jun 2002 08:32

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)

Black Lightning 12. Jun 2002 12:08

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.

sakura 12. Jun 2002 12:14

Ich zitiere mal kurz die englische Delphi Hilfe zum Thema Message Handler
Zitat:

Zitat von Delphi
A message handler does not have to include the override directive to override an inherited message handler. In fact, it doesn’t have to specify the same method name or parameter type as the method it overrides. The message ID alone determines which message the method responds to and whether it is an override.

Kurz: Methoden mit einer Message ID werden automatisch in die virtuelle Tabelle aufgenommen. Ein Handler für den virtuellen Bereich wird in dem Moment eingeführt, wenn es bereits eine Methode in vorhergenden Klassen für das gleiche Event gibt :idea:

Das heisst - virtuell ist "illegal" für Event Handler. Warum der jetzt nicht funktioniert hat ... :?:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr.

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