![]() |
Eingabeeinschränkung bei Edit wird ignoriert
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo und guten Tag an alle DP´ler,
Ich sitze noch immer an einem Problem, was ich einfach nicht gelöst bekommen auch wenn ich glaube der Fehler ist eigentlich recht simpel. Ich hänge auch eine vorbereitetes Projekt einmal an, damit ihr dies testen könnt. Hier werde ich natürlich die entsprechenden Textstellen zeigen, bei denen ich nicht weiter komme. Folgendes Problem ergibt sich bei mir ich leite das onKeydown-Event einer meiner Komponenten ab und möchte dort die Eingabe auf bestimmte Zahlensysteme (Ganze Zahlen, Reele Zahlen, ...) einschränken. Hier mal der Quellcode dafür:
Delphi-Quellcode:
Laut dem Debugger wird Key auf 0 gesetzt, so wie ich das möchte. Wenn ich weiterhin in der UrsprungsKomponente (LabEdit) den Key weiter verfolge, ist der Key immer noch 0 trotzdem wird im Edit jegleicher Buchstaben gezeigt, den ich auf der Tastatur drücke, egal ob er erlaubt ist oder nicht.
procedure TLabZahlEdit.FEdKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin //* Laut dem Debugger wird das Ändern des Key auf Null ausgeführt und im inherited //* auch so übergeben. Leider ist noch nicht bekannt, warum der die Keys doch im //* Edit und im Label angezeigt werden. Die Funktion der case FZahlart of Ganzzahl: if Key in [0..7,9..12,14..26,28..44,46..47,58..255] then Key := 0; posGanzzahl: if Key in [0..7,9..12,14..26,28..47,58..255] then Key := 0; Gleitkommazahl: if Key in [0..7,9..12,14..26,28..43,46..47,58..255] then Key := 0; posGleitkommazahl: if Key in [0..7,9..12,14..26,28..43,45..47,58..255] then Key := 0; end; inherited FEdKeyDown(Sender, Key, Shift); end; Ich hatte die Frage in ähnlicher Weise schonmal ![]() Vielen Dank BAMatze |
Re: Eingabeeinschränkung bei Edit wird ignoriert
In der Ursprungskomponente ist mir auch etwas komisches aufgefallen, dass nämlich eine Zeile übersprungen wird. Hab sie mal markiert:
Delphi-Quellcode:
procedure TLabEdit.FEdKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin // Die Änderung hier an dieser Prozedur sehen wie folgt aus: OnChange wird nur // aktiviert, wenn eine Eingabe getätigt wurde, die verschieden von der vorherigen // ist. // Bei Esc wird alles wieder zurückgesetzt und das OnChangeEvent wird nicht aktiviert. if key in [13, 27] then begin FEdEingabe.Visible := false; FLblAnzeige.Visible := true; case key of 13: begin FLblAnzeige.Caption := FEdEingabe.Text; //UpdateLabelCaption(FLblAnzeige.Caption); if FsTextWert <> FEdEingabe.Text then if assigned(FOnChange) then FOnchange; FsTextWert := FEdEingabe.Text; end; 27: begin FLblAnzeige.Caption := FsTextWert; //UpdateLabelCaption(FLblAnzeige.Caption); FEdEingabe.Text := FsTextWert; end; end; end; inherited; // <--- wird einfach übersprungen //FLblAnzeige.Caption := FEdEingabe.Text; //UpdateLabelCaption(FLblAnzeige.Caption); //ChangeEmbeddedEdit; end; |
Re: Eingabeeinschränkung bei Edit wird ignoriert
Die Methode FEdKeyDown ist in der Basisklasse aber deklariert?
|
Re: Eingabeeinschränkung bei Edit wird ignoriert
Zitat:
Delphi-Quellcode:
// im Constructor (hab es aber auch schon in der CreateWnd-Funktion drin, leider keine Besserung)
constructor TLabEdit.Create(AOwner: TComponent); ... FEdEingabe := CreateEdit(0,0, FLblAnzeige.Width + 20, FLblAnzeige.Height, FLblAnzeige.Font.Height, false); FEdEingabe.OnKeyDown := FEdKeyDown; ... function TLabEdit.CreateEdit(PosX, PosY, Width, Height, Textgroesse: integer; visible: boolean): TEdit; begin result := TEdit.Create(nil); result.Left := PosX; result.Top := PosY; result.Width := Width; result.Font.Assign(Font); //result.Text := Text; result.Visible := visible; result.Parent := Self; end; |
Re: Eingabeeinschränkung bei Edit wird ignoriert
Sowas hab ich noch nie versucht. Wird die Zeile denn angesprungen, wenn Du sie ausformulierst?
Delphi-Quellcode:
inherited KeyDown(Sender,Key,Shift);
|
Re: Eingabeeinschränkung bei Edit wird ignoriert
Also wenn ich in dieser Zeile einen Haltepunkt (inherited Keydown(Key, Shift)) mache, stoppt das Programm nur dann dort, wenn ich auch wirklich eine Zahl drücke. Wenn ich etwas anderes drücke scheint er nicht in diesen Zweig zu kommen, was ich ja nicht verstehe. Bei mir ist der Key dann Null und entspricht ja nicht 13 oder 27 (Enter und Escape) trotzdem wird alles im Edit ausgegeben :cry: egal was ich drücke.
Selbst folgende Änderung führt bei mir zu keinem Erfolg: in der abgeleiteten Komponente
Delphi-Quellcode:
Ich sehe zwar, dass der Key nicht in die Range passt, trotzdem wird es anscheinend weitergeleitet. Kann es sein dass ich mein Delphi vieleicht mal reparieren oder neu installieren sollte?
procedure TLabZahlEdit.FEdKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin //* Laut dem Debugger wird das Ändern des Key auf Null ausgeführt und im inherited //* auch so übergeben. Leider ist noch nicht bekannt, warum der die Keys doch im //* Edit und im Label angezeigt werden. Die Funktion der {case FZahlart of Ganzzahl: if Key in [0..7,9..12,14..26,28..44,46..47,58..255] then Key := 0; posGanzzahl: if Key in [0..7,9..12,14..26,28..47,58..255] then Key := 0; Gleitkommazahl: if Key in [0..7,9..12,14..26,28..43,46..47,58..255] then Key := 0; posGleitkommazahl: if Key in [0..7,9..12,14..26,28..43,45..47,58..255] then Key := 0; end; } if Key in [13, 27, 48..58] then inherited KeyDown(Key, Shift); end; |
Re: Eingabeeinschränkung bei Edit wird ignoriert
Zitat:
Aus Erfahrung meiner jahrelangen "stümperhaften" Programmierung weis ich, das es zu 99% am Code (also am Programmierer) liegt, nicht an der IDE... was sich bei dem BDS nicht geändert haben sollte. ;) KeyDown, KeyUp, KeyPress ist ja nur um den Wert von Key zu ändern. Die Anzeige wird durch die Ereignisse ja nicht gemacht. Genauer: Setze mal zum Testen alle Keys auf #0, ob die Änderung überhaupt bei FEditEingabe aus TLabEdit ankommt:
Delphi-Quellcode:
Ich glaube die "neue" Ereignis-Methode könnte u.U. gar nicht bis zum ursprünglichen TEdit durchgereicht werden (bzw. der neue Wert von Key), also CharCode im TEdit nicht auf 0 gesetzt, weshalb die Zeichen ausgegeben werden.
procedure TLabZahlEdit.FEdKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin [...] inherited FEdKeyDown(Sender, Key, Shift); Key := 0; end; Also im Prinzip die neue Methode in der neuen Klasse nochmal mit dem Ereignis verbinden
Delphi-Quellcode:
constructor TLabZahlEdit.Create(AOwner: TComponent);
begin inherited create(AOwner); // default-Wert setzen: FZahlart := Gleitkommazahl; EdEingabe.OnKeyDown := FEdKeyDown; // FEdEingabe durch ein property sichbar machen end; TLabEdit... property EdEingabe : TEdit Read FEdEingabe; |
Re: Eingabeeinschränkung bei Edit wird ignoriert
Zitat:
Was du sagst hab ich auch schon oft in meiner Zeit hier festgestellt, dass ich regelmäßig sogar einfach zu erkennende Fehler nicht wirklich erkenne. Hängt wohl auch damit zusammen, dass ich es selber trotz Debugger gebrauchs noch nicht gewohnt bin richtig nach Fehlern zu suchen, was ich jetzt auch genau merke. Also zu dem Fehler, ich hatte vorhin nochmal, wie oft angemerkt wurde auch bei anderen Fehleranalyse-Threats ein Zeilen für Zeilen Durchlauf mit dem Debugger gemacht. Die Variable Key wird definitiv auf den Wert 0/#0 gesetzt. Hab das auch schon öfters mal so direkt bei TEdit gemacht und dort hat es immer so funktioniert, dass dann die Zeichen auch noch unterdrückt wurden. Diesmal allerdings anscheinend nicht. Werde Freitag, wenn ich wieder bei der Arbeit bin, das mit deinem Tip @Satty67 probieren. Danke auf jeden Fall erstmal, wenn das nicht funktioniert, werde ich das wohl erstmal bei seite legen und das Hauptproblem in meinem Programm erstmal weiter verfolgen. Wollte mit der Komponente eigentlich nur meinen Sourcecode für dieses verringern. BAMatze |
Re: Eingabeeinschränkung bei Edit wird ignoriert
Zitat:
Bin selber kein Klassen-Spezialist, deshalb stolper ich regelmäßig über sichtbare/nicht sichtbare Elemente, virtuelle/abstrakte Methoden etc... hab' zu spät mit OOP und Klassen angefangen und jetzt sind die Teile einfach zu flexibel. |
Re: Eingabeeinschränkung bei Edit wird ignoriert
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 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 by Thomas Breitkreuz