AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Form.keypreview - Taste an Edit weiterreichen?
Thema durchsuchen
Ansicht
Themen-Optionen

Form.keypreview - Taste an Edit weiterreichen?

Ein Thema von SearchBot · begonnen am 26. Aug 2022 · letzter Beitrag vom 31. Aug 2022
Antwort Antwort
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
317 Beiträge
 
Delphi 12 Athens
 
#1

Form.keypreview - Taste an Edit weiterreichen?

  Alt 26. Aug 2022, 14:41
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Form.keypreview - Taste an Edit weiterreichen?

  Alt 26. Aug 2022, 14:57
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?
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.
$2B or not $2B

Geändert von himitsu (26. Aug 2022 um 15:16 Uhr)
  Mit Zitat antworten Zitat
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
317 Beiträge
 
Delphi 12 Athens
 
#3

AW: Form.keypreview - Taste an Edit weiterreichen?

  Alt 26. Aug 2022, 16:21
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
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Form.keypreview - Taste an Edit weiterreichen?

  Alt 26. Aug 2022, 16:23
suche ich in der Bibliotheken-Referenz
Da hat der auch nichts zu suchen: https://docwiki.embarcadero.com/RADS..._(Delphi)#Self
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Form.keypreview - Taste an Edit weiterreichen?

  Alt 26. Aug 2022, 16:49
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.
$2B or not $2B
  Mit Zitat antworten Zitat
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
317 Beiträge
 
Delphi 12 Athens
 
#6

AW: Form.keypreview - Taste an Edit weiterreichen?

  Alt 29. Aug 2022, 10:57
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.
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

AW: Form.keypreview - Taste an Edit weiterreichen?

  Alt 30. Aug 2022, 06:52
Moin...

Wie immer mache ich den Spielverderber...
with edit1 do Das das immer wieder benutzt wird, obwohl die halbe Welt davor warnt!
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
599 Beiträge
 
Delphi XE6 Enterprise
 
#8

AW: Form.keypreview - Taste an Edit weiterreichen?

  Alt 31. Aug 2022, 18:32
Moin...

Wie immer mache ich den Spielverderber...
with edit1 do 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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Form.keypreview - Taste an Edit weiterreichen?

  Alt 31. Aug 2022, 19:40
Ja, Aliase gibt es leider nicht, aber (seit Kurzem) Inline-Variablen ... endlich ein Grund zum Upgrade
Delphi-Quellcode:
var qry := DataModule1.Query1;
qry.FieldByName('foo').AsString := bar;
[...]
https://www.delphipraxis.net/211303-...ml#post1510899
$2B or not $2B

Geändert von himitsu (31. Aug 2022 um 19:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#10

AW: Form.keypreview - Taste an Edit weiterreichen?

  Alt 31. Aug 2022, 19:55
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 12: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