Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Eingabeeinschränkung bei Edit wird ignoriert (https://www.delphipraxis.net/135410-eingabeeinschraenkung-bei-edit-wird-ignoriert.html)

BAMatze 10. Jun 2009 12:53


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:
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;
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.

Ich hatte die Frage in ähnlicher Weise schonmal hier gestellt, leider aber kam dann keine weitere Antwort. Hoffe mit der Aufarbeitung in einem lauffähigen Projekt ist es einfacher mein Problem nach zu vollziehen.

Vielen Dank
BAMatze

BAMatze 10. Jun 2009 14:05

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;

DeddyH 10. Jun 2009 14:19

Re: Eingabeeinschränkung bei Edit wird ignoriert
 
Die Methode FEdKeyDown ist in der Basisklasse aber deklariert?

BAMatze 10. Jun 2009 14:28

Re: Eingabeeinschränkung bei Edit wird ignoriert
 
Zitat:

Zitat von DeddyH
Die Methode FEdKeyDown ist in der Basisklasse aber deklariert?

hab sie wie folgt in der Ursprungskomponente (eigentlich) auf das OnKeyDown-Event des enthaltenden TEdits gelegt:
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;

DeddyH 10. Jun 2009 14:34

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);

BAMatze 10. Jun 2009 14:46

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:
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;
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?

Satty67 10. Jun 2009 14:55

Re: Eingabeeinschränkung bei Edit wird ignoriert
 
Zitat:

Zitat von BAMatze
Kann es sein dass ich mein Delphi vieleicht mal reparieren oder neu installieren sollte?

NEIN!

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:
procedure TLabZahlEdit.FEdKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  [...]
  inherited FEdKeyDown(Sender, Key, Shift);
  Key := 0;
end;
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.

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;

BAMatze 10. Jun 2009 18:35

Re: Eingabeeinschränkung bei Edit wird ignoriert
 
Zitat:

Zitat von Satty67
Zitat:

Zitat von BAMatze
Kann es sein dass ich mein Delphi vieleicht mal reparieren oder neu installieren sollte?

NEIN!

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.

Sorry, dass ich erst jetzt antworten kann, bin gerade erst zu Hause angekommen.
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

Satty67 10. Jun 2009 19:17

Re: Eingabeeinschränkung bei Edit wird ignoriert
 
Zitat:

Zitat von BAMatze
Wollte mit der Komponente eigentlich nur meinen Sourcecode für dieses verringern.

Dafür ist die Vererbbarkeit der Objekte ja auch da.

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.

BAMatze 10. Jun 2009 19:43

Re: Eingabeeinschränkung bei Edit wird ignoriert
 
Zitat:

Zitat von Satty67
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.

Das dumme ist, es hat bei 2 Komponenten von den 3 für (ich würde sagen) 5min funktioniert. Dann hab ich die 3 schnell fertig gemacht und dachte toll endlich geschafft und das war dann Pustekuchen. Leider hatte ich da meine neugewonnen Kenntnisse von Subversion noch nicht umgesetzt und konnte somit auch nicht nochmal auf den funktionierenden Code zugreifen :cry: und jetzt sitze ich schon wieder 1 Tag und grübel, was ich vorher anders gemacht hatte. Leider Gedächtnis wie ein Loch und ich sehe nicht mehr, was anders war. :wall:


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