Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

StringGrid событие DrawCell   Найти похожие ветки 

 
alex810 ©   (2006-11-17 09:10) [0]

Помогите пожалуйста как мне можно вызвать процедуру DrawCell щелчком по кнопке. Я думаю так но не знаю что такое Rect: TRect

procedure TForm1.Button1Click(Sender: TObject);
begin
TForm3.StringGrid2DrawCell(StringGrid2, X, Y, ?????, gdFixed);
end
;


 
Elen ©   (2006-11-17 09:14) [1]


> не знаю что такое Rect: TRect

Это габарит ячейки с которой будет работать событие. А зачем тебе это - помоему refresh или repaint должно быть достаточно для всей перерисовки. В чем задача?


 
Сергей М. ©   (2006-11-17 09:16) [2]

The ARect parameter gives the boundaries of the cell in the coordinates of the canvas
Параметр ARect задает границы ячейки в координатах канвы.


 
alex810 ©   (2006-11-17 09:18) [3]

Задача вот в чем. У меня есть два StringGrid в одной из который хранится идентификатор цвета который берется из файла. В другом StringGrid необходимо по этому идентификатору разрисовать ячейку в которой находится этот идентификатор в первом StringGrid


 
Elen ©   (2006-11-17 09:21) [4]


> alex810

Ха так тебе не нужно самостоятельно вызывать OnDrawCell. пропиши в нем брать цвет из рядомлежащего Грида и наслаждайся


 
alex810 ©   (2006-11-17 09:25) [5]

Мне цвет брать не нужно. Мне нужно взять идентификотор и по этому идентификатору нарисовать цвет ячейки. Здесь можно вставить картинку, чтобы показать?


 
Сергей М. ©   (2006-11-17 09:31) [6]


> alex810 ©   (17.11.06 09:18) [3]


На то есть событие OnDrawCell.

var
 Color: TColor;

..

 if FirstGrid.Cells[ACol, ARow] = "Красный" then
   Color := clRed
 else if FirstGrid.Cells[ACol, ARow] = "Синий" then
   Color := clBlue
 else if FirstGrid.Cells[ACol, ARow] = "Зеленый" then
   Color := clGreen;
 with TDrawGrid(Sender) do begin
  Brush.Color := Color;
  Canvas.FillRect(Rect);
 end;


 
alex810 ©   (2006-11-17 09:33) [7]

Мне такую проверку нужно делать вне  события OnDrawCell


 
Elen ©   (2006-11-17 09:35) [8]


>  В другом StringGrid необходимо по этому идентификатору
> разрисовать ячейку в которой находится этот идентификатор
> в первом StringGrid

Что-то я не пойму. (Чешу репу...) У тебя есть в ячейках первого грида числа-цвет. Этим цветом нужно закрасить соответствующие ячейки во втором гриде или что?


 
Elen ©   (2006-11-17 09:36) [9]


> Мне такую проверку нужно делать вне  события OnDrawCell

Почему?


 
alex810 ©   (2006-11-17 09:41) [10]

Идентификатор цвета находится в первом гриде. По этому идентификатору программа обращается в массив где находятся цвета и рисует ячейки этим цветом и на томже самом месте во втором гриде.
Вот код

Procedure TForm3.LoadGrid1;
var
 f: textfile;
 temp, x, y: integer;
 tempstr, znach: string;
begin
 assignfile(f, "\Diplom\Tarif\Zima\Tarif2");
 reset(f);
 readln(f, temp);
 stringgrid1.colcount := temp;
 readln(f, temp);
 stringgrid1.rowcount := temp;
 for X := 0 to stringgrid1.colcount - 1 do
   for y := 0 to stringgrid1.rowcount - 1 do
   begin
     readln(F, tempstr);
     stringgrid1.cells[x, y] := tempstr;
   end;
 closefile(f);
 ////
 assignfile(f, "\Diplom\Tarif\Zima\Tarif1");
 reset(f);
 readln(f, temp);
 stringgrid2.colcount := temp;
 readln(f, temp);
 stringgrid2.rowcount := temp;
 for X := 0 to stringgrid2.colcount - 1 do
   for y := 0 to stringgrid2.rowcount - 1 do
   begin
     readln(F, tempstr);
     stringgrid2.cells[x, y] := tempstr;
   end;
 closefile(f);

 for X := 1 to stringgrid1.colcount do
   for y := 1 to stringgrid1.rowcount do
    begin
{Проверяем идентификато в первом гриде}
      if Stringgrid1.Cells[x,y] = "1" then
      begin
       Edit2.Text:=Stringgrid2.Cells[x-1,y-1];
{Здесь он должен нарисоваться}
       TForm3.StringGrid2DrawCell(StringGrid2, X,Y,, gdFixed);

      end;

{и так дальше}
      if Stringgrid1.Cells[x,y] = "2" then  Edit3.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "3" then  Edit4.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "4" then  Edit5.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "5" then  Edit6.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "6" then  Edit7.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "7" then  Edit8.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "8" then  Edit9.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "9" then  Edit10.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "10" then  Edit11.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "11" then  Edit12.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "12" then  Edit13.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "13" then  Edit14.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "14" then  Edit15.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "15" then  Edit16.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "16" then  Edit17.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "17" then  Edit18.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "18" then  Edit19.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "19" then  Edit20.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "20" then  Edit21.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "21" then  Edit22.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "22" then  Edit23.Text:=Stringgrid2.Cells[x-1,y-1];
      if Stringgrid1.Cells[x,y] = "23" then  Edit24.Text:=Stringgrid2.Cells[x-1,y-1];
    end;
end;



 
Elen ©   (2006-11-17 09:44) [11]


> alex810

Позволь навести тебя на мысль : Попробуй этот примерчик, может тебе будет так проще...
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids;

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   StringGrid2: TStringGrid;
   procedure FormCreate(Sender: TObject);
   procedure StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
     Rect: TRect; State: TGridDrawState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:dword;
begin
//********* FOR ******************
Randomize;
for i :=0  to StringGrid1.RowCount-1  do
begin
StringGrid1.Cells[0,i]:=inttostr(random(256*256*256));
end;
//******* END FOR ****************
end;

procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var r:Tcolor;
begin
//*******IF********//
if (acol=1)and(StringGrid1.Cells[0,arow]<>"") then begin
 r:=integer(strtoint(StringGrid1.Cells[0,arow]));
 StringGrid2.Canvas.Brush.Color:=r;
 //StringGrid2.Canvas.Pen.Color:=r;
 StringGrid2.Canvas.FillRect(rect);
end;
//*****End If*****//

end;

end.


P.S. если ты пишеш диплом - то мне жалко твоего препода (без обид)


 
ASoft   (2006-11-17 09:47) [12]

>alex810 ©   (17.11.06 09:41) [10]
сразу скажу, пока не забыл, читай файл и добавляй строки, а то строк/столбцов может быть больше. А файл имеет привычку внезапно заканчиваться :)


 
ASoft   (2006-11-17 09:50) [13]

а, дык у тебя там temp есть... просто, я привык к eof ;)


 
alex810 ©   (2006-11-17 09:50) [14]

У меня в OnDrawCell уже есть прорисовка части грида в зависимости от выделения мыши. Попробую объяснить все заново. У меня есть 2 грида и 24 эдита. Мне нужно сделать тарификацию по часам и дням недели. Каждому эдиту соответствует свой цвет.При клике на эдит цвет во втором гриде меняется в соответствии с цветом эдита я выделяю область в гриде в это время уже осуществляется обработка события OnDrawCell также в первом гриде сохраняется значения Edit.Text. Во втором гриде прописывается идентификатор цвета. Потом я все это сохраняю. Мне необходимо при запуске программы разрисовать второй грид как он был до закрытия окна. Идентификатор у меня уже прописывается в первом гриде на том же самом месте что и цвет во втором.


 
Сергей М. ©   (2006-11-17 09:52) [15]


> alex810 ©   (17.11.06 09:41) [10]


А причем здесь кнопка ?


> По этому идентификатору программа обращается в массив где
> находятся цвета


Хоть убей - не вижу в твоем коде никакого "массива где находятся цвета"


 
alex810 ©   (2006-11-17 09:55) [16]

Та с чтение файлов у меня проблем нет. А насчет ,что препада жалко я не обижаюсь если бы они хотя бы что нибудь подсказали а то сами не хр.. не знают.


 
Elen ©   (2006-11-17 09:55) [17]


>  2 грида и 24 эдита.

Так теперь эдиты появилисЪЪЪ. А первый грид нафея?


 
Elen ©   (2006-11-17 09:57) [18]


> если бы они хотя бы что нибудь подсказали а то сами не хр.
> . не знают.

Картинка знакома. Так. Попробуй рассуди по другому - замени 24 эдита гридом с 24 строками и во втором гриде обращайся к аналогичной строке. а после редактирования дай Репаинт или Рефреш


 
Сергей М. ©   (2006-11-17 10:01) [19]


> При клике на эдит цвет во втором гриде меняется в соответствии
> с цветом эдита


Ну и зачем нужен еще какой-то дополнительный "идентификатор цвета" ?

Edit.Color - вот он, идентификатор ! Зачем плодить еще какие-то "идентификаторы"  ?


 
alex810 ©   (2006-11-17 10:02) [20]

Я хочу сделать тарификацию примерно такуюже как и MuxaSoft Dialer. В эдитах я ввожу стоимость.


 
Сергей М. ©   (2006-11-17 10:04) [21]


> alex810 ©   (17.11.06 10:02) [20]


> хочу сделать тарификацию


Да по барабану, какую "тарификацию" ты хочешь сделать)
К твоему вопросу это не имеет ни малейшего отношения.


> В эдитах я ввожу стоимость


Кому интересно, что ты туда "вводишь" ?
Лучше скажи, когда и каким образом ты раскрасил свои эдиты - в дизайн-тайм или в ран-тайм ?


 
alex810 ©   (2006-11-17 10:05) [22]

Вот массив цветов.

const colors : array[0..23] of TColor =
(clWhite,clBlack,clMaroon,clGreen,clOlive,clNavy,clPurple,clTeal
,clGray,clSilver,clRed,clLime,clYellow,clBlue,clFuchsia,clAqua,clMoneyGreen
,clSkyBlue,clCream,clMedGray,clActiveBorder,clActiveCaption,clAppWorkSpace,clScr ollBar);

А вот зачем нужен идентификатор

procedure TForm3.Edit1Click(Sender: TObject);
begin
with TEdit(Sender) do
begin
 SelectedColor:=Colors[Tag];
end;
end;


 
Сергей М. ©   (2006-11-17 10:07) [23]


> alex810 ©   (17.11.06 10:05) [22]


У тебя твои эдиты уже раскрашены ! Зачем нужен еще какой-то массив ?

У эдита, на который "кликнули", тут же получаешь значение его св-ва Color - вот тебе тот же самый идентификатор)


 
Elen ©   (2006-11-17 10:08) [24]


> SelectedColor

А дальше как он с гридом связан?


 
alex810 ©   (2006-11-17 10:09) [25]

У меня эдитов уже 96 и для каждого делать обработку события Edit1Click. У меня и так уже более 2000 строк кода куда еще больше.


 
alex810 ©   (2006-11-17 10:11) [26]

Он связан в DrawCell

procedure TForm3.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
if (state = [gdSelected]) then
   with TStringGrid(Sender), Canvas do
   begin
     Brush.Color := SelectedColor;
     TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
     FillRect(Rect);
end;
end;



 
ASoft   (2006-11-17 10:12) [27]

>alex810 ©   (17.11.06 10:09) [25]
mamma mia! Может, правда, заменишь этиды таблицей, а? Ну, что ж ты, бедный, так страдаешь?!


 
Elen ©   (2006-11-17 10:12) [28]


> Он связан в DrawCell

Так это тебе весь грид в один колор распаинтит. Попрожнему не понимаю нафея столько эдитов? (Чето торможу наверно...)


 
Сергей М. ©   (2006-11-17 10:13) [29]


> alex810 ©   (17.11.06 10:09) [25]


> эдитов уже 96 и для каждого делать обработку события Edit1Click


Ну а как же без обработки-то ? Никак)
Другой вопрос - нафига лепить кучу одинаковых обработчиков, если всем твоим эдитам можно назначить один и тот же обработчик ?


 
alex810 ©   (2006-11-17 10:14) [30]

Есть четыре тарифных зоны. Зима, весна, лето и осень. Семь дней недели. Каждый эдит соответствует одному часу.


 
Elen ©   (2006-11-17 10:16) [31]


> Есть четыре тарифных зоны

Есть RadioButton который может переключать по зонам, внатуре.


 
ASoft   (2006-11-17 10:16) [32]

>alex810 ©   (17.11.06 10:14) [30]
с этого надо было начинать..:)
а по сабжу ответ в [1] был


 
alex810 ©   (2006-11-17 10:17) [33]

Так я и сделал один обработчик

procedure TForm3.Edit1Click(Sender: TObject);
begin
with TEdit(Sender) do
begin
SelectedColor:=Colors[Tag];
end;
end;

и обращаюсь к нему с других эдитов. В таг прописан номер эдита и соответсвенно его цвет в массиве

const colors : array[0..23] of TColor =
(clWhite,clBlack,clMaroon,clGreen,clOlive,clNavy,clPurple,clTeal
,clGray,clSilver,clRed,clLime,clYellow,clBlue,clFuchsia,clAqua,clMoneyGreen
,clSkyBlue,clCream,clMedGray,clActiveBorder,clActiveCaption,clAppWorkSpace,clScr  ollBar);


 
alex810 ©   (2006-11-17 10:18) [34]


> Есть четыре тарифных зоны

У меня TabSheet для переключеня по зонам. Чтобы сделать все визуально.


 
ЮЮ ©   (2006-11-17 10:19) [35]

Так в чем вопрос-то?
Если всё ещё subj-евый, то нигде этот метод в своем коде вызывать не надо. Это именно этот метод будет вызываться ВСЯКИЙ раз, когда нужно нарисовать ячейку.
А это нудно вовсе не толко, когда ты нажал кнопку, что-то персчитал и теперь хочешь перекрасить всё по другому. Это нужн и тогда, гогда другим окном над грдом пробежал, свернул/развернул окно. Поэтому все данные нужные для отрисовки, должнв быть поблизости и доступны в этом обработчике.

А вот в обработчике сур-пупер кнопки ты должен изменить эти даннные так, чтобы обработчик мог ими воспользоваться при отрисовке ячеек.

Чтобы заставить стринггрид перерисовать все ячейки, достаточно написать StringGrid.Invalidate;


 
Сергей М. ©   (2006-11-17 10:19) [36]


> alex810 ©   (17.11.06 10:17) [33]


> Так я и сделал один обработчик


Так а зачем в этом обработчике обращение к тегу и какому-то там массиву, если ид-р цвета можно получить из св-ва самого эдита ?

procedure TForm3.AnyEditClick(Sender: TObject);
begin
with TEdit(Sender) do
 SelectedColor:=Color;
end;

?


 
Elen ©   (2006-11-17 10:20) [37]


> У меня TabSheet

А грид 4х7 сделать раз и навсегда мысль не приходила?


 
alex810 ©   (2006-11-17 10:22) [38]


> А грид 4х7 сделать раз и навсегда мысль не приходила?

У меня восемь гридов  7Х24.


 
ЮЮ ©   (2006-11-17 10:23) [39]

А зачем ещё 96 эдитов? Вочему они не в гриде?


 
Сергей М. ©   (2006-11-17 10:25) [40]

Мда ...
Маразм крепчал ..



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2006.12.03;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.054 c
2-1163685508
eugeniya2006
2006-11-16 16:58
2006.12.03
Сравнить данные отмеченные в CeckListBox с хранящимися в файле


15-1163079164
Access
2006-11-09 16:32
2006.12.03
Восстановить "опции" explore.exe в реестре


2-1163370410
c0rben
2006-11-13 01:26
2006.12.03
Сортировка по алфавиту


15-1163540555
PHPDeveloper
2006-11-15 00:42
2006.12.03
TV тюнер


6-1152735417
papaP
2006-07-13 00:16
2006.12.03
Проблема с ошибкой 302 Found