AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi OOP-TRealEdit von TEdit abgeleitet und Fähigkeiten erweitert
Thema durchsuchen
Ansicht
Themen-Optionen

OOP-TRealEdit von TEdit abgeleitet und Fähigkeiten erweitert

Ein Thema von Hansa · begonnen am 9. Apr 2003 · letzter Beitrag vom 14. Aug 2003
Antwort Antwort
Seite 1 von 12  1 2311     Letzte »    
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

OOP-TRealEdit von TEdit abgeleitet und Fähigkeiten erweitert

  Alt 9. Apr 2003, 19:26
Hi,

was jetzt kommt bezieht sich hierauf:

http://www.delphipraxis.net/viewtopi...=4012&start=30

Es geht um OOP. Die Quelltexte hänge ich mal als Anhang dran. Um es vorweg zu sagen, es funktioniert, aber ich blicke nicht richtig durch warum eigentlich. Das ist nun eine neue Komponente, die real, oder irgendwelche Zahlenfelder rechtsbündig behandelt. Wenn es genau so, wie ich gleich erklären werde, installiert wird, befindet sich in der Objektablage bei "Data Controls" noch eine Komponente "RealEdit". Diese hat im OI noch eine property Alignment. Diese kann man nun auf rechts, links oder zentriert einstellen. Bei Zahleneingaben ist das wie bei einem Taschenrechner. D.h. statt der Komponente DBedit zieht man einfach ein DBrealEdit auf die Form und stellt die Ausrichtung ein. Wie gesagt, ich raffe das selbst noch nicht genau, was da hinter den Kulissen passiert. Das ganze ist aus Anregungen zusammengestückelt. Ein paar Fragen stelle ich selber noch zum Schluß.

Die Installation ist folgendermaßen zu bewerkstelligen : File->new->other->package->Add nun muß die Datei "realedit.pas" ausgewählt werden. Dann noch "compile" und "install". Dann müßte die neue Komponente bei "Data Controls" zu finden sein. Die wird dann genau so behandelt wie ein Button o.Ä.

Nun meine Fragen:

1. SetAlignment läßt sich nur compilieren, wenn es so ist, wie es jetzt ist. Lasse ich den Parameter weg, meldet Delphi "incompatible Types", aber ich brauche nur eine rechtsbündige Ausrichtung, für linksbündig nehme ich sowieso das "normale" DBedit. Und Center, was soll ich damit ?

2. Im OI steht standardmäßig taLeftJustify. Wie kann ich das umbiegen, daß da taRightJustify drin steht. Damit hätte sich die erste Frage erledigt.

3. Was macht CreateParams konkret?

Ach so, noch zur Erläuterung : im private-Abschnitt steht die neue Eigenschaft, also Alignment. Dazu dient das FAlignment, welches in SetAlignment gesetzt wird. Um es im OI angezeigt zu bekommen MUß das ganze als published deklariert werden. Das ist wichtig. Sieht man sich das ganze an, im Prinzip nur 4 Zeilen , die in einem riesigen Programm an jeder Ecke benutzt werden könnten.

[edit=Daniel B]Titel angepasst, da viele neue sachen dazu gekommen sind. MfG Daniel [/edit]
Angehängte Dateien
Dateityp: pas realedit.pas (946 Bytes, 55x aufgerufen)
Gruß
Hansa
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2
  Alt 9. Apr 2003, 19:34
invalid Session hat wieder zugeschlagen.

Hier ist noch ein Beispiel für ein kleines Programm:

Code:
unit RealEd;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, FIBDatabase, pFIBDatabase, FIBDataSet, pFIBDataSet,
  StdCtrls, Mask, DBCtrls, RealEdit;

type
  TForm1 = class(TForm)
    DBRealEdit1: TDBRealEdit;
    pFIBDatabase1: TpFIBDatabase;
    pFIBDataSet1: TpFIBDataSet;
    pFIBTransaction1: TpFIBTransaction;
    DataSource1: TDataSource;
    procedure Edit1Exit(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  pFIBdataset1.Active := false;
  pFIBdataset1.SelectSQL.Text := 'SELECT * FROM <TABELLENNAME> WHERE NR = '+Edit1.Text;
  pFIBdataset1.Active := true;
end;

end.
Wird im Edit1 etwas eingegeben stehen die Daten rechtsbündig oder wie auch immer in DBrealEdit1.
Gruß
Hansa
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#3
  Alt 9. Apr 2003, 19:56
Hallo,

äähm, kann es sein dass das ganze nicht mit PE funktioniert? So wie ich das sehe muss man wenisgtens Prof. haben, wegen dem DBEdit.
So würde das ganze hier nicht vielen was bringen.

Grüsse, Daniel
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4
  Alt 9. Apr 2003, 20:07
jo, mit PE gehts wohl nicht, sorry. Denke in einer anderen Dimension. Aber wie wäre es probeweise das DB in den Typ-Bezeichnungen wegzulassen Ansonsten genau so vorgehen wie beschrieben. Dann einmal das Alignment ändern und zur Entwurfszeit sehen, wie es aussieht.

Für die, die das schon installiert haben : das Package einfach neu compilieren und die Palettenseite der Objektablage z.B. in "Beispiel" ändern, statt "Data Controls"
Gruß
Hansa
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#5
  Alt 9. Apr 2003, 20:45
Hallo,

ich habe ein Package erzeugt das vom normlaen Edit abstammt.
Zip runterladen und dann Doppelklick auf die HansaRealEdit.dpk.
Danach erscheint die neue Komponenten auf der Palette Standard. Ganz rechts, ist das gleiche Icon wie beim normalen Edit.

Grüsse, Daniel

Nachtrag: Doppelklick auf die Komponenten, dann kommt ein Fensterlein, dort auf Install und dann ist es fertig!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6
  Alt 9. Apr 2003, 21:20
Damit sich keiner den Strick holt 8):

Noch etwas wichtiges, Delphi ist manchmal dumm. Ist irgendetwas schief gelaufen, falsche Palettenseite usw. dann stellt Delphi sich etwas quer. "Die Komponente x kann nicht installiert werden, weil sie schon in package y drin ist" oder so ähnlich. Sollte so etwas auftauchen, dann muß man folendes tun : Components --> Install Packages --> in der Liste die zu entfernende Komponente suchen (Ja wirklich: Installieren aufrufen, um etwas zu beseitigen ). Dann Remove/entfernen und ok. Ansonsten gehts schief. Und dann wie beschrieben fortfahren.

Und noch was : im Moment wirkt sich das Alignment im OI nicht aus oder nicht unbedingt wie gewünscht, weil es konstant auf taRightJustify eingestellt ist. Ursprünglich wollte ich es konstant so lassen. Es stellte sich aber heraus, daß das SetAlignment einen Parameter braucht. Siehe meine eigenen Fragen.
Gruß
Hansa
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7
  Alt 9. Apr 2003, 21:35
Alignment kann so richtig aktiviert werden:

Code:
procedure TRealEdit.SetAlignment (value:TAlignment);
begin
  fAlignment:=value;
  RecreateWnd;
end;
Gruß
Hansa
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#8
  Alt 10. Apr 2003, 21:53
Hallo,

also Eure Begeisterung zum Thema OOP ist berauschend. Muss ich jetzt einfach mal so sagen. Ich dachte das interesse an dem Thema gibt. Und es gibt auch Personen die sich jetzt deswegen Arbeit machen. Interessierts jetzt doch keinen mehr?

Grüsse, Daniel
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9
  Alt 11. Apr 2003, 10:34
Hi Daniel B,

sonst brauche ich hier wohl niemanden zu begrüßen. Das KeyPress mußte noch etwas geändert werden. da müssen natürlich noch . und , rein, sonst ginge nur integer. Dann wurde das OnlyReals nicht berücksichtigt, die Abfrage ob true oder false muß da auch noch rein.

Dann habe ich noch taRightJustify in den Constructor CreateParams eingebaut. Da das Vorfahrobjekt TEdit ist, ist dies standardmäßig von Delphi auf "linksbündig" gesetzt. Der Grund ist einfach nur Faulheit, damit man nicht jedesmal im OI das umändern muß. Jetzt ist zwar alles schön rechtsbündig, aber die Methode ist zu hart. Man kann nun nicht mehr taCenter oder taLeftjustify einstellen. Das muß irgendwo anders rein, bloß wo?

Code:
procedure TRealEdit.CreateParams(var Params: TCreateParams);
const Alignments: array[TAlignment] of byte=(ES_Left, ES_Right, ES_Center);
begin
  inherited CreateParams(Params);
  fAlignment := taRightJustify;
  Params.Style := Params.Style or Alignments[fAlignment];
end;

procedure TRealEdit.KeyPress(var Key:Char);
begin
  inherited KeyPress(Key);
  if OnlyReals then begin
    if not (Key in ['0'..'9','.',',',#8]) then
      Key := #0;
  end;
end;
Noch ein Schönheitsfehler : Das Dezimalzeichen (im Moment kann . oder , verwendet werden) kann man eingeben sooft man will. D.h. da müßte noch ein Exception-Handler eventuelle Fehler abfangen. Besser wäre es, sobald ein '.' oder ',' eingegeben wird, eine zweite zu blockieren. Dabei spielt dann auch noch Backspace eine Rolle. wird das einzige DecChar gelöscht sollte man es wieder eingeben können.
Gruß
Hansa
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#10
  Alt 11. Apr 2003, 12:43
Hiermit braucht man nicht einmal eine Exception abzufangen. Über die Tastatur sind Eingaben wie "53.,.543.3435,,,543.43" nun ausgeschlossen:

Code:
procedure TRealEdit.KeyPress(var Key:Char);
var ZulZeichen : SET OF char;
begin
  inherited KeyPress(Key);        
  if OnlyReals then begin
    ZulZeichen := ['0'..'9',#8];
    if pos (DecimalSeparator,text) = 0 THEN // kein . im RealEdit.text . zulassen
      ZulZeichen := ZulZeichen + [DecimalSeparator]
    else
      ZulZeichen := ZulZeichen - [DecimalSeparator]; // zweiten . verhindern
    if not (Key in ZulZeichen) then
      Key := #0;
  end;
end;
Jetzt wäre es vielleicht noch schön, auch den Tausenderpunkt zu berücksichtigen und automatisch zu setzen. Wegen der tollen Resonanz hier, werde ich das wohl auch selber machen müssen.

Zwischenbericht:
alle Eigenschaften der Delphi Standardkomponente TEdit wurden an die neue Komponente TRealEdit vererbt, dann wurden einige Methoden überschrieben und somit durch eigene ersetzt. Um dies zu vereinfachen wurden im OI zwei zusätzliche Felder eingefügt: "Alignment" und "RealsOnly", siehe "published"-Sektion. Also kann ein Edit-Feld nach Belieben rechts/linksbündig oder zentriert eingegeben/angezeigt werden. Steht OnlyReals auf false, können beliebige Zeichen eingegeben werden, RealEdit.text kann dann halt ausgerichtet werden. Steht es auf true, werden nur Zahlen akzeptiert, wobei ein Komma nicht mehrfach eingegeben werden kann. Das schließt falsche Zahleneingaben aus. Desweiteren wurde ein Package erstellt -> compiliert -> installiert, so daß die Komponente wie gewohnt einfach auf eine Form gezogen werden kann.

P.S. (das kann ich mir jetzt doch nicht verkneifen) : zumindest für mich ist es unbegreiflich, daß anscheinend von 99% nur das vorgekaute von Borland benutzt wird. Delphi ist von Grund auf objektorientiert ausgelegt. Alle Komponenten, die ihr benutzt, egal ob Button oder Table sind in ähnlicher Weise von Borland erstellt worden. Da führen sie bei Delphi 6 TLabeledEdit (ist nicht viel mehr, als das TRealEdit hier) ein und schon werden sie Tausende von Updates los. Und ihr Tausende Euros. Das soll verstehen, wer will. Gott sei Dank gibt es keine Pisa-Studie über deutsche Programmierer. Die würde weit schlimmer ausfallen, als die von den Schülern. Finde ich ziemlich traurig, so was.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 12  1 2311     Letzte »    


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 09:07 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