Вернемся к вопросу об удалении - добавлении строчек в StringGrid. Данный код работает замечательно, но начинаются баги когда кол-во строк не помещается на экране. Прокручиваем список вниз и удаляем последнюю или предпоследнюю строку. Часа 3 бъюсь - понять не могу. (( | Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, Menus, ExtCtrls, ComCtrls;
type TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; PopupMenu1: TPopupMenu; Delete1: TMenuItem; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Delete1Click(Sender: TObject); procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure Timer1Timer(Sender: TObject); procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); private { Private declarations } public procedure SGDeleteRow(SG: TStringGrid; RowToDelete: Integer);
end;
var Form1: TForm1;
implementation var cr: Integer = 0; {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var R: TRect; begin StringGrid1.RowCount := StringGrid1.RowCount + 1; StringGrid1.Cells[0, StringGrid1.RowCount - 1] := IntToStr(Random(100));
StringGrid1.Objects[1, StringGrid1.RowCount - 1] := TProgressBar.Create(StringGrid1); R := StringGrid1.CellRect(1, StringGrid1.RowCount - 1);
TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Parent := StringGrid1; TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Left := StringGrid1.Left + R.Left; TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Top := StringGrid1.Top + R.Top; TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Width := R.Right - R.Left; TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Height := R.Bottom - R.Top; TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Visible := True; TProgressBar(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Max := 100; TProgressBar(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Position := Random(100); with TProgressBar(StringGrid1.Objects[1, StringGrid1.RowCount - 1]) do if R.Right = R.Left then {ïðÿìîóãîëüíèê ÿ÷åéêè íåâèäèì} Visible := False else begin InflateRect(R, -1, -1); OffsetRect(R, StringGrid1.Left + 1, StringGrid1.Top + 1); BoundsRect := R; Visible := True; end;
end;
procedure TForm1.SGDeleteRow(SG: TStringGrid; RowToDelete: Integer); var i: Integer; t: TProgressBar; begin if SG.Objects[1, RowToDelete] is TControl then begin t := TProgressBar(SG.Objects[1, RowToDelete]); t.Free; end; sg.Rows[RowToDelete].Clear;
for i := RowToDelete to SG.RowCount - 2 do begin if SG.Objects[1, i + 1] is TControl then SG.Objects[1, i] := SG.Objects[1, i + 1]; SG.Rows[i].Assign(SG.Rows[i + 1]);
end; SG.RowCount := SG.RowCount - 1; end;
procedure TForm1.Delete1Click(Sender: TObject); begin if cr = 0 then exit; Timer1.Enabled := False; SGDeleteRow(StringGrid1, cr); Timer1.Enabled := True; end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin cr := ARow; form1.Caption := IntToStr(cr) + ' / ' + IntToStr((sender as TStringGrid).RowCount); end;
procedure TForm1.Timer1Timer(Sender: TObject); var i: Integer; begin // form1.Caption := IntToStr(StringGrid1.RowCount - 1); for i := 0 to StringGrid1.RowCount - 1 do if StringGrid1.Objects[1, i + 1] is TControl then TProgressBar(StringGrid1.Objects[1, i + 1]).Position := Random(100);
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if StringGrid1.Objects[ACol, ARow] is TControl then begin TControl(StringGrid1.Objects[ACol, ARow]).Left := Rect.Left; TControl(StringGrid1.Objects[ACol, ARow]).Top := Rect.Top; TControl(StringGrid1.Objects[ACol, ARow]).Width := Rect.Right - Rect.Left; TControl(StringGrid1.Objects[ACol, ARow]).Height := Rect.Bottom - Rect.Top; TProgressBar(StringGrid1.Objects[ACol, ARow]).Position := Random(100); // TControl(StringGrid1.Objects[ACol, ARow]).Visible := True; end else Exit;
end;
end.
|
--------------------
Форум программистов уклонистов в сторону сео-шмео
|