aflookup.pas
来自「delphi编程控件」· PAS 代码 · 共 1,439 行 · 第 1/3 页
PAS
1,439 行
if Value < 1 then Value := 1;
if Value > 100 then Value := 100;
Height := Value * GetTextHeight + GetBorderSize;
end;
procedure TAutoCustomLookupList.StopTimer;
begin
if FTimerActive then
begin
KillTimer(Handle, 1);
FTimerActive := False;
end;
end;
procedure TAutoCustomLookupList.StopTracking;
begin
if FTracking then
begin
StopTimer;
FTracking := False;
MouseCapture := False;
end;
end;
procedure TAutoCustomLookupList.TimerScroll;
var
Delta, Distance, Interval: Integer;
begin
Delta := 0;
Distance := 0;
if FMousePos < 0 then
begin
Delta := -1;
Distance := -FMousePos;
end;
if FMousePos >= ClientHeight then
begin
Delta := 1;
Distance := FMousePos - ClientHeight + 1;
end;
if Delta = 0 then StopTimer else
begin
if FListLink.DataSet.MoveBy(Delta) <> 0 then SelectCurrent;
Interval := 200 - Distance * 15;
if Interval < 0 then Interval := 0;
SetTimer(Handle, 1, Interval, nil);
FTimerActive := True;
end;
end;
procedure TAutoCustomLookupList.UpdateScrollBar;
var
Pos, Max: Integer;
ScrollInfo: TScrollInfo;
begin
Pos := 0;
Max := 0;
if(FListLink.DataSet = nil) then exit;
if FRecordCount = FRealRowCount then
begin
Max := 4;
if not FListLink.DataSet.BOF then
if not FListLink.DataSet.EOF then Pos := 2 else Pos := 4;
end;
ScrollInfo.cbSize := SizeOf(TScrollInfo);
ScrollInfo.fMask := SIF_POS or SIF_RANGE;
if not GetScrollInfo(Handle, SB_VERT, ScrollInfo) or
(ScrollInfo.nPos <> Pos) or (ScrollInfo.nMax <> Max) then
begin
ScrollInfo.nMin := 0;
ScrollInfo.nMax := Max;
ScrollInfo.nPos := Pos;
SetScrollInfo(Handle, SB_VERT, ScrollInfo, True);
end;
end;
procedure TAutoCustomLookupList.CMCtl3DChanged(var Message: TMessage);
begin
if NewStyleControls and (FBorderStyle = bsSingle) then
begin
RecreateWnd;
RowCount := RowCount;
end;
inherited;
end;
procedure TAutoCustomLookupList.CMFontChanged(var Message: TMessage);
begin
inherited;
Height := Height;
end;
procedure TAutoCustomLookupList.WMCancelMode(var Message: TMessage);
begin
StopTracking;
inherited;
end;
procedure TAutoCustomLookupList.WMTimer(var Message: TMessage);
begin
TimerScroll;
end;
procedure TAutoCustomLookupList.WMVScroll(var Message: TWMVScroll);
begin
FSearchText := '';
with Message, FListLink.DataSet do
case ScrollCode of
SB_LINEUP: MoveBy(-FRecordIndex - 1);
SB_LINEDOWN: MoveBy(FRecordCount - FRecordIndex);
SB_PAGEUP: MoveBy(-FRecordIndex - FRecordCount + 1);
SB_PAGEDOWN: MoveBy(FRecordCount - FRecordIndex + FRecordCount - 2);
SB_THUMBPOSITION:
begin
case Pos of
0: First;
1: MoveBy(-FRecordIndex - FRecordCount + 1);
2: Exit;
3: MoveBy(FRecordCount - FRecordIndex + FRecordCount - 2);
4: Last;
end;
end;
SB_BOTTOM: Last;
SB_TOP: First;
end;
end;
{ TAutoPopupDataList }
constructor TAutoPopupDataList.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csNoDesignVisible, csReplicatable];
FPopup := True;
end;
procedure TAutoPopupDataList.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
Style := WS_POPUP or WS_BORDER;
ExStyle := WS_EX_TOOLWINDOW;
WindowClass.Style := CS_SAVEBITS;
end;
end;
procedure TAutoPopupDataList.WMMouseActivate(var Message: TMessage);
begin
Message.Result := MA_NOACTIVATE;
end;
{ TAutoCustomLookupCombo }
constructor TAutoCustomLookupCombo.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csReplicatable];
Width := 145;
Height := 0;
FDataList := TAutoPopupDataList.Create(Self);
FDataList.Visible := False;
FDataList.Parent := Self;
FDataList.OnMouseUp := ListMouseUp;
FButtonWidth := GetSystemMetrics(SM_CXVSCROLL);
FDropDownRows := 7;
end;
procedure TAutoCustomLookupCombo.CloseUp(Accept: Boolean);
var
ListValue: Variant;
begin
if FListVisible then
begin
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
ListValue := FDataList.KeyValue;
SetWindowPos(FDataList.Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW);
FListVisible := False;
FDataList.ListSource := nil;
Invalidate;
FSearchText := '';
if Accept then SelectKeyValue(ListValue);
if Assigned(FOnCloseUp) then FOnCloseUp(Self);
end;
end;
procedure TAutoCustomLookupCombo.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
if NewStyleControls and Ctl3D then
ExStyle := ExStyle or WS_EX_CLIENTEDGE
else
Style := Style or WS_BORDER;
end;
procedure TAutoCustomLookupCombo.DropDown;
var
P: TPoint;
I, Y: Integer;
S: string;
begin
if not FListVisible and FListActive then
begin
if Assigned(FOnDropDown) then FOnDropDown(Self);
FDataList.Color := Color;
FDataList.Font := Font;
if FDropDownWidth > 0 then
FDataList.Width := FDropDownWidth else
FDataList.Width := Width;
FDataList.RowCount := FDropDownRows;
FDataList.KeyField := FKeyFieldName;
FDataList.Items.Assign(Items);
FDataList.ItemsColor := ItemsColor;
for I := 0 to FListFields.Count - 1 do
S := S + TField(FListFields[I]).FieldName + ';';
FDataList.ListField := S;
FDataList.ListFieldIndex := FListFields.IndexOf(FListField);
FDataList.ListSource := FListLink.DataSource;
FDataList.KeyValue := KeyValue;
if(IsValueItems > -1) then
FDataList.ListLinkDataChanged;
P := Parent.ClientToScreen(Point(Left, Top));
Y := P.Y + Height;
if Y + FDataList.Height > Screen.Height then Y := P.Y - FDataList.Height;
case FDropDownAlign of
daRight: Dec(P.X, FDataList.Width - Width);
daCenter: Dec(P.X, (FDataList.Width - Width) div 2);
end;
SetWindowPos(FDataList.Handle, HWND_TOP, P.X, Y, 0, 0,
SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
FListVisible := True;
Repaint;
end;
end;
procedure TAutoCustomLookupCombo.KeyDown(var Key: Word; Shift: TShiftState);
var
Delta: Integer;
begin
inherited KeyDown(Key, Shift);
if FListActive and ((Key = VK_UP) or (Key = VK_DOWN)) then
if ssAlt in Shift then
begin
if FListVisible then CloseUp(True) else DropDown;
Key := 0;
end else
if not FListVisible then
begin
if not LocateKey then begin
if(FItems.Count > 0) then
IsValueItems := 0;
FListLink.DataSet.First;
end
else begin
if Key = VK_UP then Delta := -1 else Delta := 1;
if(IsValueItems > -1) then begin
if(Delta = -1) then begin
if(IsValueItems > 0) then
Dec(IsValueItems);
end
else begin
if (IsValueItems < FItems.Count - 1) then
Inc(IsValueItems)
else begin
IsValueItems := -1;
FListLink.DataSet.First;
end;
end;
end
else begin
FListLink.DataSet.MoveBy(Delta);
if(FListLink.DataSet.BOF) And (FItems.Count > 0) then begin
IsValueItems := FItems.Count - 1;
KeyValue := getItemsValue(IsValueItems);
end;
end;
end;
if(IsValueItems = -1) then
SelectKeyValue(FKeyField.Value)
else SelectKeyValue( getItemsValue(IsValueItems));
Key := 0;
end;
if (Key <> 0) and FListVisible then FDataList.KeyDown(Key, Shift);
end;
procedure TAutoCustomLookupCombo.KeyPress(var Key: Char);
begin
inherited KeyPress(Key);
if FListVisible then
if Key in [#13, #27] then
CloseUp(Key = #13)
else
FDataList.KeyPress(Key)
else
ProcessSearchKey(Key);
end;
procedure TAutoCustomLookupCombo.KeyValueChanged;
begin
if FListActive and LocateKey then
begin
if(IsValueItems > -1) then
FText := GetItemsLabel(IsValueItems)
else FText := FListField.DisplayText;
FAlignment := FListField.Alignment;
end else
begin
FText := '';
FAlignment := taLeftJustify;
end;
Invalidate;
end;
procedure TAutoCustomLookupCombo.ListLinkActiveChanged;
begin
inherited;
KeyValueChanged;
end;
procedure TAutoCustomLookupCombo.ListMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
CloseUp(PtInRect(FDataList.ClientRect, Point(X, Y)));
end;
procedure TAutoCustomLookupCombo.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
if Button = mbLeft then
begin
SetFocus;
if not FFocused then Exit;
if FListVisible then CloseUp(False) else
if FListActive then
begin
MouseCapture := True;
FTracking := True;
TrackButton(X, Y);
DropDown;
end;
end;
inherited MouseDown(Button, Shift, X, Y);
end;
procedure TAutoCustomLookupCombo.MouseMove(Shift: TShiftState; X, Y: Integer);
var
ListPos: TPoint;
MousePos: TSmallPoint;
begin
if FTracking then
begin
TrackButton(X, Y);
if FListVisible then
begin
ListPos := FDataList.ScreenToClient(ClientToScreen(Point(X, Y)));
if PtInRect(FDataList.ClientRect, ListPos) then
begin
StopTracking;
MousePos := PointToSmallPoint(ListPos);
SendMessage(FDataList.Handle, WM_LBUTTONDOWN, 0, Integer(MousePos));
Exit;
end;
end;
end;
inherited MouseMove(Shift, X, Y);
end;
procedure TAutoCustomLookupCombo.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
StopTracking;
inherited MouseUp(Button, Shift, X, Y);
end;
procedure TAutoCustomLookupCombo.Paint;
var
W, X, Flags: Integer;
Text: string;
Alignment: TAlignment;
Selected: Boolean;
R: TRect;
begin
Canvas.Font := Font;
Canvas.Brush.Color := Color;
Selected := FFocused and not FListVisible and
not (csPaintCopy in ControlState);
if Selected then
begin
Canvas.Font.Color := clHighlightText;
Canvas.Brush.Color := clHighlight;
end;
Text := FText;
Alignment := FAlignment;
W := ClientWidth - FButtonWidth;
X := 2;
case Alignment of
taRightJustify: X := W - Canvas.TextWidth(Text) - 3;
taCenter: X := (W - Canvas.TextWidth(Text)) div 2;
end;
SetRect(R, 1, 1, W - 1, ClientHeight - 1);
Canvas.TextRect(R, X, 2, Text);
if Selected then Canvas.DrawFocusRect(R);
SetRect(R, W, 0, ClientWidth, ClientHeight);
if not FListActive then
Flags := DFCS_SCROLLCOMBOBOX or DFCS_INACTIVE
else if FPressed then
Flags := DFCS_SCROLLCOMBOBOX or DFCS_FLAT or DFCS_PUSHED
else
Flags := DFCS_SCROLLCOMBOBOX;
DrawFrameControl(Canvas.Handle, R, DFC_SCROLL, Flags);
end;
procedure TAutoCustomLookupCombo.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
inherited SetBounds(ALeft, ATop, AWidth, GetTextHeight + GetBorderSize + 4);
end;
procedure TAutoCustomLookupCombo.StopTracking;
begin
if FTracking then
begin
TrackButton(-1, -1);
FTracking := False;
MouseCapture := False;
end;
end;
procedure TAutoCustomLookupCombo.TrackButton(X, Y: Integer);
var
NewState: Boolean;
begin
NewState := PtInRect(Rect(ClientWidth - FButtonWidth, 0, ClientWidth,
ClientHeight), Point(X, Y));
if FPressed <> NewState then
begin
FPressed := NewState;
Repaint;
end;
end;
procedure TAutoCustomLookupCombo.CMCancelMode(var Message: TCMCancelMode);
begin
if (Message.Sender <> Self) and (Message.Sender <> FDataList) then
CloseUp(False);
end;
procedure TAutoCustomLookupCombo.CMCtl3DChanged(var Message: TMessage);
begin
if NewStyleControls then
begin
RecreateWnd;
Height := 0;
end;
inherited;
end;
procedure TAutoCustomLookupCombo.CMFontChanged(var Message: TMessage);
begin
inherited;
Height := 0;
end;
procedure TAutoCustomLookupCombo.WMCancelMode(var Message: TMessage);
begin
StopTracking;
inherited;
end;
procedure TAutoCustomLookupCombo.WMKillFocus(var Message: TWMKillFocus);
begin
inherited;
CloseUp(False);
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?