Zitat von
barnti:
Hi,
ich muss wohl chinesisch reden
Ich KENNE die Funktion der TDBLookupCombobox. Ich NUTZE diese bereits!!
Was nicht funktioniert:
Auswahl eines Wertes aus der Box PER Tastatur. Das geht nur mit STRINGS. Ich habe aber bei dem Beispiel INTEGER.
Mehr weiß ich dazu jetzt echt nicht zu sagen...
OH MANN!!!
Ich hab wohl komplett chinesisch verstanden...
Ok, nachdem ich das mal ausprobiert hab, das ListField als IntegerField zu deklarieren, ist mir auch klar, was dein Problem ist!
In der Tat eine komische Sache, aber irgendwie funzt das bei IntegerFeldern nicht mit der Tastatureingabe...
Ich hab mich mal geguckt, warum das so ist. Tja, in der Komponente wird gesagt, dass das mit der Tastatureingabe nur funktioniert, wenn das Feld vom Typ String o.Ä. ist, aber
nicht bei Integer.
Nu gut, versuchen wir doch mal die Klasse etwas zu "modifizieren".
Einfach in die
Unit, wo du die TDBLookupComboBox hast folgende Zeile als erstes unter type:
Delphi-Quellcode:
TDBLookupComboBox = class(DBCtrls.TDBLookupComboBox)
procedure ProcessSearchKey(Key: Char); override;
end;
Die Funktion definieren wir wie folgt (mit kleinen Änderungen aus TDBLookupControl übernommen):
Delphi-Quellcode:
uses
DB;
var
SearchTickCount: Integer = 0;
procedure TDBLookupComboBox.ProcessSearchKey(Key: Char);
var
TickCount: Integer;
S:
string;
CharMsg: TMsg;
FListField: TField;
FKeyField: TField;
begin
FListField := ListSource.DataSet.FindField(ListField);
if (FListField <>
nil)
and (FListField.FieldKind
in [fkData, fkInternalCalc])
and
(FListField.DataType
in [ftString, ftInteger, ftWideString])
then // <<--- hier hab ich ftInteger hinzugefügt
case Key
of
#8, #27: SearchText := '
';
#32..#255:
if CanModify
then
begin
TickCount := GetTickCount;
if TickCount - SearchTickCount > 2000
then SearchText := '
';
SearchTickCount := TickCount;
if SysLocale.FarEast
and (Key
in LeadBytes)
then
if PeekMessage(CharMsg,
Handle, WM_CHAR, WM_CHAR, PM_REMOVE)
then
begin
if CharMsg.
Message = WM_Quit
then
begin
PostQuitMessage(CharMsg.wparam);
Exit;
end;
SearchText := SearchText + Key;
Key := Char(CharMsg.wParam);
end;
if Length(SearchText) < 32
then
begin
S := SearchText + Key;
try
if ListLink.DataSet.Locate(FListField.FieldName, S,
[loCaseInsensitive, loPartialKey])
then
begin
FKeyField := ListSource.DataSet.FindField(KeyField);
SelectKeyValue(FKeyField.Value);
SearchText := S;
end;
except
SearchText := S;
end;
end;
end;
end;
end;
Somit hast du - ok, auf etwas fiesem Weg - die Klasse überschrieben, ohne eine neue zu erstellen. Sie gilt allerdings nur innerhalb dieser
Unit! Jetzt funktioniert die ganze Sache auch mit der Tastatureingabe.