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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 02.02.2012, 17:58   #1
viktor77796
Новичок
Джуниор
 
Аватар для viktor77796
 
Регистрация: 02.02.2012
Сообщений: 3
По умолчанию Объединение в единую процедуру. Delphi.

Добрый день. Уважаемые программисты, прошу Вас помочь мне создать процедуру вставки Изображения(TImage) в [0,0] элемент матрицы, в StringGrid-e. Имеются 4 таблицы StringGrid. Сначала создал 4 процедуры, которые поочередно вставляют в каждую данное изображение. Преподаватель сказал, неэффективно использовать 4 одинаковых процедуры и сказал объедениеть в одну, в итоге ничего не получилось. Раньше каждая из них подключалась через Events -> OnDrawCell, теперь туда не удается подключить т.к. нужен новый параметр Grid: TStringGrid, который отвечает за изменение таблиц. Также пытался добавить данную процедуру в Events -> FormCreate, ничего не вышло. Вот код данной процедуры:
Код:
procedure TForm1.StringGridDrawCell(Grid: TStringGrid);
var
  ACol, ARow: Integer;
  Bitmap : TBitmap;   // для загр изображений
  Rect: TRect;
  State: TGridDrawState;
begin
  ARow:=0; ACol:=0;
  if (ARow = 0) and (ACol = 0)  then
  begin

    Bitmap:=TBitmap.Create;
    Bitmap.LoadFromFile('header.bmp');
    Grid.Canvas.Draw(Rect.Left+1, Rect.Top-4, Bitmap); // рисование битмап с отступом
    Bitmap.Free;
  end
  else
  begin
    Grid.Canvas.Font.Color := clBlack;
    if (ARow > 0) and (ACol > 0) then  // визуально убираем синее выделение ячейки
      Grid.Canvas.Brush.color := clWhite
    else
      Grid.Canvas.Brush.color := clBtnFace; // фон боковых ячеек

    Grid.canvas.fillRect(Rect);
    Grid.canvas.TextOut(Rect.Left+5,Rect.Top+5,Grid.Cells[ACol,ARow]);
 end;
end;
Заранее Благодарю за помощь!



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 03.02.2012 в 09:26.
viktor77796 вне форума
Старый 02.02.2012, 19:26   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

А что Вам мешает в описании класса вместо
Код:
procedure StringGridDrawCell(Grid: TStringGrid);
написать
Код:
procedure My_DrawCell(var My_Grid: TStringGrid);
и поправить заголовок процедуры, выложенной вами на
Код:
procedure TForm1.My_DrawCell(var My_Grid: TStringGrid);
Теперь представим, что нужно загрузить в 1-ый грид картинку. Переходим в события (Events) StringGrid1 , выбираем OnDrawCell и там пишем:
Код:
procedure TForm1.StringGridDrawCell(Grid: TStringGrid);
Begin
My_DrawCell(StringGrid1);
end;
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума
Старый 02.02.2012, 19:59   #3
viktor77796
Новичок
Джуниор
 
Аватар для viktor77796
 
Регистрация: 02.02.2012
Сообщений: 3
По умолчанию

Попробовал сделать как Вы, но увы картинка не появилась. Вот при такой процедуре события все работает нормально, но она неэффективна, т.к. в каждый OnDrawCell приходится записывать одинаковые коды.

Код:
//Код только для первой таблицы
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var Bitmap: TBitmap;
begin

  if (ARow = 0) and (ACol = 0)  then
  begin

    Bitmap:=TBitmap.Create;
    Bitmap.LoadFromFile('header.bmp');
    StringGrid1.Canvas.Draw(Rect.Left+1, Rect.Top-4, Bitmap); 
    Bitmap.Free;
  end
  else
  begin
    StringGrid1.Canvas.Font.Color := clBlack;
    if (ARow > 0) and (ACol > 0) then  
      StringGrid1.Canvas.Brush.color := clWhite
    else
      StringGrid1.Canvas.Brush.color := clBtnFace; 

    StringGrid1.canvas.fillRect(Rect);
    StringGrid1.canvas.TextOut(Rect.Left+5,Rect.Top+5,StringGrid1.Cells[ACol,ARow]);
 end;
end;


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 03.02.2012 в 09:26.
viktor77796 вне форума
Старый 02.02.2012, 21:42   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Так и передавай своей процедуре все параметры события OnDrawCell.
Код:
type
  TForm1 = class(TForm)
........
    procedure My_DrawCell(var Grid:TStringGrid; Col, Row: Integer;
      My_Rect: TRect; My_State: TGridDrawState);
........
procedure TForm1.My_DrawCell(var Grid:TStringGrid; Col, Row: Integer;
My_Rect: TRect; My_State: TGridDrawState);
var BitMap:TBitMap;
begin
// дописать, то , что нужно, чтобы работало так, как нужно.
  Bitmap:=TBitmap.Create;
  Bitmap.LoadFromFile('header.bmp');
  Grid.Canvas.Draw(My_Rect.Left, My_Rect.Top, Bitmap);
  Bitmap.Free;
  Grid.canvas.TextOut(My_Rect.Left+5,My_Rect.Top+5,Grid.Cells[Col,Row]);
end;


procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 My_DrawCell(StringGrid1,ACol,ARow,Rect,State);
end;

procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 My_DrawCell(StringGrid2,ACol,ARow,Rect,State);
end;

procedure TForm1.StringGrid3DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 My_DrawCell(StringGrid3,ACol,ARow,Rect,State);
end;


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Serge_Bliznykov; 03.02.2012 в 09:26.
Rin вне форума
Старый 02.02.2012, 21:53   #5
GoodDA
фрилансер
Форумчанин
 
Аватар для GoodDA
 
Регистрация: 18.07.2008
Сообщений: 107
По умолчанию

вместо StringGrid1. в обработчике надо использовать Sender
Sender это компонент с которого запускается этот обработчик события
только надо приводить к нужному классу т.е. писать TStringGrid(Sender).
тогда один обработчик можно поставить всем гридам
GoodDA вне форума
Старый 02.02.2012, 22:00   #6
viktor77796
Новичок
Джуниор
 
Аватар для viktor77796
 
Регистрация: 02.02.2012
Сообщений: 3
Хорошо

Спасибо огромное, всё удалось!+)))))
viktor77796 вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать процедуру, заменяющую стандартную процедуру Insert Andi5 Паскаль, Turbo Pascal, PascalABC.NET 2 24.11.2011 17:57
Написать процедуру Delphi (Определитель матрицы) EnotIvan Помощь студентам 1 14.05.2011 20:53
Объединение двух Tchart в один (Delphi) Николай ПН Помощь студентам 5 18.03.2010 22:57
Объединение действий Delphi AlexandЯ Общие вопросы Delphi 2 29.04.2009 13:00