Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Tastaureingabe bei dyn. erstellter Form überwachen (https://www.delphipraxis.net/43382-tastaureingabe-bei-dyn-erstellter-form-ueberwachen.html)

TeTSuO 3. Apr 2005 09:58


Tastaureingabe bei dyn. erstellter Form überwachen
 
Hallo erastma

Wie kann ich bei einer dyn. erstellten Form das Ereignis OnKeyPress abfragen
mein Quelltext sieht folgendermasen aus:

Delphi-Quellcode:
interface
...

Function MsgBoxEx(Cap,Text: String;uType: Integer;
                  var appProperty: Boolean;appIniIdent,cbText: String):Integer;
Procedure KeyPressEvent(Sender: TObject; var Key: Char);

var
  AMsgDialog                 : TForm;

implementation

Function MsgBoxEx(Cap,Text: String;uType: Integer;
                  var appProperty: Boolean;appIniIdent,cbText: String):Integer;
// Eigene MessageBox mit CheckBox die Programmeinstellung anzeigt und setzt
// ------------------------------------------------------------------------
// Übergabewerte
// -------------
// Cap = Caption
// Text = Meldungstext
// uType = Erscheinung wie bei MessageBox
// appProperty = Programmeinstellung
// appIniIdent = unter welchem Eintrag wert in Ini speichern
// cbText = Text der CheckBox
//
// Rückgabewert
// ------------
// Je nach Benutzeraktion
var
  ACheckBox                  : TCheckBox;
Begin
  // Fenster mit Aussehen von MessageBox erstellen
  AMsgDialog := CreateMessageDialog(Cap, GetmtType(uType), Getbtns(uType));
  // CheckBox auf Fenster erstellen
  ACheckBox := TCheckBox.Create(AMsgDialog);
  with AMsgDialog do
    try
      // Tastatureingaben prüfen
      KeyPreview:=True;
      OnKeyPress:=KeyPressEvent;    //<------- Das hier funzt net
      // kein Systemmenü für Form
      BorderIcons:=[];
      // Caption des Fensters auf Übergabewert
      Caption := Text;
      // Fenster vergrößern damit platz für Checkbox
      Height := 159;
      WITH ACheckBox DO
        // CheckBox konfigurieren
        BEGIN
          // Parent auf Fenster zuweisen
          Parent := AMsgDialog;
          // Text auf Übergabewert
          Caption := cbText;
          // an/aus auf Übergabewert
          Checked := appProperty;
          // positionieren
          top := 100;
          Left := 6;
        END;
      // Breite seperat auf Fenster setzten
      ACheckBox.Width := Width;
      // Fenster anzeigen auf Eingabe warten
      Result:=ShowModal;
      // Wenn "Ja","Nein" dann speichern
      if (Result = mrYes) or (ModalResult = mrNo) Then Begin
         appProperty:=ACheckBox.Checked;
         WriteIniB(appIniIdent,appProperty);
      End;
    Finally
      ACheckBox.Free;
      Free;
    End;
End;

Procedure KeyPressEvent(Sender: TObject; var Key: Char);
Begin
 // Wenn Esc bei Meldungsfenster Wert Cancel zurückgeben
 if Key=#27 then Begin
    AMsgDialog.ModalResult:=mrCancel;
    Close;
 End;
End;

DGL-luke 3. Apr 2005 10:13

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Delphi-Quellcode:
form.onkeypress:=keypressevent;
das "form" muss natürlich deine selbst erstellte messagebox sein.

TeTSuO 3. Apr 2005 10:17

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Zitat:

Zitat von DGL-luke
Delphi-Quellcode:
form.onkeypress:=keypressevent;
das "form" muss natürlich deine selbst erstellte messagebox sein.

Hab ich doch mit

Delphi-Quellcode:
  with AMsgDialog do
    try
      ...
      OnKeyPress:=KeyPressEvent;    //<------- Das hier funzt net
das iss ja das was net funzt

c113plpbr 3. Apr 2005 10:24

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
versuchs doch mal mit
Delphi-Quellcode:
@OnKeyPress := @KeyPressEvent;
sollte eigentlich klappen, allerdings bekommst du dann meines Wissens nach KEINE der PARAMETER mit, die eigentlich an OnKeyPress übergeben werden.

ciao, Philipp

TeTSuO 3. Apr 2005 10:29

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Zitat:

Zitat von c113plpbr
versuchs doch mal mit
Delphi-Quellcode:
@OnKeyPress := @KeyPressEvent;

Jetzt kann ich zwar kompilieren aber die Procedur wird einfach übersehen (Breakpoint funzt net)
bei Tasteneingabe. :gruebel:

c113plpbr 3. Apr 2005 10:31

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Zitat:

Zitat von TeTSuO
Zitat:

Zitat von c113plpbr
versuchs doch mal mit
Delphi-Quellcode:
@OnKeyPress := @KeyPressEvent;

Jetzt kann ich zwar kompilieren aber die Procedur wird einfach übersehen (Breakpoint funzt net)
bei Tasteneingabe. :gruebel:

Nein, übersehen wird sie nicht, nur, wie schon gesagt, bekommst du keine parameter mit, d.h. Key ist immer 0, genauso wie Sender immer nil ist, du wirst also so nur erfahren, dass etwas gedrückt wurde, aber nicht was ...

ciao, Philipp

TeTSuO 3. Apr 2005 10:35

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Das ist aber nicht das was ich brauche weil ich abfragen muss ob Esc (#27) gedrückt wurde damit die MsgBox einen anderen wert zurückgibt. Danke trotzdem

SirThornberry 3. Apr 2005 10:52

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
deine OnKeyPress-Procedure muss eine Methode sein (also eine Procedure die in einer Klasse ist). Dann kannst du die zuweisung auch ohne "@" machen. Im übrigen werden die Parameter schon mitgeliefert, da aber deine procedure vom falschen typ ist stehen die parameter an der falschen Stelle im speicher so das du nicht ran kommst (eventuell zerschießt du dadurch sogar was)

TeTSuO 3. Apr 2005 11:37

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Zitat:

Zitat von SirThornberry
deine OnKeyPress-Procedure muss eine Methode sein (also eine Procedure die in einer Klasse ist). Dann kannst du die zuweisung auch ohne "@" machen. Im übrigen werden die Parameter schon mitgeliefert, da aber deine procedure vom falschen typ ist stehen die parameter an der falschen Stelle im speicher so das du nicht ran kommst (eventuell zerschießt du dadurch sogar was)

Wie kann ich das am einfachsten programmieren ohne jetz großartig viel zu ändern :?:

malo 3. Apr 2005 12:04

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Zitat:

Zitat von TeTSuO
Zitat:

Zitat von SirThornberry
deine OnKeyPress-Procedure muss eine Methode sein (also eine Procedure die in einer Klasse ist). Dann kannst du die zuweisung auch ohne "@" machen. Im übrigen werden die Parameter schon mitgeliefert, da aber deine procedure vom falschen typ ist stehen die parameter an der falschen Stelle im speicher so das du nicht ran kommst (eventuell zerschießt du dadurch sogar was)

Wie kann ich das am einfachsten programmieren ohne jetz großartig viel zu ändern :?:

Eine Klasse erstellen für dein Form. Im Public-Bereich werden dann alle Procedures und FUnktionen, die etwas mit deinem neuen Form machen deklariert, außerdem musst du deine Prozeduren so definieren:

Delphi-Quellcode:
proecedure TMeinNeuesFormMitEigenerKlasse.MeineProzedur(var EinIntegerParameter: integer);
begin
// hier Code hin
end;
Du solltest aber schon ein wenig Vorkentnisse in OOP haben, die du hier kriegen kannst ;)

TeTSuO 3. Apr 2005 12:16

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Zitat:

Du solltest aber schon ein wenig Vorkentnisse in OOP haben, die du hier kriegen kannst ;)
Die Vorkenntnisse hab ich schon ich hab schon mehre klassen programmiert.
Ich hab aber gedacht ob es vielleicht so geht damit ich nicht so viel proggen muss

Delphi-Quellcode:

Type TMsgForm = class(TForm)
     published
        property OnKeyPress: TKeyPressEvent;
 End;

Var AMsgDialog : TMsgForm;
Dann klappt das aber nicht mehr mit

Delphi-Quellcode:
  AMsgDialog := CreateMessageDialog(Cap, GetmtType(uType), Getbtns(uType));
Das wäre das einfachste wenn einer ne idee hätte wie das funzt

malo 3. Apr 2005 12:20

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Darf ich fragen, WAS nicht klappt?

TeTSuO 3. Apr 2005 12:30

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Zitat:

Zitat von malo
Darf ich fragen, WAS nicht klappt?

Bei dem Aufruf
Delphi-Quellcode:
AMsgDialog := CreateMessageDialog(Cap, GetmtType(uType), Getbtns(uType));
Steht im Meldungsfenster

[Fehler] MsgBox.pas(47): Inkompatible Typen: 'TMsgForm' und 'TForm'

malo 3. Apr 2005 12:43

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Zeig uns doch mal die Funktion CreateMessageDialog ;)

Ich hab dieses seltsame Gefühl, dass sie als Rückgabewert "TForm" hat ;)

TeTSuO 3. Apr 2005 12:48

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Die Function ist in Delphi integriert in der Unit Dialogs und mit dem Hint hab ich gesehen das Sie TForm zurückgibt. :pale:

Was Jetzt

SirThornberry 3. Apr 2005 12:51

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
du musst die methode auch nicht unbedingt in diese Klasse packen. Du kannst die Methode auch in dein MainForm packen.

TeTSuO 3. Apr 2005 12:57

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
In diesem Fenster wird aber auch der Esc Button schon abgefragt ich muss es also über das Fenster der MessageBox machen und dem kann ich die Prozedur nicht zuweisen bzw. auslesen

SirThornberry 3. Apr 2005 13:01

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
musst du nicht

Delphi-Quellcode:
type
  TYourMainForm = class(TFrom)
  [...]
  private
    procedure FOnKeyPressFuerMsgDlg(Sender: TObject; var Key: Char);
    [...]
  end;

[...]
procedure TYourMainForm.FOnKeyPressFuerMsgDlg(Sender: TObject; var Key: Char);
begin
  //das ist nun die OnKeyPress für dein Dialog
end;
[...]
var AMsgDialog: TForm;
begin
  AMsgDialog := CreateMessageDialog(Cap, GetmtType(uType), Getbtns(uType));
  AMsgDialog.OnKeyPress := FOnKeyPressFuerMsgDlg;
  [...]

TeTSuO 3. Apr 2005 13:12

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
Zitat:

Zitat von SirThornberry
musst du nicht

Der Code funzt super danke. :dp:

Dann muus ich aber wenn ich die Unit in ner anderen App benutze das OnKeyPressEvent anpassen und auch die zuweisung zum Event ändern.

SirThornberry 3. Apr 2005 13:14

Re: Tastaureingabe bei dyn. erstellter Form überwachen
 
hättest du bei deinem ausgangsposting auch gemusst, ansonsten würde nur CreateMessageDialog neu zu schreiben übrig bleiben.


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