Avatar billede hmann Nybegynder
11. juli 2003 - 09:00 Der er 3 kommentarer og
1 løsning

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
Avatar billede borrisholt Novice
11. juli 2003 - 10:40 #1
Di problem må være meagn til hvis nu man ville søge i en alm ComboBox. I det man kan sige den har en collum. Sådan et komponent har jeg på lager . Så kan du jo selv hacke den om.
Avatar billede hmann Nybegynder
11. juli 2003 - 10:45 #2
selve søgealgoritmen er ikke det største problem,
mere det med at man ikke kan skrive i en combobox hvor style er
sat til csOwnerDrawVariable...

er det en komponent man må se?
Avatar billede hmann Nybegynder
11. juli 2003 - 15:21 #3
har fået perfekt hjælp fra en amerikansk gut på experts-exchange.com og har derfor løst mit problem!

lukker...
Avatar billede athlon-pascal Juniormester
11. juli 2003 - 23:50 #4
hmann -> Ifølge Ekspertens regler skal løsningen være tilgængelig for alle Ekpertens brugere, kan du evt. give et link?
(Jeg er nysgerrig)...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Capgemini Danmark A/S

AI/Data Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Solution Manager til Cyberdivisionen

Netcompany A/S

IT Consultant