Autor Beitrag
uruz
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.11.04 10:17 
Aloha he, verehrte Freunde...

heute habe ich ein gaenzlich anderes Problem:

Ich habe ein (oder mehrere) TDBEdit- Feld(er), in dem ich ausschließlich Fließkommazahlen von einer festen Länge drin haben mag. Mit einer maximalen Ziffernzahl von 3... wobei der Nachkommastellenanteil bei exakt 1 liegt....

auf gut deutsch... ich mag nur Zahlen von 0.1 bis 99.9 eingeben können.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
{
********************************************************************************
*                                                                              *
*    Name     :    DataFieldExit                                               *
*                                                                              *
*    Aufgabe  :    Beim Verlassen eines der Eingabefelder werden vorgenommene  *
*                  Aenderungen an die Datenbank uebermittelt                   *
*                                                                              *
*    Parameter:    Sender            -> Das Steuerelement, dass die OnExit-    *
*                                       Nachricht sendet                       *
*                                                                              *
********************************************************************************
}

procedure TNakataForm.DataFieldExit(Sender: TObject);
begin

  if Sender is TDBEdit then begin
    with TDBEdit(Sender) do begin

      if TTable(DataSource.DataSet) = TempTable then begin
        with TTable(DataSource.DataSet) do begin
                                                 { Wurde der Wert verändert ?  }
          if Modified then begin
                                                 { Durchmesser auf 0 pruefen   }

            if  (Text = '')
             or (Text = '0'then begin
              Edit;
              FieldByName(DataField).Clear;
            end else begin
                                                 { Eingabe auf zu grosse bzw.  }
                                                 { zu kleine Werte pruefen     }
              if   (RoundEx(FieldByName(DataField).AsFloat, 1) > 99.9)
               or  (RoundEx(FieldByName(DataField).AsFloat, 1) <  0.1)
               and (not FieldByName(DataField).IsNull) then begin
                MessageDlg(
                           'Der eingegebene Wert liegt ausserhalb der'
                         + #13#10 + 'gültigen Abmessungen. [0.1 - 99.9 mm]',
                           mtError, [mbOK], -1
                          );

                Refresh;
                ActiveControl := TDBEdit(Sender);
                exit;
              end;
            end;
          end;
        end;
      end;
    end;
  end;

  with TTable(DataSource.DataSet) do begin
    if State in [dsEdit, dsInsert] then
      Post;
  end;
end;


Das ganze hab ich soweit auch hinbekommen... ABER... da ich Feheleingaben vermeiden mag, ist das nicht der einzige Schritt:

Ein Einfügen via "Strg+V" fügt auch Buchstaben und beliebige Texte ein... genauso wird keine Rücksicht mehr auf die von mir maximal vorgegebene Länge genommen... aber auch das habe ich hinbekommen... die Tastenkombination "Strg-V" liefert in dem Event-Handler OnKeyPress einen Wert von #22 ... und somit kann ich das Ereignis abfangen und hier beschränken, wie viele Zeichen maximal eingefügt werden können... und das Texte herausgefiltert werden...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
{
********************************************************************************
*                                                                              *
*    Name     :    DataFieldKeyPress                                           *
*                                                                              *
*    Aufgabe  :    Beim Betätigen einer Taste wird überprüft, ob das beabsich- *
*                  tigte Zeichen im Eingabefeld verwendet werden kann. Ebenso  *
*                  wird ein Einfügen über "Strg + V" bei Bedarf unterbunden.   *
*                                                                              *
*    Parameter:    Sender            -> Das Steuerelement, dass die OnKeyPress *
*                                       Nachricht sendet                       *
*                  Key               -> Zeichen bzw. Botschaft, die verschickt *
*                                       worden ist                             *
*                                                                              *
********************************************************************************
}

procedure TNakataForm.DataFieldKeyPress(Sender: TObject; var Key: Char);
var
  t   : double;
  i   : integer;
  s   : string;
begin
                                                 { Zahlen dürfen prinzipiell   }
                                                 { eingefügt werden...         }
  if   (Key in [#48..#57])
                                                 { wenn kein Teilbereich des   }
                                                 { Eingabetextes markiert ist  }
   and (TDBEdit(Sender).SelLength = 0then begin
                                                 { Wenn die Maximallänge schon }
                                                 { belegt ist...               }
    if  (
             (Pos(',', TDBEdit(Sender).Text) > 0)
         and (Pos(',', TDBEdit(Sender).Text) < Length(TDBEdit(Sender).Text))
        )
     or (
             (Pos(',', TDBEdit(Sender).Text) = 0)
         and (Length(TDBEdit(Sender).Text) >= 2)
        ) then
                                                 { Wird das eingegebene Zeichen}
                                                 { ignoriert                   }
      Key := #0;
  end else
                                                 { Es soll etwas mit "Strg+V"  }
                                                 { eingefügt werden            }
  if (Key = Chr(22)) then begin
                                                 { Prüfen, ob es sich um eine  }
                                                 { Zahl handelt                }
    Val(StringReplace(Clipboard.AsText, ',''.', []), t, i);

    if i <> 0 then
                                                 { Keine Zahl ? Ignorieren !!! }
      Key := #0
    else begin
                                                 { Stelle suchen, an der einge-}
                                                 { fügt werden soll bzw. was   }
                                                 { überschrieben werden soll   }
      s   := StringReplace(Clipboard.AsText, '.'',', []);

      if TDBEdit(Sender).SelLength <> Length(TDBEdit(Sender).Text) then begin

        with TDBEdit(Sender) do begin
          s := copy(Text, 0, SelStart) + Clipboard.AsText
             + copy(Text, SelStart + SelLength + 1,
                    Length(Text) - (SelStart + SelLength));
        end;
      end;

      Val(StringReplace(s, ',''.', []), t, i);
                                                 { Prüfen, ob diese Zahl im    }
                                                 { Gültigkeitsbereich liegt    }
      if (RoundEx(t, 1) > 99.9or (RoundEx(t, 1) <  0.1then begin
                                                 { Fehler ? Dann Meldung und   }
                                                 { Änderung zurücksetzen       }
        TDBEdit(Sender).Text := s;
        MessageDlg(
                   'Der eingegebene Wert liegt ausserhalb der'
                 + #13#10 + 'gültigen Abmessungen. [0.1 - 99.9 mm]',
                   mtError, [mbOK], -1
                  );

        TTable(TDBEdit(Sender).DataSource.DataSet).Refresh;
      end else begin
                                                 { Wert in das Editfeld setzen }
        TDBEdit(Sender).Text := FloatToStr(RoundEx(t, 1));
                                                 { ... und in die Datenbank    }
        with TTable(TDBEdit(Sender).DataSource.DataSet) do begin
          if not (State in [dsEdit, dsInsert]) then
            Edit;

          FieldByName(TDBEdit(Sender).DataField).AsFloat := t;
          Post;
        end;
      end;
                                                 { Danach den Tastencode       }
                                                 { ignorieren                  }
      Key := #0;
    end;
  end;
end;



so... nun hab ich das problem gelöst... aaaber: etwas funktioniert immer noch: rechtsklick auf das eingabefeld... und dann Einfügen... da ich nicht die gesamte Funktionalität des Edit- Menüs neu schreiben mag... würde ich es gerne behalten...
gibt es irgendeine Windows Message, die unmittelbar vor dem Einfügen ausgesendet wird ? Meine Ideee ist einfach, dass ich nicht den Wert, der in der Zwischenablage liegt verändere... und dass ich ihn nur dann einfüge, wenn es möglich ist...

hat jemand vielleicht noch eine alternative parat ? oder sonst eine idee ?

vielen Dank

uruz


p.s.: die Funktion RoundEx rundet einen Fließkommawert auf die im zweiten Parameter übergebene Nachkommastelle
yogo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: Do 02.12.04 21:17 
Titel: Lösung
Mir fällt jetzt auf die schnelle nichts ein was man mal gerade so programmieren kann. Aber such doch mal im Forum Clipboard.
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mi 05.07.06 09:00 
Hmm... hat hier jemand eine Lösung inzwischen für gefunden?

Habe den Quelltext von oben mal "übernommen"... aber das Problem besteht weiterhin:

Wie kann ich VOR dem Einfügen per Kontextmenü überprüfen, was im Clipboard steht? Wenn ich kein eigenes Kontextmenü schreiben will, sondern das "Original-"Editmenü nutze, hab ich ja kein Ereignis, was da raus geschmissen wird... *kopfkratz*