Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2014, 14:42   #1
loom12
Пользователь
 
Регистрация: 05.09.2014
Сообщений: 24
По умолчанию Как определить свое событие NewStringGridOnDrawCell динамически созданных StringGrid и Form

Здраствуйте!

Подскажите пожалуйста, как определить свое событие NewStringGridOnDrawCell для динамически созданных StringGrid на динамически созданных Form? Мне надо чтобы на всех динамически созданных формах и динамически созданных StringGrid закрашивались определенные ячейки.
Код:
procedure StringGridOnDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
procedure NewStringGridOnDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState); //вот эту надо вызывать для //NewForm[i] NewStringGrid[i]

var
NewForm:array of TForm;
  NewStringGrid:array of TStringGrid;
//-------------------------------------------------
procedure Create_ObjNewForm; //создаю формы
begin
...
for i:= 0 to 4 do
  begin

   NewForm[i]:= TForm.Create(Form1);
   NewForm[i].Parent:=nil;
   NewForm[i].Tag:=i;
...
end;
//-----------------------------------------
procedure Create_ObjNewStringGrid;
begin
..
NewStringGrid[index_newform]:= TStringGrid.Create(NewForm[index_newform]);
   NewStringGrid[index_newform].Parent:=NewForm[index_newform];
   NewStringGrid[index_newform].Tag:=index_newform;
..
   NewStringGrid[i].OnDrawCell:=form1.NewStringGridOnDrawCell(??); ??как  правильно вызывать???????

end;
//----------------------------------------

procedure TForm1.NewStringGridOnDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var i:Integer;
begin
 
  for i:=0 to NewStringGrid[index_stringgrid].RowCount-1 do
   if NewStringGrid[index_stringgrid].Cells[0,i]='!' then //если есть ! закрасить
    begin
      if ((ACol=0)and(ARow=i)) then
      begin
        NewStringGrid[index_stringgrid].Canvas.Brush.Color:=clRed;
        NewStringGrid[index_stringgrid].Canvas.FillRect(Rect);
      end;
    end;
end;
в дискуссии рождается истина

Последний раз редактировалось loom12; 10.09.2014 в 17:48.
loom12 вне форума Ответить с цитированием
Старый 10.09.2014, 14:46   #2
superedward
Форумчанин
 
Аватар для superedward
 
Регистрация: 27.11.2012
Сообщений: 190
По умолчанию

Код:
NewStringGrid[i].OnDrawCell:=form1.NewStringGridOnDrawCell;
superedward вне форума Ответить с цитированием
Старый 10.09.2014, 14:58   #3
loom12
Пользователь
 
Регистрация: 05.09.2014
Сообщений: 24
По умолчанию

Я так уже делал, выходит ошибка.

Сейчас попробовал для динамически созданой NewForm[i] обработку события
Код:
NewStringGrid[i].OnDrawCell:=form1.StringGridOnDrawCell; //ошибка 
// а для Form1 работает. Что не так?

procedure TForm1.StringGridOnDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
//  var X: Real;
var i:Integer;
begin
// изменил на (Sender as TStringGrid)
    for i:=0 to (Sender as TStringGrid).RowCount-1 do
   if (Sender as TStringGrid).Cells[0,i]='!' then //если есть ! закрасить
    begin
      if ((ACol=0)and(ARow=i)) then
      begin
        (Sender as TStringGrid).Canvas.Brush.Color:=clRed;
        (Sender as TStringGrid).Canvas.FillRect(Rect);
      end;
    end;

end;
в дискуссии рождается истина

Последний раз редактировалось Stilet; 10.09.2014 в 16:14.
loom12 вне форума Ответить с цитированием
Старый 10.09.2014, 16:17   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
//ошибка
текст которой засекречен неждународной ассоциацией по скрытию вредных ошибок.
Соболезную )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2014, 16:30   #5
xxbesoxx
Участник клуба
 
Аватар для xxbesoxx
 
Регистрация: 10.08.2010
Сообщений: 1,401
По умолчанию

loom12 Можно без цикла For
читаем и делаем http://www.stringgrid-delphi.ru/coloredcell.php
Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 StringGrid1.Canvas.Brush.Color:=clRed;
  if ((ACol=2)and(ARow=2)) then    // ((ACol=2) столбцов   ARow=3  строки
    StringGrid1.Canvas.FillRect(Rect);
end;

end.
Вложения
Тип файла: rar Stringrid_color.rar (4.5 Кб, 7 просмотров)
xxbesoxx вне форума Ответить с цитированием
Старый 10.09.2014, 17:33   #6
loom12
Пользователь
 
Регистрация: 05.09.2014
Сообщений: 24
По умолчанию

рассекречиваю код ошибки


procedure Create_ObjNewStringGrid;
begin
..
NewStringGrid[index_newform]:= TStringGrid.Create(NewForm[index_newform]);
NewStringGrid[index_newform].Parent:=NewForm[index_newform];
NewStringGrid[index_newform].Tag:=index_newform;
...
// NewStringGrid[i].OnDrawCell:=form1.NewStringGridOnD rawCell; //вот здесь ошибка
NewStringGrid[i].OnDrawCell:=form1.StringGridOnDraw Cell;//вот здесь ошибка
...
end;

текст ошибки:
Project project.exe raised exception class ERangeError with message 'Range check error'.
в дискуссии рождается истина
loom12 вне форума Ответить с цитированием
Старый 10.09.2014, 17:38   #7
loom12
Пользователь
 
Регистрация: 05.09.2014
Сообщений: 24
По умолчанию

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
loom12 Можно без цикла For
читаем и делаем http://www.stringgrid-delphi.ru/coloredcell.php
Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 StringGrid1.Canvas.Brush.Color:=clRed;
  if ((ACol=2)and(ARow=2)) then    // ((ACol=2) столбцов   ARow=3  строки
    StringGrid1.Canvas.FillRect(Rect);
end;

end.
для Form1 и StringGrid1 у меня закрасить получается. Не получается закрасить ячейки на динамически созданных Формах NewForm[i] на которых динамически созданы NewStringGrid[i].

for нужен для того чтобы пройтись по всем ячейкам в 1 столбе и найти записи с "!" и закрасить их.
в дискуссии рождается истина

Последний раз редактировалось loom12; 10.09.2014 в 17:41.
loom12 вне форума Ответить с цитированием
Старый 10.09.2014, 20:12   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Код:
NewStringGrid[index_newform].OnDrawCell:=form1.StringGridOnDraw Cell;
Догадаться перевести в гугле текст ошибки конечно никак нельзя.
Кристально ясно же, что рейндж чек ерор это ошибка индекса массива. Глядите на код, сперва использовали index_newform а потом вдруг стало i. Вот и думайте.
phomm вне форума Ответить с цитированием
Старый 11.09.2014, 09:41   #9
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

в корне не верный подход. надо динамически определять тип и объект в данном случае
было
Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 StringGrid1.Canvas.Brush.Color:=clRed;
  if ((ACol=2)and(ARow=2)) then    // ((ACol=2) столбцов   ARow=3  строки
    StringGrid1.Canvas.FillRect(Rect);
end;
а надо (код не проверял может где орфография хромает)
Код:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with (sender as TStringGrid) do 
  begin
    Canvas.Brush.Color:=clRed;
    if ((ACol=2)and(ARow=2)) then    // ((ACol=2) столбцов   ARow=3  строки
    Canvas.FillRect(Rect);
  end;
end;
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 11.09.2014 в 09:43.
IliaIT вне форума Ответить с цитированием
Старый 11.09.2014, 10:17   #10
loom12
Пользователь
 
Регистрация: 05.09.2014
Сообщений: 24
Радость

Цитата:
Сообщение от phomm Посмотреть сообщение
Код:
NewStringGrid[index_newform].OnDrawCell:=form1.StringGridOnDraw Cell;
Догадаться перевести в гугле текст ошибки конечно никак нельзя.
Кристально ясно же, что рейндж чек ерор это ошибка индекса массива. Глядите на код, сперва использовали index_newform а потом вдруг стало i. Вот и думайте.
Ой, точно ошибка в [i] а надо [index_newform]. Невнимательно смотрел.
Спасибо что показали!

Семь раз проверь, один раз спроси.
в дискуссии рождается истина
loom12 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как провесить процедуру на OnShow динамически созданных вкладок PageControl'a 1fixxer Общие вопросы Delphi 9 04.06.2014 15:24
Взаимодействие динамически созданных кнопок Rilmeer Помощь студентам 5 07.06.2013 13:51
обработчик динамически созданных кнопок andir Общие вопросы Delphi 5 02.03.2013 18:11
У динамически созданной формы есть событие OnClick, но само событие не происходит Hunter_bog Компоненты Delphi 25 23.01.2012 23:50
перетаскивание динамически созданных объектов kaizer131 Общие вопросы Delphi 13 15.06.2011 07:59