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;
Code: Alles auswählen
if Form1.DBMemoText.Focused = true then;
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;
"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 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)