📄 jvqautocomplete.pas
字号:
begin
Result := EditCtrl.Text;
end;
procedure TJvBaseEditListAutoComplete.SetText(const Value: TCaption);
begin
EditCtrl.Text := Value;
end;
procedure TJvBaseEditListAutoComplete.GetEditSel(out StartPos, EndPos: Integer);
var
MarkedText: WideString;
begin
StartPos := EditCtrl.SelStart;
MarkedText := EditCtrl.SelText;
if Copy(EditCtrl.Text, StartPos + 1, Length(MarkedText)) = MarkedText then
EndPos := StartPos + EditCtrl.SelLength
else
begin
EndPos := StartPos;
StartPos := StartPos - EditCtrl.SelLength;
end;
end;
procedure TJvBaseEditListAutoComplete.SetEditSel(StartPos, EndPos: Integer);
begin
EditCtrl.SelStart := StartPos;
EditCtrl.SelLength := EndPos - StartPos;
end;
function TJvBaseEditListAutoComplete.FindItemPrefix(IndexStart: Integer; const Prefix: string): Integer;
begin
if List <> nil then
begin
for Result := IndexStart + 1 to List.Count - 1 do
if StringStartsWith(List[Result], Prefix) then
Exit;
for Result := 0 to IndexStart do
if StringStartsWith(List[Result], Prefix) then
Exit;
end;
Result := -1;
end;
function TJvBaseEditListAutoComplete.GetItemAt(Index: Integer): string;
begin
Result := List[Index];
end;
function TJvBaseEditListAutoComplete.GetActive: Boolean;
begin
Result := inherited GetActive and (EditCtrl <> nil) and (List <> nil) and
not TCustomEditAccess(EditCtrl).ReadOnly;
end;
//=== { TJvEditListAutoComplete } ============================================
constructor TJvEditListAutoComplete.Create(AEditCtrl: TCustomEdit;
AList: TStrings);
begin
inherited Create(AEditCtrl, AList);
FItemIndex := -1;
end;
procedure TJvEditListAutoComplete.SetInternalItemIndex(Value: Integer);
begin
if (Value < 0) or (List = nil) then
Value := -1;
FItemIndex := Value;
if (List <> nil) and (FItemIndex >= List.Count) then
FItemIndex := List.Count - 1;
end;
function TJvEditListAutoComplete.GetList: TStrings;
begin
Result := FList;
end;
procedure TJvEditListAutoComplete.SetList(Value: TStrings);
begin
FItemIndex := -1;
FList := Value;
end;
procedure TJvEditListAutoComplete.SetItemIndex(Index: Integer);
begin
FItemIndex := Index;
if Assigned(FOnItemIndexChange) then
FOnItemIndexChange(Self);
end;
function TJvEditListAutoComplete.GetItemIndex: Integer;
begin
if Assigned(FOnValidateItemIndex) then
FOnValidateItemIndex(Self);
Result := FItemIndex;
end;
//=== { TJvEditListBoxAutoComplete } =========================================
constructor TJvEditListBoxAutoComplete.Create(AEditCtrl: TCustomEdit; AListBox: TCustomListBox);
begin
if AListBox = nil then
inherited Create(AEditCtrl, nil)
else
inherited Create(AEditCtrl, AListBox.Items);
ListBox := AListBox;
end;
destructor TJvEditListBoxAutoComplete.Destroy;
begin
ListBox := nil;
inherited Destroy;
end;
procedure TJvEditListBoxAutoComplete.Notification(AComponent: TComponent; Operation: TOperation);
begin
if (Operation = opRemove) and (AComponent = FListBox) then
begin
FListBox := nil;
List := nil;
end;
inherited Notification(AComponent, Operation);
end;
procedure TJvEditListBoxAutoComplete.SetListBox(Value: TCustomListBox);
begin
if Assigned(FListBox) then
FListBox.RemoveFreeNotification(Self);
FListBox := Value;
if Assigned(FListBox) then
FListBox.FreeNotification(Self);
if FListBox <> nil then
List := FListBox.Items
else
List := nil;
end;
procedure TJvEditListBoxAutoComplete.SetItemIndex(Index: Integer);
begin
ListBox.ItemIndex := Index;
end;
function TJvEditListBoxAutoComplete.GetItemIndex: Integer;
begin
Result := ListBox.ItemIndex;
end;
//=== { TJvComboBoxAutoComplete } ============================================
constructor TJvComboBoxAutoComplete.Create(AComboBox: TCustomComboBox);
begin
inherited Create;
FComboBox := AComboBox;
end;
type
TCustomComboBoxAccess = class(TCustomComboBox);
function TJvComboBoxAutoComplete.GetActive: Boolean;
begin
Result := inherited GetActive and (ComboBox <> nil);
if ComboBox <> nil then
FListSearch := not (TCustomComboBoxAccess(ComboBox).Style in [csDropDown ]);
end;
procedure TJvComboBoxAutoComplete.GetEditSel(out StartPos, EndPos: Integer);
var
MarkedText: WideString;
begin
StartPos := ComboBox.SelStart;
MarkedText := ComboBox.SelText;
if Copy(GetText, StartPos + 1, Length(MarkedText)) = MarkedText then
EndPos := StartPos + ComboBox.SelLength
else
begin
EndPos := StartPos;
StartPos := StartPos - ComboBox.SelLength;
end;
end;
procedure TJvComboBoxAutoComplete.SetEditSel(StartPos, EndPos: Integer);
begin
ComboBox.SelStart := StartPos;
ComboBox.SelLength := EndPos - StartPos;
end;
function TJvComboBoxAutoComplete.FindItemPrefix(IndexStart: Integer;
const Prefix: string): Integer;
begin
for Result := IndexStart + 1 to ComboBox.Items.Count - 1 do
if StringStartsWith(ComboBox.Items[Result], Prefix) then
Exit;
for Result := 0 to IndexStart do
if StringStartsWith(ComboBox.Items[Result], Prefix) then
Exit;
Result := -1;
end;
procedure TJvComboBoxAutoComplete.SetItemIndex(Index: Integer);
begin
ComboBox.ItemIndex := Index;
end;
function TJvComboBoxAutoComplete.GetItemIndex: Integer;
begin
Result := ComboBox.ItemIndex;
end;
function TJvComboBoxAutoComplete.GetItemAt(Index: Integer): string;
begin
Result := ComboBox.Items[Index];
end;
function TJvComboBoxAutoComplete.GetText: TCaption;
begin
Result := TCustomComboBoxAccess(ComboBox).Text;
end;
procedure TJvComboBoxAutoComplete.SetText(const Value: TCaption);
begin
TCustomComboBoxAccess(ComboBox).Text := Value;
end;
procedure TJvComboBoxAutoComplete.SetComboBox(Value: TCustomComboBox);
begin
FComboBox := Value;
if FComboBox <> nil then
SetFilter(TCustomComboBoxAccess(FComboBox).Text)
else
SetFilter('');
end;
//=== { TJvLookupAutoComplete } ==============================================
constructor TJvLookupAutoComplete.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FAutoComplete := TJvEditListAutoComplete.Create(nil, nil);
FAutoComplete.OnDropDown := EvDropDown;
FAutoComplete.OnValidateItems := EvValidateStrings;
FAutoComplete.OnChange := EvChange;
FAutoComplete.OnValueChange := EvValueChange;
FAutoComplete.OnItemIndexChange := EvItemIndexChange;
FAutoComplete.OnValidateItemIndex := EvValidateItemIndex;
FStrings := TStringList.Create;
end;
destructor TJvLookupAutoComplete.Destroy;
begin
SetEdit(nil); // SetEdit accesses FAutoComplete
FAutoComplete.Free;
SetListBox(nil);
FStrings.Free;
inherited Destroy;
end;
procedure TJvLookupAutoComplete.EvChange(Sender: TObject);
begin
if Assigned(FOnChange) then
FOnChange(Self);
end;
procedure TJvLookupAutoComplete.EvDropDown(Sender: TObject);
begin
if Assigned(FOnDropDown) then
FOnDropDown(Self);
end;
procedure TJvLookupAutoComplete.EvItemIndexChange(Sender: TObject);
begin
ItemIndex := FAutoComplete.ItemIndex;
end;
procedure TJvLookupAutoComplete.EvKeyPress(Sender: TObject; var Key: Char);
begin
if Assigned(FOrgKeyPress) then
FOrgKeyPress(Sender, Key);
FAutoComplete.AutoComplete(Key);
end;
procedure TJvLookupAutoComplete.EvValidateItemIndex(Sender: TObject);
begin
FAutoComplete.ItemIndex := ItemIndex;
end;
procedure TJvLookupAutoComplete.EvValidateStrings(Sender: TObject);
begin
if Assigned(FOnValidateStrings) then
FOnValidateStrings(Self);
end;
procedure TJvLookupAutoComplete.EvValueChange(Sender: TObject);
begin
if Assigned(FOnValueChange) then
FOnValueChange(Self);
end;
function TJvLookupAutoComplete.GetActive: Boolean;
begin
Result := FAutoComplete.Active;
end;
function TJvLookupAutoComplete.GetEdit: TCustomEdit;
begin
Result := FAutoComplete.EditCtrl;
end;
function TJvLookupAutoComplete.GetItemIndex: Integer;
begin
Result := -1;
case Kind of
akListBox:
if ListBox <> nil then
Result := ListBox.ItemIndex;
akStrings:
Result := FAutoComplete.ItemIndex;
end;
end;
function TJvLookupAutoComplete.GetListSearch: Boolean;
begin
Result := FAutoComplete.ListSearch;
end;
procedure TJvLookupAutoComplete.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if Operation = opRemove then
begin
if AComponent = Edit then
Edit := nil
else
if AComponent = ListBox then
ListBox := nil;
end;
end;
procedure TJvLookupAutoComplete.SetActive(const Value: Boolean);
begin
FAutoComplete.Active := Value;
end;
procedure TJvLookupAutoComplete.SetEdit(Value: TCustomEdit);
begin
if Value <> Edit then
begin
if Edit <> nil then
begin
TCustomEditAccess(Edit).OnKeyPress := FOrgKeyPress;
Edit.RemoveFreeNotification(Self);
end;
FAutoComplete.EditCtrl := Value;
if Edit <> nil then
begin
Edit.FreeNotification(Self);
FOrgKeyPress := TCustomEditAccess(Edit).OnKeyPress;
TCustomEditAccess(Edit).OnKeyPress := EvKeyPress;
end;
end;
end;
procedure TJvLookupAutoComplete.SetItemIndex(Value: Integer);
begin
case Kind of
akListBox:
if ListBox <> nil then
ListBox.ItemIndex := Value;
akStrings:
FAutoComplete.ItemIndex := Value;
end;
end;
procedure TJvLookupAutoComplete.SetKind(Value: TJvLookupAutoCompleteKind);
begin
FKind := Value;
case FKind of
akListBox:
if ListBox <> nil then
FAutoComplete.List := ListBox.Items
else
FAutoComplete.List := nil;
akStrings:
FAutoComplete.List := FStrings;
end;
end;
procedure TJvLookupAutoComplete.SetListBox(Value: TCustomListBox);
begin
if Value <> FListBox then
begin
if FListBox <> nil then
FListBox.RemoveFreeNotification(Self);
FListBox := Value;
if FListBox <> nil then
FListBox.FreeNotification(Self);
if Kind = akListBox then
begin
if FListBox <> nil then
FAutoComplete.List := FListBox.Items
else
FAutoComplete.List := nil;
end;
end;
end;
procedure TJvLookupAutoComplete.SetListSearch(Value: Boolean);
begin
FAutoComplete.ListSearch := Value;
end;
procedure TJvLookupAutoComplete.SetStrings(Value: TStrings);
begin
if Value <> FStrings then
begin
FStrings.Assign(Value);
if Kind = akStrings then
FAutoComplete.List := FStrings;
end;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQAutoComplete.pas,v $';
Revision: '$Revision: 1.4 $';
Date: '$Date: 2005/02/06 14:06:00 $';
LogPath: 'JVCL\run'
);
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -