Avatar billede whitehawk Nybegynder
13. april 2004 - 16:51 Der er 4 kommentarer og
1 løsning

Sortering med combobox

På en form har jeg en comboboks og er en DBGrid til at vise data fra en database. Felterne hedder f.eks. Dato og Nummer. Jeg vil gerne kunne sortere efter dato, når jeg vælger dato fra  comboboksen på formen og det samme med Nummer
Avatar billede hrc Mester
13. april 2004 - 17:30 #1
Du laver simpelthen et database-indeks til den tabel som du vil have skiftende sorteringer på. Dette kan vist laves "on-the-fly" men er lidt ineffektivt - det andet er smukkere. Jeg mener at det kan give noget "grimt" flimmer idet tabellen i realiteten lukkes, indeks skiftes og åbnes igen.

En alternativ løsning er at have data i et TListView (i report-mode) hvor brugeren kan ændre sorteringen ved at klikke på kolonnetitlerne. En TListView har et OnColumnClick og et OnCompare event som du kan bruge.
Avatar billede hrc Mester
13. april 2004 - 17:31 #2
Med "database-indeks", mente jeg et indeks på database-niveau...
Avatar billede hrc Mester
13. april 2004 - 17:53 #3
Et eksempel på sidstnævnte forslag:

type
  TfrmMain = class(TForm)
    ADONames: TADODataSet;
    lvNames: TListView;
    procedure FormCreate(Sender: TObject);
    procedure lvNamesColumnClick(Sender: TObject; Column: TListColumn);
    procedure lvNamesCompare(Sender: TObject; Item1, Item2: TListItem;
      Data: Integer; var Compare: Integer);
  private
    fColumnClicked : integer;
    fSortAscending : boolean;
  public
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  // Fetches data from a Access database
  ADONames.CommandText := 'select [ID], [Name] from [Names]';
  ADONames.Active := true;
  lvNames.Items.BeginUpdate;
  try
    while not ADONames.Eof do begin
      with lvNames.Items.Add do begin
        Caption := IntToStr(ADONames['Id']);
        SubItems.Add(ADONames['Name']);
      end; // with
      ADONames.Next;
    end; // while
  finally
    ADONames.Active := false;
    lvNames.Items.EndUpdate;
  end; // try

  fColumnClicked := 0; // Sort by ID
  fSortAscending := true;
end;

procedure TfrmMain.lvNamesColumnClick(Sender: TObject; Column: TListColumn);
begin
  if fColumnClicked = Column.Index then
    fSortAscending := not fSortAscending
  else begin
    fColumnClicked := Column.Index;
    fSortAscending := true;
  end; // else

  Screen.Cursor := crHourGlass;
  try
    (Sender as TListView).AlphaSort;
  finally
    Screen.Cursor := crDefault;
  end; // try
end;

procedure TfrmMain.lvNamesCompare(Sender: TObject; Item1, Item2: TListItem;
                                  Data: Integer; var Compare: Integer);

  // Delphi's got a CompareStr but no CompareInt or CompareFloat - bad!
  function CompareInt(const aInt1, aInt2 : integer) : integer;
  begin
    if aInt1 < aInt2 then
      result := -1
    else if aInt1 > aInt2 then
      result := 1
    else
      result := 0;
  end;

begin
  case fCOlumnClicked of
    0 : Compare := CompareInt(StrToInt(Item1.Caption),StrToInt(Item2.Caption));
    1 : Compare := CompareStr(Item1.SubItems[fColumnClicked - 1],Item2.SubItems[fColumnClicked - 1]);
  end; // case

  if not fSortAScending then // Reverse sort order.
    Compare := -Compare;
end;
Avatar billede hrc Mester
13. april 2004 - 18:05 #4
Hvis du stadig (og det vil du nok) vil skifte indeks, så skal du bruge nok bruge koden sådan her:

procedure TfrmMain.cbSortOrderChange(Sender: TObject);
begin
  ADONames.IndexName := (Sender as TComboBox).Text;
end;

... men det ser ikke ud til den Jet 4 Provider som jeg brugte til at tilgå tabellen (ADODataSet.ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\MKSSI\Delphi\Tests\ListView 01\Database.mdb;Persist Security Info=False' understøtter det - måske ODBC gør, men det er langsommere.

Jeg ved det virker med BDE og paradox-tabeller.
Avatar billede borrisholt Novice
14. april 2004 - 08:17 #5
hrc>> Du har ikke lige nogen offenlig email, så skriver jeg til dig her.

Jeg synes det er fedt du er kommet med på Eksperten, der har i langtig ikke været nogle faste der skrev her inde fast ud over mig. For et par årsiden var her flere, dem du ser i top ti.

Jeg synes dine svar er gode og vel kvalificerede !

So keep up the good working !



Jens B

Jens B
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