⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wwimagecombo.pas

📁 InfoPower_Studio 2007 v5.0.1.3 banben
💻 PAS
📖 第 1 页 / 共 3 页
字号:

     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 + -