Announcement

Collapse
No announcement yet.

Formübergreifendes OnKeyDown ???

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Formübergreifendes OnKeyDown ???

    Hi, Leute.

    Will mich kurz vorstellen. Bin ein ganz "normaler" EDV-Fuzzi in einem hamburger Verlag.<BR>
    Baue Netzwerke (NOVELL,WINDOOFS,LINUX), schraube Rechner und mach ganz normale<BR>
    Anwendungsentwicklung und Schnittstellenprogramierung in DELPHI. Ich habe großen Respekt<BR>
    vor sog. "BitVerbiegern" und ich muß gestehen, daß manche der hier gestellten Anfragen<BR>
    über meinen Horizont gehen.<BR><BR>

    <B>ABER ich hab' da auch mal ne Frage:</B>

    Ich habe vor 12 Jahren mal in AMBER (modulare Programmierung unter DOS)<BR>
    eine Auftragsverwaltung für ein Kurierunternehmen geschrieben und will diese nun <BR>
    endlich in DELPHI erneuern.<BR><BR>

    Diese Auftragsverwaltung hat natürlich mehrere Forms. Pro Form steuere das Durchlaufen<BR>
    der Eingabefelder über KeyPress und KeyDown.<BR><BR>
    Das Durchlaufen der Eingabefelder ist nur mit den Tasten RETURN, KEY_UP und KEY_DOWN möglich<BR>
    (Tabulatortaste wird abgefangen).<BR><BR>

    Im Moment ist es so, daß ich die KeyDown-Routine auf <B>JEDER</B> Form einsetze.<BR>
    Da ich kein großer Freund von redundantem Code bin, möchte ich diese "KeyEvents" gerne<BR>
    in eine Lib auslagern.<BR><BR>
    Ich übergebe also die aufrufende Form an die Lib und prüfe, ob ich in einem gültigen Eingabefeld stehe.<BR><BR>
    Leider kann ich nicht testen, ob das funktioniert, weil DELPHI den Kram nicht compilieren will.<BR><BR>
    Ich denke, es liegt daran, daß DELPHI zum Entwicklungszeitpunkt die Form<BR>
    (die in der Lib ja nur eine Variable ist) noch gar nicht kennt und dementsprechend mit dem<BR>
    <B>SelectNext</B> nichts anfangen kann.<BR><BR>
    Ich hoffe, Ihr versteht, was ich will.<BR><BR>
    Habe ich mich da völlig verzettelt oder fehlt mir nur ein kleiner Kick ?<BR>
    Ist sowas überhaupt machbar ?<BR><BR>
    Für Hilfe bin äußerst dankbar.<BR><BR>
    Habe den entspr. Code aus meiner Lib unten eingefügt.<BR><BR><BR>

    <PRE>
    Unit myLib

    <B>Type</B> TKeyProcess = <B>object</B><BR>
    <B>procedure</B> FormKeyDown(aForm: TForm; Sender: TObject; var Key: Word; Shift: TShiftState);<BR>
    <B>end</B>;
    <BR><BR>
    ...
    ...
    ...<BR><BR>
    <B>var</B>
    ke : TKeyProcess;

    <BR>
    //************************************************** *****************************************
    <BR>
    procedure TKeyProcess.FormKeyDown(aForm: TForm; Sender: TObject; var Key: Word; Shift: TShiftState);
    var
    bDirection : Boolean;
    nTab : TTabOrder;
    <BR>
    begin
    <BR>
    case key of
    <BR>
    VK_RETURN : bDirection := True;
    VK_UP : bDirection := False;
    VK_DOWN : bDirection := True;
    VK_ESCAPE : aForm.Close;
    <BR>
    end;
    <BR>
    with aForm do
    begin
    <BR>
    if (( key = VK_RETURN ) or ( key = VK_UP ) or ( key = VK_DOWN )) and
    (( aForm.ActiveControl is Tedit ) or ( aForm.ActiveControl is TCheckBox ) or
    ( aForm.ActiveControl is TRadioButton)) then
    begin
    <BR>
    nTab := aForm.ActiveControl.TabOrder;
    SelectNext(aForm.ActiveControl,bDirection,true);

    while not ((aForm.ActiveControl is Tedit) or (aForm.ActiveControl is TCheckBox) or
    (aForm.ActiveControl is TRadioButton)) do

    SelectNext(aForm.ActiveControl,bDirection,true);
    <BR>
    end;
    <BR>
    end;
    <BR>
    end;
    <BR>
    //************************************************** *****************************************
    <BR>
    END.

  • #2
    Hallo Michael,

    das Prinzip der Vererbung auch von Formularen ermöglicht dies auf relativ einfache Weise:

    1) Erzeuge ein einfaches Formular als Muster:<BR>
    type TFormStandard = class(TForm)<BR>
    Lege Eigenschaften so fest, wie sie in möglichst vielen anderen Formularen sinnvoll sind (z.B. Breite, Höhe, Position).

    2) In diesem Formular werden die Ereignisse OnKeyDown usw. geregelt, wie von Dir vorgesehen.

    3) Auch andere Komponenten, die immer oder zumindest häufig benutzt werden (z.B. TStatusPanel) können hier bereits
    festgelegt werden (mit oder ohne Ereignisse), ebenso Prozeduren, die häufiger benutzt werden.<BR>
    Hinweis: Allgemein gültige Prozeduren werden von Delphi durch <Shift-Ctrl-C> automatisch in den private-Abschnitt gelegt; diese müssen
    manuell in den public-Abschnitt verschoben werden.

    4) Dieses Standardformular wird in die Objektablage eingetragen.

    5) Jedes andere Formular wird von diesem Formular abgeleitet:<BR>
    type TForm1 = class(TFormStandard)<BR>

    6) Die Ereignisse OnKeyDown werden wahrscheinlich nicht automatisch im vererbten Formular aktiviert, sondern müssen manuell
    hinzugefügt werden (Doppelclick im Objektinspektor). Damit der Compiler sie nicht automatisch wieder entfernt, ist es sicherer,
    sie mit dummy-Code zu ergänzen:<BR>
    procedure TForm1.FormKeyDown(Sender); inherited; ; end;<BR>
    Der 'Befehl' ohne Arbeit sagt dem Editor, dass diese Prozedur wirklich vorgesehen wird.

    7) Auch andere Ereignisse können auf diese Weise übertragen werden. Komponenten aus TFormStandard können mit Visible := False
    abgeschaltet oder mit anderen Eigenschaften oder Ereignisen verbunden werden.

    8) Prozeduren aus TFormStandard können übernommen, überschrieben oder ergänzt werden:<BR>
    procedure TForm1.Testprozedur( const iVariante1: integer; begin inherited Originalprozedur(iVariante1); { Weitere Maßnahmen } end;

    Warnung: Es ist leider nicht so einfach, bestehende Formulare als class(TForm) zu ändern in class(TFormStandard): In der PAS-Datei
    müssen die uses-Klausel und die type-Deklaration geändert werden; in der DFM-Datei muss in der ersten Zeile die object-Deklaration in
    'inherited' geändert werden. Beides zusammen geht in der IDE kaum; es ist deshalb einfacher, diese Anpassungen für alle Dateien
    durch Notepad vorzunehmen.

    Ich hoffe, dass dies genügend Tipps und Anleitung liefert. Viel Erfolg!

    Jürgen Thomas<BR>
    [email protected]
    &#10

    Comment


    • #3
      Hallo, Jürgen.

      Vielen Dank erst mal für die schnelle Antwort.

      Diesen Weg hatte ich auch schon versucht, bin aber an den Punkten hängengeblieben, vor denen Du warnst. (Außerdem dachte ich, daß es in Delphi vielleicht auch weniger aufwendig geht). Werde jetzt natürlich die Sache noch einmal so angehen, wie Du es vorschlägst und dann noch mal Bericht erstatten, was aber eine Weile dauern kann, weil ich das "nebenbei" machen muß. <BR><BR>Und herzlichen Dank noch einmal :-

      Comment

      Working...
      X