📄 wwimagecombo.pas
字号:
Combo.Images.Draw(Canvas, imageRect.left, imageRect.Top + (imageRect.Bottom-imageRect.Top-TImageList(Combo.Images).Height) div 2, imageIndex)
end
else inherited;
end;
{ TCustomComboBoxStrings }
(*
function TwwCustomComboBoxStrings.GetCount: Integer;
begin
Result := SendMessage(ComboBox.Handle, CB_GETCOUNT, 0, 0);
end;
function TwwCustomComboBoxStrings.GetObject(Index: Integer): TObject;
begin
Result := TObject(SendMessage(ComboBox.Handle, CB_GETITEMDATA, Index, 0));
// Do additional checking on Count and Index here is so in the event
// the object being retrieved is the integer -1 the call will succeed
if (Longint(Result) = CB_ERR) and ((Count = 0) or (Index < 0) or (Index > Count)) then
Error(SListIndexError, Index);
end;
procedure TwwCustomComboBoxStrings.PutObject(Index: Integer; AObject: TObject);
begin
SendMessage(ComboBox.Handle, CB_SETITEMDATA, Index, Longint(AObject));
end;
function TwwCustomComboBoxStrings.Get(Index: Integer): string;
var
Len: Integer;
begin
Len := SendMessage(ComboBox.Handle, CB_GETLBTEXTLEN, Index, 0);
// When style = csSimple we need to also check the Len > 0
if (Len <> CB_ERR) and (Len > 0) then
begin
SetLength(Result, Len);
SendMessage(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(PChar(Result)));
end
else
SetLength(Result, 0);
end;
procedure TwwCustomComboBoxStrings.Clear;
var
S: string;
begin
S := ComboBox.Text;
SendMessage(ComboBox.Handle, CB_RESETCONTENT, 0, 0);
ComboBox.Text := S;
ComboBox.Update;
end;
procedure TwwCustomComboBoxStrings.Delete(Index: Integer);
begin
SendMessage(ComboBox.Handle, CB_DELETESTRING, Index, 0);
end;
function TwwCustomComboBoxStrings.IndexOf(const S: string): Integer;
begin
Result := SendMessage(ComboBox.Handle, CB_FINDSTRINGEXACT, -1, LongInt(PChar(S)));
end;
procedure TwwCustomComboBoxStrings.SetUpdateState(Updating: Boolean);
begin
SendMessage(ComboBox.Handle, WM_SETREDRAW, Ord(not Updating), 0);
if not Updating then ComboBox.Refresh;
end;
*)
procedure TwwImageCombo.SetItemsEx(const Value: TwwComboExItems);
begin
FItemsEx.Assign(Value);
RefreshDisplay;
end;
constructor TwwImageCombo.Create;
begin
inherited Create(AOwner);
FItemsEx:= TwwComboExItems.Create(self, TwwComboExItem);
LimitEditRect:= True;
end;
destructor TwwImageCombo.Destroy;
begin
// Items.Free;
FItemsEx.Free;
inherited Destroy;
end;
procedure TwwImageCombo.DataChange(Sender: TObject);
begin
if Patch[1] then exit; // 2/24/99 - Fix for ItemIndex being incorrect at time of OnCloseUp
if DataLink.Field <> nil then
begin
if not (csDesigning in ComponentState) then
begin
if (DataLink.Field.DataType = ftString) and (MaxLength = 0) then
MaxLength := DataLink.Field.Size;
end;
self.Value:= DataLink.Field.AsString;
self.RefreshDisplay;
end else
begin
if csDesigning in ComponentState then
Text := Name else
Text := '';
end;
end;
Function TwwImageCombo.GetComboValue(DisplayText: string): string;
var i: integer;
begin
if not MapList then
begin
result:= DisplayText
end
else begin
for i := 0 to ItemsEx.Count - 1 do
begin
if ItemsEx[i].DisplayedText = DisplayText then
begin
result:= ItemsEx[i].Storedtext;
exit;
end;
end;
result:= '';
end;
end;
Function TwwImageCombo.GetComboDisplay(Value: string): string;
var i: integer;
begin
Result:= '';
if not MapList then
begin
result:= value;
end
else begin
for i := 0 to ItemsEx.Count - 1 do
begin
if ItemsEx[i].StoredText = Value then
begin
result:= ItemsEx[i].Displayedtext;
exit;
end;
end;
end
end;
procedure TwwImageCombo.UpdateData(Sender: TObject);
begin
inherited UpdateData(Sender);
FValue:= Field.AsString;
RefreshDisplay;
end;
function ListItemsCompare(List: TwwComboExItems; Index1, Index2: Integer): Integer;
begin
Result := List.CompareItems(List.Items[Index1], List.Items[Index2]);
end;
constructor TwwComboExItems.Create(AOwner: TPersistent;
ItemClass: TCollectionItemClass);
begin
inherited Create(AOwner, ItemClass);
FCaseSensitive := False;
FSortType := icstNone;
end;
procedure TwwComboExItems.Sort;
begin
CustomSort(ListItemsCompare);
end;
procedure TwwComboExItems.ExchangeItems(Index1, Index2: Integer);
var
Item1, Item2: TwwComboExItem;
I1, I2: Integer;
begin
Item1 := Items[Index1];
Item2 := Items[Index2];
I1 := Items[Index1].Index;
I2 := Items[Index2].Index;
Item1.Index := I2;
Item2.Index := I1;
end;
procedure TwwComboExItems.CustomSort(Compare: TwwComboItemsCompare);
begin
if (SortType <> icstNone) and (Count > 1) then
QuickSort(0, Count - 1, Compare);
end;
procedure TwwComboExItems.QuickSort(L, R: Integer; SCompare: TwwComboItemsCompare);
var
I, J, P: Integer;
begin
repeat
I := L;
J := R;
P := (L + R) shr 1;
repeat
while SCompare(Self, I, P) < 0 do Inc(I);
while SCompare(Self, J, P) > 0 do Dec(J);
if I <= J then
begin
ExchangeItems(I, J);
if P = I then
P := J
else if P = J then
P := I;
Inc(I);
Dec(J);
end;
until I > J;
if L < J then QuickSort(L, J, SCompare);
L := I;
until I >= R;
end;
procedure TwwComboExItems.SetSortType(const Value: TwwComboItemsSortType);
begin
if FSortType <> Value then
begin
FSortType := Value;
if Value <> icstNone then
CustomSort(ListItemsCompare);
end;
end;
function TwwComboExItems.Add: TwwComboExItem;
begin
Result := TwwComboExItem(inherited Add);
end;
{
function TwwComboExItems.AddItem(const Caption: String; const ImageIndex,
SelectedImageIndex, OverlayImageIndex, Indent: Integer;
Data: Pointer): TwwComboExItem;
begin
Result := Add;
Result.DisplayTextg := DisplayText;
Result.StoredValue:= StoredValue;
Result.ImageIndex := ImageIndex;
Result.SelectedImageIndex := SelectedImageIndex;
Result.OverlayImageIndex := OverlayImageIndex;
Result.Indent := Indent;
// SetItem(Result.Index);
end;
}
function TwwComboExItems.GetComboItem(const Index: Integer): TwwComboExItem;
begin
Result := TwwComboExItem(self.GetItem(Index));
end;
function TwwComboExItems.Insert(Index: Integer): TwwComboExItem;
begin
Result := TwwComboExItem(inherited Insert(Index));
end;
function TwwComboExItems.CompareItems(I1, I2: TwwComboExItem): Integer;
begin
Result:=0;
if Assigned(OnCompare) then
Result := OnCompare(Self, I1, I2)
else begin
if self.SortType=icstDisplayedText then
begin
if CaseSensitive then
Result := AnsiCompareStr(I1.DisplayedText, I2.DisplayedText)
else
Result := AnsiCompareText(I1.DisplayedText, I2.DisplayedText)
end
else if self.SortType = icstStoredtext then
begin
if CaseSensitive then
Result := AnsiCompareStr(I1.StoredText, I2.StoredText)
else
Result := AnsiCompareText(I1.StoredText, I2.StoredText)
end
end;
end;
procedure TwwComboExItems.Notify(Item: TCollectionItem;
Action: TCollectionNotification);
begin
case Action of
cnAdded:
with TwwComboExItem(Item) do
begin
FImageIndex := -1;
FSelectedImageIndex := -1;
FIndent := -1;
// FOverlayImageIndex := -1;
FDisplayedText := '';
FStoredText:= '';
end;
// cnExtracting:
// if not (csDestroying in TWinControl(Owner).ComponentState) then
// SendMessage(TWinControl(Owner).Handle, CBEM_DELETEITEM, Item.Index, 0);
end;
end;
{procedure TwwComboExItems.SetItem(const Index: Integer);
var
AnItem: TComboBoxExItem;
Insert: BOOL;
begin
FillChar(AnItem, SizeOf(TComboBoxExItem), 0);
AnItem.iItem := Index;
AnItem.cchTextMax := 0;
Insert := SendMessage(TWinControl(Owner).Handle, CBEM_GETITEM, 0, Integer(@AnItem)) = 0;
with AnItem, ComboItems[Index] do
begin
mask := CBEIF_TEXT or CBEIF_IMAGE or CBEIF_SELECTEDIMAGE or
CBEIF_INDENT or CBEIF_LPARAM;
pszText := PChar(Caption);
iItem := Index;
cchTextMax := Length(Caption);
iImage := ImageIndex;
iSelectedImage := SelectedImageIndex;
iOverlay := OverlayImageIndex;
iIndent := Indent;
lParam := Integer(Data);
end;
if Insert then
SendMessage(TWinControl(Owner).Handle, CBEM_INSERTITEM, Index, Integer(@AnItem))
else
SendMessage(TWinControl(Owner).Handle, CBEM_SETITEM, Index, Integer(@AnItem));
end;
}
{ TwwComboExItem }
procedure TwwComboExItem.Assign(Source: TPersistent);
begin
if Source is TwwComboExItem then
begin
FSelectedImageIndex := TwwComboExItem(Source).SelectedImageIndex;
FIndent := TwwComboExItem(Source).Indent;
// FOverlayImageIndex := TwwComboExItem(Source).OverlayImageIndex;
FImageIndex := TwwComboExItem(Source).ImageIndex;
FDisplayedText := TwwComboExItem(Source).DisplayedText;
FStoredText := TwwComboExItem(Source).StoredText;
end
else
inherited Assign(Source);
end;
procedure TwwComboExItem.SetDisplayedText(const Value: String);
begin
FDisplayedText:= value;
end;
procedure TwwComboExItem.SetStoredText(const Value: String);
begin
FStoredText:= value;
end;
procedure TwwComboExItem.SetImageIndex(const Value: TImageIndex);
begin
if (FSelectedImageIndex = -1) or (FSelectedImageIndex = ImageIndex) then
FSelectedImageIndex := Value;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -