"Delete"-Taste funktioniert nicht mehr

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

"Delete"-Taste funktioniert nicht mehr

Beitrag von Aliobaba »

Hallo,

seit Tagen kämpfe ich mich mit einem Programmfehler herum und ich komme einfach nicht auf die Lösung. Wahrscheinlich fehlt nur mal wieder ein winziger kleiner Hinweis - und meine Lebensqualität ist wieder voll zurück und der Jahreswechsel wird glücklich :? .

Den fehlerhaften/nicht funktionierenden Programmcode zu posten ist nicht möglich, weil ich überhaupt nicht weiß, WO (in meiner "Quellcode-Wüste") der Fehler liegen könnten. Außerdem ist es wahrscheinlich besser, wenn ich mit meinem vielleicht "chaotischen" Programmierstil nicht zur allgemeinen Belustigung hier beitrage. Deshalb versuche ich, einige Eigentümlichkeiten meiner Software zu schildern, vielleicht hat jemand von Euch den "ultimativen" Hinweis oder Tip:

Es geht um folgendes Programm: https://www.heise.de/download/product/mymemorydb-89626 .Eine Update-Version mit einem (hoffentlich) verbesserten Frontend ist geplant - und da geht offenbar irgend etwas schief:
Die [Entf]=[Delete] Taste funktioniert auf den "TDBMemo"-Feldern nicht mehr, und zwar gar nicht mehr. Irgendwie muss das Problem damit zusammenhängen, dass die Eingabe-"Focus-Übergabe" von einem Eingabefeld zu einem anderen nicht mehr richtig funktioniert und "irgendwie" der "Delete"-Tastaturbefehl "verloren geht". Erschwert ist die Situation dadurch, dass das Programm mit (mehr als) zwei Fenstern arbeitet. Wenn man innerhalb eines Fensters den Focus einem Memo-Element auf dem anderen Fenster übergeben möchte,

Code: Alles auswählen

procedure TForm1.TextMain_Focus_geben;
begin
  Form1.DBMemoText.SelLength:=0;
  Form1.DBMemoText.SelStart:=0;    //   springt IMMER an den Anfang!!
  Form1.DBMemoText.Color:= $00EAFBEA; // ->hellgrün
  Form1.DBMemoText.SetFocus;
end;
dann ist die unmittelbar daraufhin gemachte Abfrage:

Code: Alles auswählen

if Form1.DBMemoText.Focused = true then;
leider nicht zwingend "true";

Tastatursteuerbefehle (Strg-C / Strg-V / F1 /F2 / Bild nach oben / Bild nach unten usw.) von Form2 auf Form1 werden mit der Procedur:

Code: Alles auswählen

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState   );
begin
    Form1.FormKeyDown(Sender, Key, Shift);
end;
übertragen.

"KeyPreview" ist auf allen verwendeten Fenstern (es sind mehr als zwei) auf "true" gesetzt.


Und nun passieren seltsame Dinge.

Warum "kommt" das "Delete" Ereignis gelegentlich bei der Abfrage "durch" die Fenster1 und Fenster2 :

Code: Alles auswählen

if (Key = VK_Delete) AND (DBMemoText.Focused = true) then  Showmessage('Delete kommt an'); 
... und manchmal nicht?
Und warum wird die Delete-Anweisung innerhalb des Memo-Feldes nicht ausgeführt, AUCH WENN das Delete-Ereignis nach dem Abarbeiten des "KeyDown" Ereignis auf Fenster1 (Form1) "durchkommt".

Warum werden die Tasten (z.B.) "Pfeil nach oben" / "Pfeil nach unten" /"Pos1" / "Bild nach oben" / "Bild nach unten" im TDBMemo-Feld richtig abgearbeitet und nur die "Delete"-Taste nicht, obwohl dieser "Delete-Tastenbefehl" nach "Durchlauf" durch beide Fenster (sh. oben: "procedure TForm2.FormKeyDown ..." "durch kommt": "Showmessage('Delete kommt an')" erscheint.

Seltsam ist auch die Tatsache, dass der "Delete"-Tastaturbefehl auch bei ganz normalen "junfräulichen" "Memo"-Textfeldern nicht abgearbeitet wird (es wird kein Buchstabe aus dem Memo-Feld entfernt), die unmittelbar vorher ohne weitere Programmanweisungen "einfach nur" auf das Fenster gelegt worden sind.

Eigenartig ist auch folgendes Verhalten: Wenn ich mit der Maus dem Memo-Feld den Focus gebe, dann funktionieren sogar auch andere Tastaturbefehle ( z.B. "Pfeil nach oben" / "Pfeil nach unten" / "Strg-C" / " Strg-V" usw.) nicht mehr. Wenn ich mit "Form1.TextMain_Focus_geben;" per Programmcode das Memo-Feld anspringe, dann funktionieren diese Tastaturbefehle SCHON, "Delete" aber in keinem Fall.

Wo wird vom Programm eigentlich der "Delete"-Tastendruck für Memo-Felder abgefangen und verarbeitet? VOR "KeyDown" bzw. "KeyUp" Ereignis einzelner Graphischer Elemente oder hinterher? Irgendwohin muss dieser "Delete"-Befehl für das Memo-Feld ja "verschwinden" [ Key := 0; ]

Ich weiß, dass es mit diesen Angaben und ohne Quellcode sehr schwierig ist, mir zu helfen. Aber wahrscheinlich würde mir schon ein kleiner Hinweis oder eine kleine Idee genügen, um bei meiner Fehlersuche weiter zu kommen.
Danke!

Aliobaba
(Alfons Geigenberger)
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: "Delete"-Taste funktioniert nicht mehr

Beitrag von wp_xyz »

Von einem Formular Tasteneingaben durch Aufruf von FormKeyDown an ein anderes Formular weitergeben zu wollen, klingt (1) nach schwerem Design-Fehler, (2) nach: "funktioniert nicht" (der Aufruf von FormKeyDown heißt ja nicht, dass das Tastaturereignis nun tatsächlich beim anderen Formular landet. Wo ist z.B. das KeyUp, das KeyPress?). Nach meiner Erfahrung führt es früher oder später immer zu Problemen, wenn Formulare nicht selbständig sind und ein anderes Formular benötigen, um richtig zu funktionieren. Leider kann ich keine konkreteren Hilfestellungen geben, weil ich nichts genaueres weiß, warum du das so machst.

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: "Delete"-Taste funktioniert nicht mehr

Beitrag von Aliobaba »

Danke für die schnelle Antwort, wp_xyz,

ich mache das deshalb, weil es programmweit (sehr viele) Hotkey's gibt, die auf jedem Formular in gleicher Weise funktionieren sollen, egal wo der Focus gerade liegt. Und das Programm besteht nun mal aus zwei (Haupt)-Fenster.
Und weil ich nicht in den Programmcode eines jeden Fensters die "universal geltenden" definierten HotKeys in gleicher Weise eintragen möchte, habe ich die "KeyDown" Variablen so von Form2 an Form1 weiter geleitet:

Code: Alles auswählen

Form1.FormKeyDown(Sender, Key, Shift);

Dieser tolle Tip von MnVisual hat übrigens jahrelang hervorragend funktioniert, kann also nicht so schlecht sein. Und nun muss mir irgendein Fehler unterlaufen sein, warum der "Delete"-Tastendruck nicht mehr auf einem "Memo"-Formular "ankommt". Aber welcher?? :(

Ach ja: Noch ein Hinweis: Wenn ich auf Form1 ALLE Inhalte in der Procedur des "Key-Down" Ereignisses auskommentiere, dann besteht der Fehler weiterhin; der Fehler kann also nicht an dieser Weiterleitung liegen.(?).
Auch das

Code: Alles auswählen

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState   );
begin
    // Form1.FormKeyDown(Sender, Key, Shift);
end;
ändert nichts an dem bestehenden Fehler.


Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: "Delete"-Taste funktioniert nicht mehr

Beitrag von Aliobaba »

Hallo und Guten Abend,

auch den heutigen Tag habe ich zu großen Teilen damit verbracht, nach einem möglichen Fehler zu suchen. Ein wenig näher bin ich der Lösung vielleicht auch schon gekommen. Und meine Frage war natürlich viel zu speziell auf das Programm bezogen und damit ist eine Suche nach der Lösung ohne Programmcode natürlich kaum möglich.
Ich möchte das Problem nochmal gezielter formulieren; vielleicht hat ja jemand noch eine Idee. Zunächst vermutete "Fokus-Probleme" konnte ich heute weitestgehend ausschließen.

Also:

Ich habe ein Programm mit 8 Formularen. Auf zwei dieser Formulare ist ein Löschen von Buchstaben mit der [Entf]=[Delete]-Taste in Memo- und Edit-Feldern nicht möglich, obwohl alle anderen Tastaturbefehle (Einfügen/Bild_nach_oben/Bild_nach_unten usw.) problemlos funktionieren. Auch wenn ich ein neues "junfräuliches" Memo- oder Edit-Feld auf dieses Formular lege: Die [Entf]-Taste verweigert den Dienst. Auf allen anderen 6 Formularen funktioniert die [Entf]-Taste problemlos.

Der [Entf]-Code kommt offenbar auf die Textfelder "durch":

Code: Alles auswählen

procedure TForm1.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
begin
   Showmessage (inttostr(Key) );   
end;
Hier erscheint der korrekte Code für diese Tastaturtaste:
Delete.png
Delete.png (8.8 KiB) 1392 mal betrachtet


Meine ganz konkrete Frage: Was kann alles daran Schuld sein, dass die besagten Memo- oder Edit-Felder nur bei zwei von acht Formularen das [Entf] verweigern, alle anderen Tastaturcodes aber nicht?

Vielleicht hat ja jemand noch eine Idee.
Einen schönen Abend noch!

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: "Delete"-Taste funktioniert nicht mehr

Beitrag von Michl »

Hast du vielleicht Keypreview bei einigen Formularen auf true und bei einigen nicht?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: "Delete"-Taste funktioniert nicht mehr

Beitrag von Aliobaba »

Hallo Michl,

Danke, dass Du Dir mal Gedanken gemacht hast!
Keypreview ist bei allen Formularen auf true.

Aber es ist zum Verzweifeln! Welche Konstellation ist denn nur denkbar, dass innerhalb ALLER, auch "frisch generierter" Memo- und Edit-Felder bei einigen Formularen isoliert nur die [Delete]-Taste nicht funktioniert und bei anderen Formularen aber problemlos. Alle anderen Tastenbefehle aber arbeiten auf ALLEN Formularen problemlos :(

Vielleicht hat ja noch jemand irgend eine Idee.

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: "Delete"-Taste funktioniert nicht mehr

Beitrag von Michl »

Wenn du ein Minimalbsp hier posten könntest, wäre das sehr von Vorteil (eine Kopie deines Projektes machen und nacheinander alles rausschmeißen, was nicht relevant ist). Evtl. ist das ja ein Bug und muss gefixt werden.

PS: Händisch OnKeyDown abzufangen, um eine bestimmte Aktion auszuführen ist mMn in größeren Projekten nicht von Vorteil. TAction wäre da eher meine Wahl.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: "Delete"-Taste funktioniert nicht mehr

Beitrag von Aliobaba »

Hallo,
ich glaube, ich habe den Fehler gefunden!! :D
Der [Entf]-Shortcut wurde zusätzlich nochmal in der Hauptmenüleiste im "Menüeditor" definiert.
Und das hat wohl Vorrang vor dem "KeyPreview" der Form.

Oh Mann! Ich habe mir wirklich "einen Wolf gesucht". Dank besonders an "Michl", der mir sogar auch private Hilfe angeboten hat!!!

All dies ist für mich weiterhin sehr eigenartig!!! Draufgekommen bin ich, weil ich alle(!) Code-Zeilen Ereignisprocedur der Form1 und Form2 auskommentiert(!) habe:

Code: Alles auswählen

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState   );
begin
     //  Form1.FormKeyDown(Sender, Key, Shift);
end;
 
procedure

Code: Alles auswählen

TForm1.FormKeyDown(Sender: TObject; var Key: word; Shift:
TShiftState);
begin
  {
        .................
       ///// Hier folgt dann die lange Liste der auskommentierten Shortcuts
        .....................
  }

end;

Trotzdem funktionierten "einige" Shortcuts weiter; deshalb kam ich drauf, dass die angegebenen Shortcuts in den Menüs der Hauptmenüleiste (ganz oben) Probleme machen könnten. Und genau da war ein [Entf] bei einer Shortcut-Eigenschaft eines Feldes eingegeben.

Nun ja; jetzt funktionierts immerhin wieder :) :)

Ich habe im Menüeditor sowohl diese Shortcut-Anweisung definiert (weil der shortcut dann "so schön" am Ende der Zeile im Menü angegeben ist) UND den Befehl im "onClick" Ereignis. Wo könnte das noch Probleme machen. Wie macht Ihr das?

Die Frage bleibt, warum der Shortcut weiterhin funktioniert, obwohl die Anweisung im Quellcode ja auskommentiert ist!? :?: :?:

Nochmal euch Allen Alles Beste für 2017!
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antworten