AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponentenentwicklung

Ein Thema von Black Lightning · begonnen am 11. Jun 2002 · letzter Beitrag vom 12. Jun 2002
Antwort Antwort
Black Lightning

Registriert seit: 11. Jun 2002
Ort: Isny
4 Beiträge
 
#1

Komponentenentwicklung

  Alt 11. Jun 2002, 16:08
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
--erst programmieren, dann denken, dann debuggen--
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 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.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Black Lightning

Registriert seit: 11. Jun 2002
Ort: Isny
4 Beiträge
 
#3
  Alt 11. Jun 2002, 23:16
hilft mir leider nicht weiter
--erst programmieren, dann denken, dann debuggen--
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Black Lightning

Registriert seit: 11. Jun 2002
Ort: Isny
4 Beiträge
 
#5
  Alt 12. Jun 2002, 00:25
Moin Christian,
freut mich dich hier wieder zu treffen

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
--erst programmieren, dann denken, dann debuggen--
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#6
  Alt 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);
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 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)
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Black Lightning

Registriert seit: 11. Jun 2002
Ort: Isny
4 Beiträge
 
#8
  Alt 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.
--erst programmieren, dann denken, dann debuggen--
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 12. Jun 2002, 12:14
Ich zitiere mal kurz die englische Delphi Hilfe zum Thema Message Handler
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

Das heisst - virtuell ist "illegal" für Event Handler. Warum der jetzt nicht funktioniert hat ...
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 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