Skocz do zawartości

[Delphi/Lazarus] StringGrid, filtrowanie i zaznaczanie


Hirons

Polecane posty

Witam serdecznie

 

Męczę się z tym już kolejny dzień. Piszę program do wysyłania maili do klientów. Posiada on StringGrida złożonego z 8 kolumn z czego pierwsza jest z CheckBoxem do zaznaczenia konkretnego klienta. W formie mam CombBoxa i StringGrida. ComboBox ma opcje np:

 

-WSZYSTKIE-

Niebieski

Zielony

Czerwony

 

I chcę aby po zkliknięciu konkretnej opcji pokazywało TYLKO wiersze które mają w 6 kolumnie to słowo (przy tym nie usuwając aktualnego zaznaczenia CheckBox). Dla opcji -WSZYSTKIE- aby nie filtrowało i pokazywało wszystkie wiersze StringGrida. Jak rozwiazać jeszcze jedną kwestię: Zaznaczanie klientów z przyciskiem shift czyli np. zaznaczam wiersz nr 2 i z shiftem klilam na wiersz 12 to zaznacza mi od 2 do 12 wiersza.

 

Mam nadzieję że wystarczająco opisałem.

 

Proszę o pomoc

Pozdrawiam

 

@edit

 

Mam takie coś: lecz to się kiepsko chyba tyczy do mojego problemu:

var
 FilterList : TStringList;
// Filter setzen
// set the filter
procedure TForm1.SetFilter(ACol:Integer;Exp:String);
var
 I,Counter:Integer;
begin
 FilterList:=TStringList.Create;
 With Grid do
 begin
//Filterliste mit Gridinhalt füllen
For I := FixedRows To RowCount - 1 Do
 	FilterList.Add(Rows[i].Text);
//Grid filtern
Counter:=FixedRows;
For I := FixedRows To RowCount - 1 Do
Begin
 	If Cells[ACol,I] <> Exp Then
 	Begin
    	Rows[i].Clear;
 	end
 	Else
 	begin
    	If Counter <> I Then
    	Begin
      	Rows[Counter].Assign(Rows[i]);
      	Rows[i].Clear;
    	End;
    	Inc(Counter);
 	End;
End;
RowCount:=Counter;
 End;
end;
// Gridinhalt wiederherstellen
// restore the original content
procedure TForm1.RestoreFilter;
var
 I:Integer;
begin
 With Grid do
 begin
RowCount:=FixedRows+FilterList.Count;
For I:=0 To FilterList.Count - 1 Do
   	Rows[FixedRows+I].Text := FilterList.Strings[i];
 End;
 FilterList.Free;
end;

//Example
procedure TForm1.BtnSetFilterClick(Sender: TObject);
begin
 //Grid nach Zellinhalt der markierten Zelle filtern
 SetFilter(Grid.Col,Grid.Cells[Grid.Col,Grid.Row]);
end;
procedure TForm1.BtnRestoreFilterClick(Sender: TObject);
begin
 RestoreFilter;
end;

Link do komentarza
Udostępnij na innych stronach

  • 1 month later...

Na moje oko TStringGrid służy tylko do wyświetlania w tym przypadku. O ile musi być z wykorzystaniem tego komponentu to proponuję utworzyć tebelę z rekordami i sa dwa wyjścia:

 

1. dajesz dodatkowy parametr typu string gdzie dodajesz jakiej opcji to dotyczy np.

tabela[ licznik ].rekord.opcja:='czerwony';

przy wyświetlaniu przeglądasz tabelę i jeśli któryś rekord pasuje to go na ekran

 

2. szybszy sposób to utworzenie na podstawie tabeli z punktu 1. list indexów -> array of Integer, wtedy wyświetlanie jest znacznie szybsze, ale potrzeba ciut więcej procedurek dopisać

wyglądało by to tak:

tabela[ czerwony ].rekord.opcja:='czerwony';

Zamiast przeglądać całej tabeli program zajmuje się tylko jej mały wycinkiem, jednak te indexy jeszcze trzeba zapisywac do pliku np w TStringList

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...