Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.046 c
2-1163862232
Vasiliy
2006-11-18 18:03
2006.12.03
Вывод на канву многострочного текста


15-1163501877
Chainichek
2006-11-14 13:57
2006.12.03
Помогите настроить доступ к компьютеру по локалке


15-1163178255
Ne-Ld
2006-11-10 20:04
2006.12.03
Назовите, пожалуйста, главные признаки проектов, в которых не сто


2-1163610135
Riply
2006-11-15 20:02
2006.12.03
Вопросы из разряда "Почему верблюд не ест вату ?"


2-1163112797
image
2006-11-10 01:53
2006.12.03
Как узнать количество потоков работающих в данный момент времени





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский