DBGrid sort asc desc błąd

Odpowiedz Nowy wątek
2010-10-10 15:37
NAS97
0

mam taki kod do sortowania danych po kliknięciu na kolumnę w obie strony, ale występuje bła porównania:

Linia:

      PreviousColumnIndex := Column.Index;

Treść błędu:

[Error] Unit1.pas(427): Left side cannot be assigned to
procedure TForm1.JvDBGrid1TitleClick(Column: TColumn);

  const PreviousColumnIndex : integer = -1;
{$J-}
begin
  if (jvdbgrid1.DataSource.DataSet is TCustomADODataSet) and ( not column.Field.IsBlob) then
    with TCustomADODataSet(jvdbgrid1.DataSource.DataSet) do begin
      DisableControls;
      try
        jvdbgrid1.Columns[PreviousColumnIndex].title.Font.Style := jvdbgrid1.Columns[PreviousColumnIndex].title.Font.Style - [fsBold];
        jvdbgrid1.Columns[PreviousColumnIndex].title.Font.Color := clWindowText;
      except
      end;
      Column.title.Font.Style := Column.title.Font.Style + [fsBold];
      Column.title.Font.Color := ClBlue;
      PreviousColumnIndex := Column.Index;
      if (Pos(Column.Field.FieldName, Sort) = 1) and (Pos(' DESC', Sort)= 0) then
        Sort := Column.Field.FieldName + ' DESC'
      else
        Sort := Column.Field.FieldName + ' ASC';
      EnableControls;
    end;
end;

Hmm ten błąd poprawić, aby już sortowało w asc i desc?

Pozostało 580 znaków

2010-10-10 17:33
0

Błąd wynika z próby przypisania wartości do stałej. Poza tym chyba źle podchodzisz do tematu. Jeśli na początku zdarzenia chcesz odboldować kolumnę po której poprzednio sortowałeś, to PreviosColumnIndex powinno być czymś bardziej globalnym - najlepiej polem grida, a jak robisz doróbkę, to chociaż polem klasy - w przeciwnym wypadku ta zmienna żyje tylko na czas wykonywania procedury zdarzeniowej. No i brakuje Ci sprawdzania czy PreviousColumnIndex było wogóle ustawione - bez tego będziesz miał "List index out of bounds".

// dopisane
Teraz zauważyłem że przed niezainicjowaną wartością PreviousCo ... się zręcznie zabezpieczyłeś, oj nieładnie nieładnie.

b

Pozostało 580 znaków

2010-10-10 19:10
NAS97
0

Dobra wszystko fajnie, sporo teorii itd. ale koniec z powyższym kodem.

Wykminiłem cos takiego:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  atrybut, wartosc: string;
begin
   atrybut:=Column.Title.Caption;
   if atrybut='ID' then wartosc:='NR_ID';
    if atrybut='LP' then wartosc:='LP';
     if atrybut='IMIĘ' then wartosc:='IMIE';
     if atrybut='NAZWISKO' then wartosc:='NAZWISKO';
     if atrybut='DATA URODZENIA' then wartosc:='DATA_UR';
    if atrybut='ADRES' then wartosc:='ADRES';
   if atrybut='TELEFON' then wartosc:='TELEFON';

   with IBQuery1, SQL do begin
    Close;
     Clear;
     Add('SELECT * FROM Book ORDER BY '+wartosc+' ASC;');
    Open;
   end;  
end;

Oczywiście to mi sortuje rosnąco. Teraz jak zrobić, aby sortowało malejąco, gdy kliknę znowu daną kolumnę tą samą?
Próbowałem coś z zapamiętaniem nazwy pola i przyrównywaniem jej do nazwy nowo klikniętej, stosując jakieś warunki, ale nic nie daje to.

Pozostało 580 znaków

2010-10-10 19:34
0
NAS97 napisał(a)

ale koniec z powyższym kodem.

Znowu błąd - ADO sortuje niewiarygodnie szybko.

NAS97 napisał(a)

Wykminiłem cos takiego:


procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
atrybut, wartosc: string;
begin
atrybut:=Column.Title.Caption;
if atrybut='ID' then wartosc:='NR_ID';
if atrybut='LP' then wartosc:='LP';
if atrybut='IMIĘ' then wartosc:='IMIE';
if atrybut='NAZWISKO' then wartosc:='NAZWISKO';
if atrybut='DATA URODZENIA' then wartosc:='DATA_UR';
if atrybut='ADRES' then wartosc:='ADRES';
if atrybut='TELEFON' then wartosc:='TELEFON';

with IBQuery1, SQL do begin
Close;
Clear;
Add('SELECT * FROM Book ORDER BY '+wartosc+' ASC;');
Open;
end;
end;



To żeś się nakminił.

 > ##### NAS97 napisał(a)
> Oczywiście to mi sortuje rosnąco.

Serio ?

 > ##### NAS97 napisał(a)
> Teraz jak zrobić, aby sortowało malejąco, gdy kliknę znowu daną kolumnę tą samą?
> Próbowałem coś z zapamiętaniem nazwy pola i przyrównywaniem jej do nazwy nowo klikniętej, stosując jakieś warunki, ale nic nie daje to.

Nic nie daje bo robiłeś to źle. Pewnie zmienną do zapamiętywania nazwy pola zrobiłeś lokalną - czyli nie wyciągnąłeś wniosków z mojej pierwszej odpowiedzi, tylko kombinujesz jak koń pod górę.

Przeproś się z pierwszym kodem, przenieś PreviosColumnIndex : Integer; pod słowo pirvate w swoim module i będzie git.

b

Pozostało 580 znaków

2010-10-10 21:21
NAS97
0

świetnie :) ...

Pozostało 580 znaków

2010-10-12 12:44
NAS97
0

Zrobiłem coś takiego i działa jak chciałem. ;]

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
     atrybut, wartosc, sort: string;
begin
    sort:='ASC';
      if sort='ASC' then sort:='DESC' else 
    if sort='DESC' then sort:='ASC';

//if Label2.Caption='ASC' then Label2.Caption:='DESC' else
//if Label2.Caption='DESC' then Label2.Caption:='ASC';

    atrybut:=Column.Title.Caption;
      if atrybut='ID' then wartosc:='ID_BAZY';
       if atrybut='NAZWISKO' then wartosc:='NAZWISKO';
      if atrybut='IMIĘ' then wartosc:='IMIE';
    if atrybut='ADRES' then wartosc:='ADRES';

 with IBQuery1, SQL do begin
    Close;
     Clear;
     Add('SELECT * FROM Baza ORDER BY '+wartosc+' '+sort);
    Open;
   end;
end;

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0