søg i combobox - vigtigt!
hejsa,et lidt større (måske ikke?) problem:
jeg har lavet en combobox-komponent med 2 columns hvor man vha 2 properties kan bestemme størrelsen og alignment for første kolonne (den der bruges til "nøgleværdierne)!
denne komponent er lavet ved at sætte comboboxen's style til csOwnerDrawVariable...
når man gør det, er der ingen cursor i comboxen - det er istedet en kasse, hvilket også er ganske fint! dvs man kan ikke taste noget i comboboxen... (udover det første bogstav/tal hvis man vil søge)
Mit problem:
jeg vil gerne kunne søge i den combobox jeg har lavet! altså hvis man forestiller sig at første kolonne indeholder en lang række lange tal, skal man kunne taste hele (eller dele af) tallet og derved få valgt det rigtige!
det skal kodes ind i selve komponenten...
det er hovedproblemet...
andet nice-to-have kunne være at man også kunne søge i kolonne 2 og at man kunne bruge musens scroll-knap, men det kan altid komme!
jeg vil gerne give endnu flere point hvis dette bliver løst tilfredsstillende!
koden til min komponent:
-----------------------------------------------
unit HMComboBox;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TAlignType = (alLeft,alCenter,alRight);
type
THMComboBox = class(TComboBox)
constructor create(AOwner: TComponent); override;
destructor destroy; override;
private
{ Private declarations }
FFirstColWidth: Integer;
FFirstColAlignment: TAlignType;
procedure DrawItem(Control: TWinControl; Index: Integer;Rect: TRect; State: TOwnerDrawState);
function GetField(S: string; FieldIndex: integer; Delimiter: Char): string;
procedure DrawTxt(S: string; ARect: TRect; Alignment: TAlignType);
protected
{ Protected declarations }
Function GetFCP: Integer;
Procedure SetFCP(NewFCP: Integer);
Function GetAlignType: TAlignType;
Procedure SetAlignType(Const Value: TAlignType);
public
{ Public declarations }
published
{ Published declarations }
Property FirstColWidth: Integer Read GetFCP Write SetFCP;
Property FirstColAlignment: TAlignType read GetAlignType write SetAlignType;
end;
procedure Register;
implementation
Function THMComboBox.GetFCP: Integer;
begin
result := FFirstColWidth;
end;
Procedure THMComboBox.SetFCP(NewFCP: Integer);
begin
FFirstColWidth := NewFCP;
end;
Function THMComboBox.GetAlignType: TAlignType;
begin
result := FFirstColAlignMent;
end;
Procedure THMComboBox.SetAlignType(Const Value: TAlignType);
begin
FFirstColAlignMent := Value;
end;
procedure THMComboBox.DrawTxt(S: string; ARect: TRect; Alignment: TAlignType);
var Align: Cardinal;
begin
if Alignment = alLeft then Align := DT_LEFT;
if Alignment = alRight then Align := DT_RIGHT;
if Alignment = alCenter then Align := DT_CENTER;
DrawText(Self.Canvas.Handle,
PChar(S),
-1,
ARect, Align);
end;
function THMComboBox.GetField(S: string; FieldIndex: integer; Delimiter: Char): string;
var
DelimiterPos: integer;
loopCount: integer;
sRecord, sField: string;
begin
loopCount := 1;
sRecord := S;
while loopCount <= FieldIndex do
begin
DelimiterPos := Pos(Delimiter, sRecord);
if DelimiterPos <> 0 then
begin
sField := Copy(sRecord, 1, DelimiterPos - 1);
Delete(sRecord, 1, DelimiterPos);
end
else
sField := sRecord;
loopCount := loopCount + 1;
end;
result := sField;
end;
procedure THMComboBox.DrawItem(Control: TWinControl; Index: Integer;Rect: TRect; State: TOwnerDrawState);
var StartLeft: Integer;
begin
StartLeft := Rect.Left;
Rect.Right := Rect.Left + FFirstColWidth;
if odSelected in State then
Self.Canvas.Brush.Color := clNavy
else
Self.Canvas.Brush.Color := $00DFDFDF;
Self.Canvas.FillRect(Rect);
DrawTxt(GetField(Self.Items[Index], 1, '|'), Rect, FFirstColAlignment);
Rect.Left := Rect.Left + FFirstColWidth;
Rect.Right := StartLeft + Self.Width;
if odSelected in State then
Self.Canvas.Brush.Color := clNavy
else
Self.Canvas.Brush.Color := clWhite;
Self.Canvas.FillRect(Rect);
DrawTxt(GetField(Self.Items[Index], 2, '|'), Rect, alLeft);
end;
procedure Register;
begin
RegisterComponents('Standard', [THMComboBox]);
end;
constructor THMComboBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Style := csOwnerDrawVariable;
FirstColAlignment := alRight;
OnDrawItem := DrawItem;
end;
destructor THMComboBox.Destroy;
begin
Inherited Destroy;
end;
end.
-----------------------------------------------
spørg endelig hvis der skal flere oplysninger til!
/hmann
