![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет! Не знал, где создать тему, создал в данной ветке.
Вопрос в следующем: на форме есть 2 StringGrid-а у которых одинаковая процедура OnDrawCell, различия только в названиях таблиц. Что-то мне подсказывает , что можно одну процедуру прикрутить к двум таблицам, чтобы не "плодить" лишнего кода. Вот код самой процедуры:Код:
procedure TForm.StringGrid1DrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var
Format: Word;
C : array[0..255] of Char;
temp, max, i, j : integer;
begin
Format := DT_Center OR DT_WORDBREAK;
(Sender as TStringGrid).Canvas.FillRect(Rect);
StrPCopy(C, (Sender as TStringGrid).Cells[ACol, ARow]);
WinProcs.DrawText((Sender as TStringGrid).Canvas.Handle, C, StrLen(C), Rect, Format);
for I := 0 to StringGrid1.ColCount - 1 do
begin
max:= 0;
for J := 0 to StringGrid1.RowCount - 1 do
begin
temp := StringGrid1.Canvas.TextWidth(StringGrid1.Cells[i, j]);
if temp > max then
max:=temp;
end;
StringGrid1.ColWidths[i] := max + StringGrid1.GridLineWidth + 10;
end;
end;Код:
.....
private
procedure TForm.GridsDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
......
procedure TForm.GridsDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var
Format: Word;
C : array[0..255] of Char;
temp, max, i, j : integer;
begin
Format := DT_Center OR DT_WORDBREAK;
(Sender as TStringGrid).Canvas.FillRect(Rect);
StrPCopy(C, (Sender as TStringGrid).Cells[ACol, ARow]);
WinProcs.DrawText((Sender as TStringGrid).Canvas.Handle, C, StrLen(C), Rect, Format);
with Sender as TStringGrid do
for I := 0 to StringGrid.ColCount - 1 do
begin
max:= 0;
for J := 0 to StringGrid.RowCount - 1 do
begin
temp := StringGrid.Canvas.TextWidth(StringGrid.Cells[i, j]);
if temp > max then
max:=temp;
end;
StringGrid.ColWidths[i] := max + StringGrid.GridLineWidth + 10;
end;
end;Помогите пожалуйста, оптимизировать код для личного так сказать роста . Спасибо. |
|
#2
|
|||
|
|||
|
Ну если пишешь StringGrid.ColCount и.т.п, то гдето выше надо написать
Код:
Var StringGrid : TStringGrid; ... begin if not (Sender is TStringGrid) then Exit; StringGrid := Sender as TStringGrid; и далее во всей процедуре заменить (Sender as TStringGrid) на StringGrid; |
| Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
bambooshoot (11.12.2012)
| ||
|
#3
|
|||
|
|||
|
Спасибо дружище!
Сделал так: Код:
unit Unit1;
interface
uses
..... WinProcs, .....;
......
private
procedure GridsDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
procedure TForm1.GridsDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var
StringGrid : TStringGrid;
Format: Word;
C : array[0..255] of Char;
temp, max, i, j : integer;
begin
if not (Sender is TStringGrid) then Exit;
StringGrid := Sender as TStringGrid;
Format := DT_Center OR DT_WORDBREAK;
(StringGrid).Canvas.FillRect(Rect);
StrPCopy(C, (StringGrid).Cells[ACol, ARow]);
WinProcs.DrawText((StringGrid).Canvas.Handle, C, StrLen(C), Rect, Format);
for I := 0 to StringGrid.ColCount - 1 do
begin
max:= 0;
for J := 0 to StringGrid.RowCount - 1 do
begin
temp := StringGrid.Canvas.TextWidth(StringGrid.Cells[i, j]);
if temp > max then
max:=temp;
end;
StringGrid.ColWidths[i] := max + StringGrid.GridLineWidth + 10;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
StringGrid1.OnDrawCell:= GridsDrawCell;
StringGrid2.OnDrawCell:= GridsDrawCell;
..............![]() |
|
#4
|
|||
|
|||
|
какойто у меня прикол с OnDrawGrid в Delphi XE
на 7ке все норм работало не мойму в чем дело закрашивает с отступом вправо на пару пикселей... текст стандартный procedure TfmMain.StringGrid4DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if (ARow>0) and (not (gdSelected in State)) then begin with StringGrid4 do begin Canvas.Brush.Color:=cllime; Canvas.FillRect(Rect); end; end; end; |