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 Form.keypreview - Taste an Edit weiterreichen? (https://www.delphipraxis.net/211294-form-keypreview-taste-edit-weiterreichen.html)

SearchBot 26. Aug 2022 13:41

Form.keypreview - Taste an Edit weiterreichen?
 
Ich möchte, daß wenn der Nutzer im Form einfach lostippt, die Eingabe in ein Edit-Feld umgeleitet wird.
"Einfach lostippen" heißt, der Focus kann zB auf einem Button stehen oder einer Checkbox...

Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 //Form1.KeyPreview ist true

 if Application.MainForm.ActiveControl=memo1 then begin
  memo1KeyPress(memo1,key); exit
 end;

 if //diese bekommen die Eingaben ja ganz normal
  (Application.MainForm.ActiveControl is TEdit) or
  (Application.MainForm.ActiveControl is TSpinEdit) or
  (Application.MainForm.ActiveControl is TLabeledEdit) or
  (Application.MainForm.ActiveControl is TMemo)
 then exit;

 //Irgendwo anders drauf
 if (key<>#13) then begin
   if edit1.canFocus then begin
    edit1.setfocus;
    edit1KeyPress(edit1,key);
   end else
   if edit2.canFocus then begin
    edit2.setfocus;
    edit2KeyPress(edit2,key);
   end;
  //   key:=#0; //ist das sinnvoll oder nötig?
 end;
end;
Aktuell klappt es mit dem Focus-Setzen auf das richtige Editfeld.

Aber mein Problem dabei ist, daß der erste Tastendruck auf diesem Weg ins Editfeld verloren geht.

Wie bekomme ich es hin, daß der erste Tastendruck auch ins Editfeld gelangt?

himitsu 26. Aug 2022 13:57

AW: Form.keypreview - Taste an Edit weiterreichen?
 
Ja klar, weil OnKeyPress nicht Alles ist,
denn OnKeyDown und OnKeyUp (Manches wird eigentlich dort und Anderes da behandelt)

z.B. Buttons werden beim Loslassen (Up) der Maustaste geklick
aber dagegen beim Niederdrücken (Down) der Leertaste geklick. (OnKeyPress ist hier also zu spät)
Auch Buchstaben in einem Edit kommen beim Drücken (Down) dort rein.




Warum Application.MainForm?
Stattdessen nehmen man eher "Self".

Und was wäre, wenn deine Form1 nicht die MainForm ist? :freak:
Wenn doch, dann maximal noch Screen.ActiveControl, aber die Form selber wäre eigentlich die "richtigere" Lösung.



Und
Zitat:

edit2KeyPress(edit2,key);
gibt das Ereignich NUR an deine Methode weiter.
Das Edit selber bekommt davon garnicht mit, also kann es den Buchstaben auch ganricht übernehmen.
Also SendMessage oder hier besser PostMessage, bzw. eventuell auch Perform an das Edit. (Tastatur- und Mausereignisse gehen normalerweise über die MessageQueue, also PostMessage)



Zitat:

ist das sinnvoll oder nötig?
Natürlich Ja.
Wenn du Etwas damit gemacht hast, wäre es doch blöd, wenn am Ende doch noch jemand Anderes auch nochmal was damit macht.
(quasi du drückst einmal und es ist wie Zweimal)

So wie z.B. bei deinem Memo1 ... da hast du nur (noch) Glück gehabt, dass OnKeyPress nur einen Teil behandelt.



Die beste Lösung wäre aber
nicht nachträglich den Fokus umbiegen, sondern das sofort zu machen, damit anschließend irgendwann die Eingaben direkt dort landen, wo sie sollen.
* Alle anderen Komponenten bekommen TabStop False
* bzw. landet der Focus innerhalb der Form nicht da, wo er soll (auf einem NichtEingabe-Control), dann wird er dort hingesetzt.

SearchBot 26. Aug 2022 15:21

AW: Form.keypreview - Taste an Edit weiterreichen?
 
Oha...

Danke für den Tipp mit dem Self - ich habe diesen Bezeichner schon öfter gesehen, aber bislang keine Erklärung dafür gefunden, wie ich ihn verwenden kann (und vermeide ihn daher lieber, weil ich nicht weiß, wie er funktioniert) - suche ich in der Bibliotheken-Referenz im Index danach, gibt es keinen Eintrag... auch im Quelltext und mit F1 darauf zeigt es mir keine Hilfethemen dazu an.

Ich habs jetzt so gemacht und es funktioniert :thumb:
Delphi-Quellcode:
   
 with edit1 do
  if canFocus then begin
   setFocus;
   text:=key;  //neue Eingabe immer leeres Textfeld, sonst SelStart:=length(text)+1;
   SelStart:=2; //weil es sonst den Cursor für weitere Eingaben zunächst an die erste Stelle im Edit setzt
  end;
 key:=#0;

Uwe Raabe 26. Aug 2022 15:23

AW: Form.keypreview - Taste an Edit weiterreichen?
 
Zitat:

Zitat von SearchBot (Beitrag 1510798)
suche ich in der Bibliotheken-Referenz

Da hat der auch nichts zu suchen: https://docwiki.embarcadero.com/RADS..._(Delphi)#Self

himitsu 26. Aug 2022 15:49

AW: Form.keypreview - Taste an Edit weiterreichen?
 
Innerhalb einer Methode deiner TForm1 kannst du direkt auf Edit1 von "dieser" Form zugreifen,
oder eben mit Self.Edit1, z.B. wenn man mitten in einem bösen WITH fest hängt.
(Self ist quasi ein unsichtbarer/impliziter Parameter an allen Methoden einer Klasse)

aber sowas wie Form1.Edit1 macht man "hier" niemals
und auch andere "externen" Variablen/Quellen sollte man besser niemals benutzen.

SearchBot 29. Aug 2022 09:57

AW: Form.keypreview - Taste an Edit weiterreichen?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1510799)
Zitat:

Zitat von SearchBot (Beitrag 1510798)
suche ich in der Bibliotheken-Referenz

Da hat der auch nichts zu suchen: https://docwiki.embarcadero.com/RADS..._(Delphi)#Self

Dankeschön.

Ein bisschen wird es dort ja erklärt. :thumb:
Witzigerweise steht dort aber auch: "For information about Self in class methods, see "Class Operators" in Class References."
Und wenn ich dann diese verlinkte Seite aufrufe, steht dort aber gar nichts von Self :gruebel:

haentschman 30. Aug 2022 05:52

AW: Form.keypreview - Taste an Edit weiterreichen?
 
Moin...:P

Wie immer mache ich den Spielverderber...
Delphi-Quellcode:
with edit1 do
:kotz: Das das immer wieder benutzt wird, obwohl die halbe Welt davor warnt!

Frickler 31. Aug 2022 17:32

AW: Form.keypreview - Taste an Edit weiterreichen?
 
Zitat:

Zitat von haentschman (Beitrag 1510989)
Moin...:P

Wie immer mache ich den Spielverderber...
Delphi-Quellcode:
with edit1 do
:kotz: Das das immer wieder benutzt wird, obwohl die halbe Welt davor warnt!

Früher war das mal guter Stil...

Ich würde mir ja wirklich sowas wünschen:
Delphi-Quellcode:
with var qry:=DataModule1.Query1 do begin
  qry.FieldByName('foo').AsString := bar;
  [...]
end;
...wobei "qry" dann lokal nur im "with" Block definiert ist.

himitsu 31. Aug 2022 18:40

AW: Form.keypreview - Taste an Edit weiterreichen?
 
Ja, Aliase gibt es leider nicht, aber (seit Kurzem) Inline-Variablen ... endlich ein Grund zum Upgrade :zwinker:
Delphi-Quellcode:
var qry := DataModule1.Query1;
qry.FieldByName('foo').AsString := bar;
[...]
https://www.delphipraxis.net/211303-...ml#post1510899 :stupid:

Uwe Raabe 31. Aug 2022 18:55

AW: Form.keypreview - Taste an Edit weiterreichen?
 
Wenn man den Scope ähnlich klein halten will wie bei dem with:
Delphi-Quellcode:
begin
  var qry:=DataModule1.Query1;
  qry.FieldByName('foo').AsString := bar;
  [...]
end;
...
begin
  var qry:=DataModule1.Query2;
  qry.FieldByName('bar').AsString := foo;
  [...]
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 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