Консультация № 55325
13.09.2006, 18:41
0.00 руб.
0 2 1
Помогите решить проблему. По данным из БД строится StringGrid. Ячейки закрашиваются и в них заносятся значения в зависимости от значений атрибутов. Но при закраске ячеек из всех них пропадают значения кроме верхней левой.


Приложение:
unit UnitPreviewprosk;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, Grids,QControls, Buttons, UnitObject_cell, Menus;type TFormPreview = class(TForm) PageControlProsk: TPageControl; Button1: TButton; BitBtn1: TBitBtn; PopupMenuST: TPopupMenu; N1: TMenuItem; N2: TMenuItem; procedure Button1Click(Sender: TObject); procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure StringGrid1DblClick(Sender: TObject); procedure N1Click(Sender: TObject); procedure N2Click(Sender: TObject); procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); private { Private declarations } public MainCol,MainRow: Integer; Maincell: TObject; end;var FormPreview: TFormPreview;implementationuses UnitDataStruct, DB, UnitTTabSheet_Stellaj, UnitReplName, UnitFormCondition;{$R *.dfm}procedure TFormPreview.Button1Click(Sender: TObject);varnew_page:TWallSheet;new_table:TStringGrid;cell:TObject_cell;i,j:integer;beginData_struct.OraQueryST.ParamByName(‘link‘).AsInteger:=677;Data_struct.OraQueryST.open;while not Data_struct.OraQueryST.Eof do begin new_page:=TWallSheet.Create(PageControlProsk); new_page.Caption:=Data_struct.OraQueryST.Fields[3].AsString; new_page.kodst:=Data_struct.OraQueryST.Fields[0].AsFloat; new_page.PageControl:=FormPreview.PageControlProsk; new_table:=TStringGrid.Create(new_page); new_table.Parent:=new_page; new_table.FixedCols:=0; new_table.FixedRows:=0; new_table.OnSelectCell:=StringGrid1SelectCell;// new_table.OnDblClick:=StringGrid1DblClick; new_table.ColCount:=Data_struct.OraQueryST.Fields[5].AsInteger; new_table.RowCount:=Data_struct.OraQueryST.Fields[4].AsInteger; new_table.PopupMenu:=PopupMenuST;new_table.OnDrawCell:=StringGrid1DrawCell; new_table.DefaultDrawing:=true; Data_struct.OraQueryCell.ParamByName(‘kodst‘).AsFloat:=Data_struct.OraQueryST.Fields[0].AsFloat; Data_struct.OraQueryCell.Open; while not Data_struct.OraQueryCell.Eof do begin i:=Data_struct.OraQueryCellIN_HOR.AsInteger-1; j:=Data_struct.OraQueryCellIN_VER.AsInteger-1; new_table.Cells[i,j]:=Data_struct.OraQueryCellSNAME.Value; cell:=TObject_cell.Create(); cell.kod_cell:=Data_struct.OraQueryCellPK_KOD_CELL.AsFloat; cell.sost:=Data_struct.OraQueryCellISOST.AsInteger; new_table.Objects[i,j]:=cell; Data_struct.OraQueryCell.Next; end; Data_struct.OraQueryST.Next; Data_struct.OraQueryCell.Close; end;Data_struct.OraQueryST.Close;end;procedure TFormPreview.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);varArea:TRect;beginFormPreview.MainCol:=acol;FormPreview.MainRow:=arow;Maincell:=sender;end;procedure TFormPreview.StringGrid1DblClick(Sender: TObject);vark:double;begin{k:=((sender As TStringGrid).Objects[MainCol,MainRow] as TObject_cell).sost;ShowMessage(FloatToStr(k));}end;procedure TFormPreview.N1Click(Sender: TObject);beginFormEditName.EditOLD.Text:=(Maincell as TStringGrid).Cells[MainCol,MainRow];FormEditName.ShowModal;(Maincell as TStringGrid).Cells[MainCol,MainRow]:=FormEditName.EditNew.Text;end;procedure TFormPreview.N2Click(Sender: TObject);beginFormCondition.RadioGroupCondition.ItemIndex:=(((Maincell as TStringGrid).Objects[MainCol,MainRow])as TObject_cell).sost-1;FormCondition.ShowModal;(((Maincell as TStringGrid).Objects[MainCol,MainRow])as TObject_cell).sost:=FormCondition.RadioGroupCondition.ItemIndex+1;end;procedure TFormPreview.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);vari,j:integer;area:TRect;beginif (((Sender as TStringGrid).Objects[ACol,ARow])as TObject_cell).sost=0 then begin If (gdFocused in State) then begin (Sender As TStringGrid).canvas.Brush.color := clBlack; (Sender as TStringGrid).Canvas.Pen.Color:=clWhite; (Sender as TStringGrid).Canvas.DrawFocusRect(rect); end else begin (Sender As TStringGrid).canvas.Brush.color := clRed; (Sender as TStringGrid).Canvas.Pen.Color:=clBlack; end; end else begin If (gdFocused in State) then begin (Sender As TStringGrid).canvas.Brush.color := clBlack; (Sender as TStringGrid).Canvas.Pen.Color:=clWhite; (Sender as TStringGrid).Canvas.DrawFocusRect(rect); end else begin (Sender As TStringGrid).canvas.Brush.color := clLime; (Sender as TStringGrid).Canvas.Pen.Color:=clBlack; end; end;(Sender as TStringGrid).Canvas.FillRect(rect);for i:=0 to (Sender as TStringGrid).Col dofor j:=0 to (Sender as TStringGrid).row dobeginarea:=(Sender as TStringGrid).CellRect(i,j);(Sender as TStringGrid).Canvas.TextRect(area,0,0,(Sender as TStringGrid).Cells[i,j]);end; (Sender as TStringGrid).Canvas.DrawFocusRect(rect);end;end.

Обсуждение

Неизвестный
13.09.2006, 18:57
общий
это ответ
Здравствуйте, Daft82!

Посмотрите внимательно на строки в процедуре TFormPreview.StringGrid1DrawCell:
......
for i:=0 to (Sender as TStringGrid).Col do
for j:=0 to (Sender as TStringGrid).row do
begin
......
end;
......
У Вас прорисовка текста происходит от ячейки [0,0] до текущей ячейки.
Не нужно это делать в цикле. Отрисовывайте только одну ячейку!

.....
(Sender as TStringGrid).Canvas.FillRect(rect);
for i:=0 to (Sender as TStringGrid).Col do
for j:=0 to (Sender as TStringGrid).row do
begin
area:=Rect; //Вам в событие уже передают участок, который нужно прорисовать
(Sender as TStringGrid).Canvas.TextRect(area,area.X,area.Y,(Sender as TStringGrid).Cells[ACol,ARow]);
end;
(Sender as TStringGrid).Canvas.DrawFocusRect(rect);
end;

end.
Неизвестный
13.09.2006, 19:57
общий
Изначально непревильно - нужно юзать не StringGrid, а DBGrid
Форма ответа