Witam wszystkich.
Temat wydaje się znajomy i oklepany ale chodzi o ponowne zaznaczenie a to nie takie oczywiste jak mi się wydawało.
http://4programmers.net/Forum/Newbie/151976-zaznaczanie_wszystkich_komorek_wiersza_w_stringgridzie_po_wcisnieciu_przycisku
http://www.elektroda.pl/rtvforum/topic119963.html
Pojawiła się potrzeba programowo ponownego zaznaczenia już wcześniej zaznaczonego wiersza w Delphi Stringrid i okazało się że ponowne zaznaczenie metoda zwykłego zaznaczenia nie działa. Ponowne zaznaczenie danego wiersza jest potrzebne ponieważ zawartość stringgrida się zmienia i muszę odświeżyć wyświetlane pod tabelką dane.
Poniżej jakby gotowy kod, byłbym wdzięczny za wrzucenie odpowiednich poprawek a ja szukam dalej może coś znajdę.
Przed każdym zaznaczeniem generowane są nowe liczby wypełniające jedna z kolumn, dzięki temu można sprawdzić czy zaznaczenie i ponowne zaznaczenie rzeczywiście działa (dla początkujących).
W tej postaci zaznaczenie nowej pozycji działa a ponowne zaznaczenie z wykorzystaniem tego samego mechanizmu już nie. Pytanie brzmi (żeby być precyzyjnym) jak wyglądałby kod zaznaczania w procedure MStringGrid_SelectRow żeby to działało jak należy? co zmienić?
Procedury i obsługa odpowiednich zdarzeń:
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
ButtonRowNext: TButton;
ButtonRowSame: TButton;
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure ButtonRowSameClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ButtonRowNextClick(Sender: TObject);
private
procedure Generuj();
public
end;
var
Form1: TForm1;
implementation
var
fRowWyb: Integer; // Pozycja na liście liczona od zera
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
fRowWyb:= 0;
Generuj();
end;
procedure MStringGrid_SelectRow(const aStGDs: TStringGrid; const aRowWybSr: Integer);
var
_myRect: TGridRect; // do zaznaczania
_RowWyb: Integer;
begin
if aRowWybSr>-1
then _RowWyb := aRowWybSr+1
else _RowWyb := aStGDs.RowCount-1;
with aStGDs do
begin
Row := _RowWyb;
with _myRect do
begin
Top := _RowWyb;
Bottom := _RowWyb;
Left := FixedRows;
Right := ColCount - 1;
end;
Selection := _myRect;
SetFocus;
end;
end;
procedure TForm1.Generuj();
var _row: Integer;
begin
Randomize;
for _row:= 1 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[1,_row]:= IntToStr(Random(100));
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
Edit1.Text:= StringGrid1.Cells[1,ARow];
end;
// Przyciski
procedure TForm1.ButtonRowNextClick(Sender: TObject);
begin
Generuj();
if fRowWyb+1 > StringGrid1.RowCount - 2
then fRowWyb:= 0
else fRowWyb:= fRowWyb +1;
MStringGrid_SelectRow(StringGrid1, fRowWyb);
end;
procedure TForm1.ButtonRowSameClick(Sender: TObject);
begin
Generuj();
MStringGrid_SelectRow(StringGrid1, fRowWyb);
end;
end.
A potem wystarczy wkleić na formę:
object StringGrid1: TStringGrid
Left = 16
Top = 16
Width = 345
Height = 145
TabOrder = 2
OnSelectCell = StringGrid1SelectCell
end
object Edit1: TEdit
Left = 16
Top = 216
Width = 121
Height = 21
TabOrder = 3
Text = 'Edit1'
end
object ButtonRowNext: TButton
Left = 16
Top = 243
Width = 129
Height = 25
Caption = 'Zaznacz nastepny'
TabOrder = 0
OnClick = ButtonRowNextClick
end
object ButtonRowSame: TButton
Left = 151
Top = 243
Width = 129
Height = 25
Caption = 'Zaznacz ten sam'
TabOrder = 1
OnClick = ButtonRowSameClick
end
zamiana znacznika <quote> na <code class="delphi">
- @furious programming