AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Eingabeeinschränkung bei Edit wird ignoriert
Thema durchsuchen
Ansicht
Themen-Optionen

Eingabeeinschränkung bei Edit wird ignoriert

Ein Thema von BAMatze · begonnen am 10. Jun 2009 · letzter Beitrag vom 10. Jun 2009
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 12:53
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
Angehängte Dateien
Dateityp: zip testprojekt_393.zip (250,5 KB, 2x aufgerufen)
2. Account Sero
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 14:05
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;
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 14:19
Die Methode FEdKeyDown ist in der Basisklasse aber deklariert?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 14:28
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;
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 14:34
Sowas hab ich noch nie versucht. Wird die Zeile denn angesprungen, wenn Du sie ausformulierst?inherited KeyDown(Sender,Key,Shift);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 14:46
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 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?
2. Account Sero
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 14:55
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;
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 18:35
Zitat von Satty67:
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
2. Account Sero
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 19:17
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.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Eingabeeinschränkung bei Edit wird ignoriert

  Alt 10. Jun 2009, 19:43
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 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.
2. Account Sero
  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 04:25 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