![]() |
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:
Aktuell klappt es mit dem Focus-Setzen auf das richtige Editfeld.
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; 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? |
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:
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:
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. |
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; |
AW: Form.keypreview - Taste an Edit weiterreichen?
Zitat:
![]() |
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. |
AW: Form.keypreview - Taste an Edit weiterreichen?
Zitat:
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 ![]() Und wenn ich dann diese verlinkte Seite aufrufe, steht dort aber gar nichts von Self :gruebel: |
AW: Form.keypreview - Taste an Edit weiterreichen?
Moin...:P
Wie immer mache ich den Spielverderber...
Delphi-Quellcode:
:kotz: Das das immer wieder benutzt wird, obwohl die halbe Welt davor warnt!
with edit1 do
|
AW: Form.keypreview - Taste an Edit weiterreichen?
Zitat:
Ich würde mir ja wirklich sowas wünschen:
Delphi-Quellcode:
...wobei "qry" dann lokal nur im "with" Block definiert ist.
with var qry:=DataModule1.Query1 do begin
qry.FieldByName('foo').AsString := bar; [...] end; |
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; [...] ![]() |
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 08:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz