Announcement

Collapse
No announcement yet.

Tastaturcodes DBGrid

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

  • Tastaturcodes DBGrid

    Hallo Forum,

    ich habe schon viele Tipps und Tricks hier gefunden, die meine Probleme bei Delphi gelöst haben. Jetzt habe ich mich im Forum neu angemeldet, weil ich nichts gefunden habe und wirklich keine Lösung mehr weiß.

    Szenario:
    Ich habe eine Anwendung schon einige Jahre laufen. Jetzt hat ein Anwender eine Bitte für eine Erleichterung der Eingaben im DBGrid.
    Ist-Stand:
    Es betrifft nur Zahleneingaben (Double). Beim Drücken von Enter wird zur nächsten Zelle gesprungen. Wenn ich die Taste 'i drücke, wird ein korrospondierendes Booleanfeld auf True bzw. False gesetzt und keine Zahl verändert. Zu jedem Zahlenfeld gibt es ein zugehöriges Booleanfeld. Das habe ich mit OnKeyPress gelöst.

    Jetzt möchte ich, dass als 3. Option bei Eingabe einer Zahl und Abschluss nicht mit Enter sondern mit der Taste 'i', die Zelle geändert wird und das Booleanfeld gesetzt wird.

    Beispiel:
    1. Eingabe: 5,55 Enter - funktioniert schon
    2. Eingabe: i - entsprechende Booleanfeld wird gesetzt, Zahl wird nicht geändert
    3. Eingabe: 5,55i - geht noch nicht - es soll die 5,55 in der Zelle (Feld) gespeichert werden und das entsprechende Booleanfeld geändert werden (true oder false).

    Hat jemand einen Deckanstoß oder vielleicht eine Lösung parat?

    Ich hoffe, Ihr könnt mir helfen.
    Ach ja. Ich verwende Delphi 5 Pro und ADO.

    Vielen Dank schon vorab.

  • #2
    moin,

    wo ist das problem? Da kein Source-Code vorliegt, schlage ich mal folge4ndes vor: Das ist kein Source, sondern "Raw"!

    while Key in ['0'..'9', '.'] do
    SetzeZahl zusammen
    end
    db.datasource.fieldbyname('Zahl').value= Zahl
    if key = 'i' then db.datasource.fieldbyname('myboolean').value= boolval

    gruss
    bernhard

    Comment


    • #3
      die Lösung

      Moin Moin,

      danke Bernhard für den Tipp. Ich habe nun doch eine Lösung gefunden. Manchmal steht man vor dem Tor und sucht den Schlüssel, obwohl er schon steckt.

      Wen es interessiert. Hier ist der Quelltext.
      Es gibt vielleicht eine elegantere Lösung, aber das hier funzt. Ich habe die Feldnamen verändert und die Anzahl der Felder verringert, damit es übersichtlich bleibt.

      Variablen i_gedrueckt, ziffer_gedrueckt, enter_gedrueckt sind global

      Code:
      procedure TFormMeinProjekt.DBGrid1KeyPress(Sender: TObject;
      var Key: Char);
      var
        Feld: TField;
      begin
      //Nur Backspace, Enter, Komma, Minus, i und Zahlen im Eingabefeld zulassen
       if not (Key in [#8,#13,#44,#45,#105,#48..#57]) then Key := #0;
      
      //Wenn Komma, Minus und Zahlen, dann Flag setzen
       if (Key in [#44,#45,#48..#57]) then ziffer_gedrueckt := true;
      
      // nach Drücken der Taste i Feldnamen merken und Enter auslösen 
       if Key in [#105] then
          begin
             i_gedrueckt := true;
             Feld := (Sender as TDBGrid).Selectedfield;
             Key := #13;
          end;
      
        // Nach Enter ins nächste Feld springen
        If (Key = #13) Then Begin
          Feld := (Sender as TDBGrid).Selectedfield;
          enter_gedrueckt := true;
          If HiWord(GetKeyState(VK_SHIFT)) <> 0 then begin
           with (Sender as TDBGrid) do
           if selectedindex > 0 then
            selectedindex := selectedindex - 1
           else begin
            DataSource.DataSet.Prior;
            selectedindex := fieldcount - 1;
           end;
          end else begin
           with (Sender as TDBGrid) do
           if selectedindex < (fieldcount - 1) then
            selectedindex := selectedindex + 1
           else begin
            DataSource.DataSet.Next;
            selectedindex := 0;
           end;
         end;
         Key := #0;
         end;
      
      // wenn Eingabe mit i beendet, dann Zusatzfeld = true
       if ziffer_gedrueckt and i_gedrueckt then 
         begin
          with (Sender as TDBGrid) do
           begin
           if Feld = Plan1 then Plan1Flag.Value := true;
           if Feld = Plan2 then Plan2Flag.Value := true;
           if Feld = Plan3 then Plan3Flag.Value := true;
           end;
          ziffer_gedrueckt := false;
          i_gedrueckt := false;
          enter_gedrueckt := false;
         end
        // wenn nur i gedrückt dann Zusatzfeld umschalten true bzw false
        else if not ziffer_gedrueckt and i_gedrueckt then
         begin
          with (Sender as TDBGrid) do
           begin
           Plandaten.Edit;
           if Feld = Plan1 then Plan1Flag.Value := Not Plan1Flag.Value;
           if Feld = Plan2 then Plan2Flag.Value := Not Plan2Flag.Value;
           if Feld = Plan3 then Plan3Flag.Value := Not Plan3Flag.Value;
           Plandaten.Post;
           end;
          ziffer_gedrueckt := false;
          i_gedrueckt := false;
          enter_gedrueckt := false;
         end
        // wenn Eingabe mit Enter abgeschlossen, dann Zusatzfeld = false
       else if ziffer_gedrueckt and enter_gedrueckt and not i_gedrueckt then
         begin
          with (Sender as TDBGrid) do
           begin
           if Feld = Plan1 then Plan1Flag.Value := False;
           if Feld = Plan2 then Plan2Flag.Value := False;
           if Feld = Plan3 then Plan3Flag.Value := False;
           end;
          ziffer_gedrueckt := false;
          i_gedrueckt := false;
          enter_gedrueckt := false;
         end;
      end;
      Gruß
      Tomas

      Comment

      Working...
      X