Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Frame und KeyPress


MarcRB1975 - Mi 27.10.10 10:25
Titel: Frame und KeyPress
Hallo,
ich habe folgende Frage:
Ich habe ein Frame und darauf lasse ich eine TEDit beim Createn erzeugen.
Das muss leider so sein, weil ich das Edit etwas geändert habe. Dass es z.B. nur möglich ist, dass man Zahlen eingeben kann. Dieses Frame + Edit habe ich mir als Komponente "umgewandelt".


FRAGE:
Kann ich, wenn dieses Edit in der Laufzeit den Focus hat und Eingaben getätigt werden, den/die Keys an das Frame "übergeben"?
Ich möchte nämlich dann bei dem Frame – ONKeyPress- die Anweisung geben:
wenn die Enter-Taste bei dem Edit gedrückt wurde, gehe zu der xy-Komponente (setfocus).
Also wenn meine "Frame-Komponente" auf dem Form liegt, würde ich ein ONKeyPress benötigen, das ich dann doppelclicke und dann meine Anweisung eingebe.
Ich würde also für das Frame auch ein ONKey-Press-Ereigniss benötigen. So wie das bei dem Edit. Geht das eigentlich?

Vorab vielen Dank und vielleicht kann mir ja jemand weiterhelfen.

Danke :-)


jaenicke - Mi 27.10.10 10:32

Da musst du das im Frame schon auch selbst unter published deklarieren. ;-)


MarcRB1975 - Mi 27.10.10 10:45

Vielen Dank für die schnelle Antwort.
Ja, das habe ich mir auch schon gedacht.
Für strings, integer, DoENTER, DoEXIT ect. kann ich das auch deklarieren. Aber für dieses ONKeyPress leider nicht. Ich weiß nicht, wie ich das als property deklarieren muss.
Vielleicht kannst Du mir ja da weiterhelfen?


Lemmy - Mi 27.10.10 13:53

Hallo,

eigentlich sollte ich es nicht machen...

Du kannst ein Form so umbiegen, dass es sich auf jedem anderen Container (Form, Panel,...) anzeigen lässt, in dem Du dem Form den entsprechenden Parent zu weist:


Delphi-Quelltext
1:
    frmShow.Parent := pnlClient;                    


Das musst Du dann aber zur Laufzeit machen, d.h. Du kannst mit dem Edit nciht zur Entwurfszeit arbeiten. Damit hast Du dann KeyPress...

Was ich aber nicht ganz verstehe: Es gibt tausende halbwegs funktionierender Edits die auf bestimmte Eingaben reagieren, z.b. in der JVCL oder auch bei Torry. Warum nimmst Du denn nicht eine von den vorhandenen? Bzw. wenn Du schon eine "Komponente" bauen willst, warum dann nicht gleich richtig? Der Aufwand um ein IntEdit zu machen ist nicht schwer, glaube es mir. Aber dann hast Du keine solche Krücke....

und übrigens (ist mir erst jetzt aufgefallen): Im OnKeyPress bzw. OnKeyUP/Down des Edit kannst Du auch auf die Enter-Taste reagieren....

Grüße


MarcRB1975 - Mi 27.10.10 18:51

Danke für Deine Nachricht.

Ich wäre auch froh, wenn es so eine Komponente, bzw. solche gäbe, die nicht ungefähr so sind, sondern genauso sind wie ich sie benötige.
Ich habe eine Vorstellung, wie etwas sein muss, und dann versuche ich das umzusetzen.

Mit dem OnKeyPress/Down:
ja das geht im Prinzip schon, aber nicht in diesem Fall. :-(
Weil das Edit auf einem Frame liegt. Und eben beim Erzeugen der Komponente, wird erst dann das Edit erzeugt.
Warum das Ganze auf einem Frame?
Ich habe immer wieder den Fall, dass ich diese neue Komponente immer wieder benötige.
Ganz links ist ein Panel mit einem Rahmen, in dem man z.B. Name, Straße, Ort direkt schreiben kann. Das zeigt dann an, was in das Edit kommt. Und dann nach diesem Panel schliesst das erzeugte Edit an. Wenn ich mir keine eigene Komponente mit diesem Aussehen und Funktionen schaffe müsste ich stets:
a) jedesmal ein Panel mit Beschriftung + Edit manuell zusammenschieben
b) bei jedem edit müsste ich dann bei KeyPress sagen: es sind nur Zahlen erlaubt und mache dann daraus ein Datum, oder eine Dezimalzahl ect
c) wenn dann keyPress Enter gedrückt wird, gehe zur Koponente XY weiter.

Ich schätze mal, ich benötige diese Komponente 30-50 mal. Soll ich das dann immer manuell schreiben??? Nein, das muss doch nicht sein.

Aus diesem Grund wollte ich das so machen.


jaenicke - Mi 27.10.10 19:25

user profile iconMarcRB1975 hat folgendes geschrieben Zum zitierten Posting springen:
Mit dem OnKeyPress/Down:
ja das geht im Prinzip schon, aber nicht in diesem Fall. :-(
Weil das Edit auf einem Frame liegt. Und eben beim Erzeugen der Komponente, wird erst dann das Edit erzeugt.
Und genau da musst du auch den Eventhandler zuweisen. Der leitet das dann an eine published property deines Frames weiter. Fertig. ;-)

user profile iconMarcRB1975 hat folgendes geschrieben Zum zitierten Posting springen:
Ich schätze mal, ich benötige diese Komponente 30-50 mal.
Das hört sich schon eher nach dem Problem an. Bist du sicher, dass dein Konzept was deine GUI angeht, sinnvoll ist? So viele Komponenten hören sich nicht danach an. :gruebel:


bummi - Mi 27.10.10 21:49

Klingt für mich eher so als ob Du eine neue registrierte Komponente schreiben solltest die all dies beinhaltet und mit Einstellungen bezüglich des Verhaltens versehen werden kann.


jaenicke - Mi 27.10.10 21:58

Wo ist da in diesem Fall der Vorteil gegenüber einem Frame? :gruebel:

Einen Frame muss man nicht extra installieren (wie eine Komponente) und ist trotzdem visuell im Designer.


bummi - Do 28.10.10 01:24

@jaenicke
Das ist etwas persönliches zwischen Frames und mir.
Ich habe unter D5 extrem schlechte Erfahrungen damit gemacht und meide sie seither wie der Teufels das Weihwasser.
Statt Frames verwenden wir Forms die zur Laufzeit gedockt werden wenn es angemessen erscheint, ansonsten eigene Komponenten.
Ein Hilfskonstrukt wir TFrame bei dem ich weder Constructoren noch Destructoren im Griff habe verwende ich ich nur äußerst widerwillig.

LG
Thomas


jaenicke - Do 28.10.10 05:47

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Ein Hilfskonstrukt wir TFrame bei dem ich weder Constructoren noch Destructoren im Griff habe verwende ich ich nur äußerst widerwillig.
Wie meinst du das mit den Konstruktoren? :gruebel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  TFrame2 = class(TFrame)
    Button1: TButton;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy(); override;
  end;
//...
constructor TFrame2.Create(AOwner: TComponent);
begin
  inherited;
  Button1.Caption := 'Test';
end;

destructor TFrame2.Destroy();
begin
  inherited;
end;
Funktioniert doch problemlos, ganz exakt wie bei irgendeiner Komponente, die du schreibst.


Lemmy - Do 28.10.10 06:46

Hi,

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:

Ich habe unter D5 extrem schlechte Erfahrungen damit gemacht und meide sie seither wie der Teufels das Weihwasser.


ich habe mit D7, D2007 und D2009 eine große Anwendung gebaut, die quasi nur auf Frames aufgebaut hat. Hatte damit keinerlei Probleme....

Grüße


bummi - Do 28.10.10 09:07

OK mea culpa....
Ich habe die Frames seinerzeit zu den Akten gelegt ohne mich ausreichend mit den Details der Implementierung zu beschäftigen...außerdem bin ich ein Freund abgeschlossener Komponenten.


jaenicke - Do 28.10.10 10:42

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
außerdem biun ich ein Freund abgeschlossener Komponenten.
Genau das ist ein Frame im Grunde. ;-)
Nur eben mit ein wenig einfacherer Integration was die visuelle Verwendung angeht.


Lemmy - Do 28.10.10 12:08

Hi,

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
OK mea culpa....


passt schon. die wurden ja mit Delphi 5 eingeführt - von daher ist es schon (darf ich warscheinlich schreiben? ;-)) möglich dass die da noch buggy waren *fg*