Главная страница
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]

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


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


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

Только что сделал он белый а мне нужно чтобы он рисовал в соответсвии что находится в другом гриде и на каком месте.


 
Elen ©   (2006-11-17 10:27) [42]


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

Чем дальше в лес - тем толще партизаны. Даже и не знаю что советовать...


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


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

Каждые 24 грида соответствуют одному тарифному сезону а их 4


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


> Каждые 24 грида

А в гридах колонок сколько? и чем они заняты?


 
ASoft   (2006-11-17 10:29) [45]


> alex810 ©   (17.11.06 10:22) [38]
>
>
> > А грид 4х7 сделать раз и навсегда мысль не приходила?
>
> У меня восемь гридов  7Х24.

alex810 ©   (17.11.06 10:27) [43]

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

Каждые 24 грида соответствуют одному тарифному сезону а их 4


 
Elen ©   (2006-11-17 10:32) [46]


> Каждые 24 грида соответствуют одному тарифному сезону а
> их 4
>

Думаю без скриншота не понять автора... :-\


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

Ща попробую нарисовать
_________
! 1!2!3!4!5!

Например это первый грид. Мне нужно чтобы во втором гриде вместо 1 на перво был цвет идентификатор которого соответствовал бы единице и все это рисовалось бы пр Create формы. Например

procedure TForm3.FormCreate(Sender: TObject);
begin
прорисовка второго грида
end.

или при переходе с одного TabSheet на другой
а если не прорисовывать то рисуе последнее выделение мишью


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


> Думаю без скриншота не понять автора... :-\

А куда можно поместить скриншот?


 
Elen ©   (2006-11-17 10:38) [49]


> Ща попробую нарисовать

У кого нибудь валидолЪчик есть? Так в чем проблема, док?


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


> Только что сделал он белый а мне нужно чтобы он рисовал
> в соответсвии что находится в другом гриде и на каком месте.
>
>

Вот в OnDrawCell  этого грида и должно быть написано, где взять эти цвета, закраска этими цветами ячеек и вывод текста.
Код этого обработчика в студию, если, конечно это не те самые 2000 строк кода :)


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


> Каждые 24 грида соответствуют одному тарифному сезону а
>
> > их 4

Извените обшипся не грида а эдита. Запарился


 
Elen ©   (2006-11-17 10:40) [52]


> alex810

в OnDrawCell второго грида прорисовывай колором из такой же ячейки первого грида учитывая твою "палитру" StringGrid1.Invalidate вызывай где угодно и не парься...


 
ЮЮ ©   (2006-11-17 10:43) [53]

и все это рисовалось бы пр Create формы.

Читатай внимательно [35], [50], [52]


 
Elen ©   (2006-11-17 10:45) [54]


> Читатай

Что тоже валидольчик уже нужен? :)


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


> нужно чтобы во втором гриде вместо 1 на перво был цвет идентификатор


Еще раз спрашиваю - зачем !?

Ведь ты же сам сказал, что цвет ячейки грида должен точно соответствовать цвету "кликнутого" эдита !

Эдит уже хранит хранит в своем св-ве Color этот идентификатор, так на кой черт еще массив понадобился ? Объясни ты мне, тупому ..


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

Извените связ оборвалась
Кликаем на гриде 2 и запоминаем начальную позицию выделения

procedure TForm3.StringGrid2Click(Sender: TObject);
begin
x1:=Form3.StringGrid2.Selection.TopLeft.X;
y1:=Form3.StringGrid2.Selection.TopLeft.Y;
end;


Отпускаем мышу и запоминаем конечную позицию выделения. В гриде 2 записываем цену которая указана в эдите. В гриде 1 записываем идентификатор цвета который соответсвтует цвету едита


procedure TForm3.StringGrid2MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
 var i,j:integer;
begin
x11:=Form3.StringGrid2.Selection.BottomRight.X;
y11:=Form3.StringGrid2.Selection.BottomRight.Y;
For i:=x1 to x11 do
 begin
    for j := y1 to y11  do
     begin
      Form3.StringGrid2.Cells[i,j]:=Cena1;
     end;
 end;
 For i:=x1+1 to x11+1 do
 begin
    for j := y1+1 to y11+1  do
     begin
      Form3.StringGrid1.Cells[i,j]:=IntToStr(Ident1);
     end;
 end;
end;

прорисовываем в гриде 2 ячейки которые выделил цветом едита и записываем в них значени Edit.Text.

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;

Сохраняем в файле идентификатор цвета в гриде 1 и положение этого цвета

procedure TForm3.Button1Click(Sender: TObject);
var
 f: textfile;
 x, y: integer;
begin
 assignfile(f, "\Diplom\Tarif\Zima\Tarif1");
 rewrite(f);
 writeln(f, stringgrid2.colcount);
 writeln(f, stringgrid2.rowcount);
 for X := 0 to stringgrid2.colcount - 1 do
   for y := 0 to stringgrid2.rowcount - 1 do
     writeln(F, stringgrid2.cells[x, y]);
 closefile(f);
///////
 assignfile(f, "\Diplom\Tarif\Zima\Tarif2");
 rewrite(f);
 writeln(f, stringgrid1.colcount);
 writeln(f, stringgrid1.rowcount);
 for X := 0 to stringgrid1.colcount - 1 do
   for y := 0 to stringgrid1.rowcount - 1 do
     writeln(F, stringgrid1.cells[x, y]);
 closefile(f);
end;

Вот тут самое интересное в это процедуре мне нужно разрисовать грид 2
соответственно таким каким он был сохранен

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];
Вот тут
      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;


 
Плохиш ©   (2006-11-17 10:57) [57]


> alex810 ©   (17.11.06 10:34) [47]


> Мне нужно чтобы во втором гриде вместо 1 на перво был цвет
> идентификатор которого соответствовал бы единице и все это
> рисовалось бы пр Create формы
.

Ой, дайте, я тоже здесь расслаблюсь :-))
Не пора ли уже почитать основы работы используемой ОС и системы разработки? В креате формы ничего не рисуется, для отрисовки объектов им(объектам) посылаются соответствующие сообщения, при получении которых, объект и должен позаботиться о своей отрисовки.


 
_RusLAN ©   (2006-11-17 10:59) [58]

И как это такое получается - 50 постов, а ни автор не понял что ему советуют, ни отвечающие не поняли что надо автору. Это надо уметь...


 
Сергей М. ©   (2006-11-17 11:00) [59]

Ему про фому, а он все про ерему)

Ты на [55] таки соизволишь ответить ?


 
Плохиш ©   (2006-11-17 11:01) [60]


> _RusLAN ©   (17.11.06 10:59) [58]
> И как это такое получается - 50 постов, а ни автор не понял
> что ему советуют, ни отвечающие не поняли что надо автору.

У автора талант :-)


 
Elen ©   (2006-11-17 11:01) [61]

Во-первых :

> Сохраняем в файле идентификатор цвета в гриде 1 и положение
> этого цвета

Для этого есть Stringgrid.row[i].Savetofile();

Во-вторых :
> Кликаем на гриде 2 и запоминаем начальную позицию выделения
>
> Отпускаем мышу и запоминаем конечную позицию выделения.
> В гриде 2 записываем цену которая указана в эдите. В гриде
> 1 записываем идентификатор цвета который соответсвтует цвету
> едита

Зачем такие сложности. Выделяй по нормальному Shift+click
И в-третьих так в чем проблема?


 
Elen ©   (2006-11-17 11:04) [62]


> _RusLAN ©   (17.11.06 10:59) [58]
>
> И как это такое получается - 50 постов, а ни автор не понял
> что ему советуют, ни отвечающие не поняли что надо автору.
>  Это надо уметь...

Терпение мой друг - общение это главное, а о чем... Да ладно, неважно.... ;)


 
alex810 ©   (2006-11-17 11:04) [63]

[55] Идентификатор нужен для хранения в файле и последующей прорисовке в гриде при необходимости.


 
alex810 ©   (2006-11-17 11:06) [64]


> Зачем такие сложности. Выделяй по нормальному Shift+click
> И в-третьих так в чем проблема?

Мне нужно чтобы выделить мышью. При закрытии программы прорисовка с грида пропадает а мне нужно чтобы при запуске программы прорисовка которая была при закрытии программы прорисовывалась все заново.


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


> alex810 ©   (17.11.06 11:04) [63]


Ты вообще способен понять вопрос на русском языке ?)

Я не спрашиваю тебя, зачем он нужен, я спрашиваю зачем тебе нужем массив, дублирующий уже имеющуюся в эдитах инф-цию о цвете ?


 
alex810 ©   (2006-11-17 11:08) [66]


> Не пора ли уже почитать основы работы используемой ОС и
> системы разработки? В креате формы ничего не рисуется, для
> отрисовки объектов им(объектам) посылаются соответствующие
> сообщения, при получении которых, объект и должен позаботиться
> о своей отрисовки.

Я понимаю что не прорисовывалась у меня первый вопрос был как вызвать процедуру DrawCell при креате формы


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


> Мне нужно чтобы выделить мышью.

Ну дык а я о чем - нажал шифт и выделяй мушкой от...до.

Чесс слово - я так и до сих пор не понимаю цели всего этого


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


> Я не спрашиваю тебя, зачем он нужен, я спрашиваю зачем тебе
> нужем массив, дублирующий уже имеющуюся в эдитах инф-цию
> о цвете ?

А что при необходимости не проще ли обратится к массиву цветов по идентификатору чем проверять какому едиту соответсвует этот идентификатор?


 
ASoft   (2006-11-17 11:10) [69]

>alex810 ©
коли пустили твой сабжевый вопрос побоку (точнее, оставили в сторонке), ответь, пожалуйста >Сергей М. ©   (17.11.06 11:07) [65]
а то точно, здесь кого-нибудь кондрат хватит


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


>  как вызвать процедуру DrawCell при креате формы

А это ничего не даст. При креате на экране ничего нет. Все паинты потом в Show


 
Плохиш ©   (2006-11-17 11:10) [71]


> как вызвать процедуру DrawCell при креате формы

Афигеть, и он начал свой пост со слов "Я понимаю", я рыдаю...
Какой смысл вызывать DrawCell при креате формы?


 
Плохиш ©   (2006-11-17 11:11) [72]


> Ну дык а я о чем - нажал шифт и выделяй мушкой от...до.

Как эротично.... :-)


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


> А что при необходимости не проще ли обратится к массиву
> цветов по идентификатору чем проверять какому едиту соответсвует
> этот идентификатор?

В Эдитах есть свойство tag. Туда и можно заложить твой иденты.

> а то точно, здесь кого-нибудь кондрат хватит

Привет Кондратию!


 
ASoft   (2006-11-17 11:12) [74]


> Я понимаю что не прорисовывалась у меня первый вопрос был
> как вызвать процедуру DrawCell при креате формы

щас придут Кетмарь и Процент, вот тогда поймешь ;)


 
ЮЮ ©   (2006-11-17 11:12) [75]


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


Ты хоть раз приведёшь код этого злосчастного OnDrawCell, который до закрытия программы все красит как надо, а после, изверг, никак не хочет?


 
alex810 ©   (2006-11-17 11:12) [76]

ЛЮДИ Давайте я скину кому нибудь на мыло скриншот с объяснение что мне нужно. Может он более понятней сформирует вопрос чем я.


 
Elen ©   (2006-11-17 11:13) [77]


> Плохиш

Описка !!! 8D (надеюсь никому на ум не придет запятую в этом слове поставить...)


 
Плохиш ©   (2006-11-17 11:14) [78]


> Может он более понятней сформирует вопрос чем я.

100 Euro по предоплате за правильно сформулированный вопрос :-)


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


> В Эдитах есть свойство tag. Туда и можно заложить твой иденты.

[73]
Я так и сделал


 
Elen ©   (2006-11-17 11:15) [80]


> ЛЮДИ Давайте я скину кому нибудь на мыло скриншот с объяснение
> что мне нужно. Может он более понятней сформирует вопрос
> чем я.

Только не мне!!! Я точно не пойму скрин - я уже ничего не понимаю... Привет Кондратик!


 
Плохиш ©   (2006-11-17 11:15) [81]


> Elen ©   (17.11.06 11:13) [77]
>
> > Плохиш
>
> Описка !!!

Ну вот :-( а как хорошо начиналось ;-)


 
Elen ©   (2006-11-17 11:17) [82]


> Я так и сделал

Ну так сопоставляеш индент в таге с цветом папочки и получаеш нужную связку


 
alex810 ©   (2006-11-17 11:17) [83]


> Ты хоть раз приведёшь код этого злосчастного OnDrawCell,
>  который до закрытия программы все красит как надо, а после,
>  изверг, никак не хочет?


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;


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


> а как хорошо начиналось

Главное хорошо кончить (т.е. закончить)... ХМ прикольная ветка - не дает мне в преферанс доиграть


 
ASoft   (2006-11-17 11:18) [85]

>alex810
...хоть кусочек кода, где у тебя красится все или не красится.
кстати, а OnDrawCell у тебя присутствует в Гридах? Так... риторически спрашиваю


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


> alex810 ©   (17.11.06 11:17) [83]


Ну и где здесь разноцветный грид, если используется только один цвет SelectedColor?


 
alex810 ©   (2006-11-17 11:19) [87]

Задам вопрос еще раз. Что мне ставить после скобок при вызове процедуры

StringGrid2DrawCell(????????????????)

StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);


 
ASoft   (2006-11-17 11:19) [88]

о, присутствует... ну что ж за связь такая :(


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


> alex810

ИМХО тут проблема не в реализации а в постановке задачи и способе решения. Продумай, Автор, еще раз что и как хочеш получить в мелочах.


 
Плохиш ©   (2006-11-17 11:21) [90]


> alex810 ©   (17.11.06 11:19) [87]
> Задам вопрос еще раз. Что мне ставить после скобок при вызове
> процедуры
>
> StringGrid2DrawCell(????????????????)

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


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


> Ну и где здесь разноцветный грид, если используется только
> один цвет SelectedColor?


SelectedColor - перемення которая берет цвет с массива Colors[Tag]       [Tag] - идентификатор цвета который берется с Edit.Tag

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


 
ASoft   (2006-11-17 11:22) [92]


> alex810 ©   (17.11.06 11:19) [87]
>
> Задам вопрос еще раз. Что мне ставить после скобок при вызове
> процедуры

а такой вопрос был что ли?.. просмотрел я однако...


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


> Задам вопрос еще раз. Что мне ставить после скобок при вызове
> процедуры


Отвечу еще раз. Этот метод не вызываю в рукописном коде. Это - самый настоящий обработчик события. Всякий раз, когда грид должен нарисовать ячейку он вызывает этот метод. И именно в этом методе ты и должен разукрасить эту ячейку так как надо.
StringGrid.Inavalidate - перерисуются все видимые ячкйки грида


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


> Я тебе по секрету скажу. Можешь поставить что угодно, хоть
> свои паспортные данные, результат от этого не изменится.
>

Спосибо за дельный совет я ставил

StringGrid2DrawCell( StringGrid2, X, Y, (тут я не знаю что ставить),  gdFixed);


 
ЮЮ ©   (2006-11-17 11:27) [95]

Обраьотчик OnDrawCell вызывается <количкство видимых строк> * <количкство видимых столбцов раз> и SelectedColor при этих вызовах один и тот же


 
Elen ©   (2006-11-17 11:27) [96]


> Помогите пожалуйста как мне можно вызвать процедуру DrawCell
> щелчком по кнопке. Я думаю так но не знаю что такое Rect:
>  TRect
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> TForm3.StringGrid2DrawCell(StringGrid2, X, Y, ?????, gdFixed);
>
> end;


> alex810

Этот код сработает только для одной ячейки (если вообще сработает). Тебе нужен цикл (Хотя уверенности в этом совете у меня нет)


 
alex810 ©   (2006-11-17 11:27) [97]


> Отвечу еще раз. Этот метод не вызываю в рукописном коде.
>  Это - самый настоящий обработчик события. Всякий раз, когда
> грид должен нарисовать ячейку он вызывает этот метод. И
> именно в этом методе ты и должен разукрасить эту ячейку
> так как надо.
> StringGrid.Inavalidate - перерисуются все видимые ячкйки
> грида

Так что то есть. Но как мне задать какие ячейки надо пересивать.


 
Сергей М. ©   (2006-11-17 11:28) [98]


> alex810 ©   (17.11.06 11:10) [68]
> А что при необходимости не проще ли обратится к массиву
> цветов по идентификатору чем проверять какому едиту соответсвует
> этот идентификатор?


При какой такой "необходимости" ?

И зачем нужен еще какой-то лишний ц/ч идентификатор, если тип TColor сам по себе идентифицирует цвет ?

Если уж на то пошло, то массив тут нужен скорее для хранения TColor-значений, ассоциированных с каждой ячейкой грида. Перед уничтожением формы пиши массив в файл, а при создании считывай файл в массив. В событии OnDrawCell обращайся к соотв.элементу массива и бери оттуда готовый цвет. И все ! К чему непонятные выкрутасы ?


 
alex810 ©   (2006-11-17 11:29) [99]

[96] у меня есть цикл. Как можно это реалезовать.


 
Elen ©   (2006-11-17 11:29) [100]


>  Но как мне задать какие ячейки надо пересивать.

Пусть перерисовывает все. Тебе же лучше будет


 
Elen ©   (2006-11-17 11:30) [101]


> [96]

Ты сейчас Кетмара накликаеш. Это его заклинание - потом берегисЪЪЪ


 
ЮЮ ©   (2006-11-17 11:31) [102]

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


если Colors[Tag] ты хочешь назначить выбранной на данный момент ячейке грида, это должна быть не переменная, а массис[кол-во строк, кол-во столбцов],
и надо выбирать значение из этого массива в соответствии с ACol и ARow


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


> Пусть перерисовывает все. Тебе же лучше будет

Но мне надо перерисовать определенные ячейки с определенным цветом


 
alex810 ©   (2006-11-17 11:36) [104]


> Если уж на то пошло, то массив тут нужен скорее для хранения
> TColor-значений, ассоциированных с каждой ячейкой грида.
>  Перед уничтожением формы пиши массив в файл, а при создании
> считывай файл в массив. В событии OnDrawCell обращайся к
> соотв.элементу массива и бери оттуда готовый цвет. И все
> ! К чему непонятные выкрутасы ?


А если у меня уже есть один обработчик?


 
ЮЮ ©   (2006-11-17 11:37) [105]

alex810 ©   (17.11.06 11:27) [97] Так что то есть.

ЮЮ ©            (17.11.06 10:19) [35]
Есть это надо было ещё час назад. А теперь уже так пережевали, что и есть противно :)


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


> Но мне надо перерисовать определенные ячейки с определенным
> цветом

Ага. Давайте человек будет дышать правой частью грудной клетки, а левой так помахивать.

ПУСТЬ ПЕРЕРИСОВЫВАЕТ ВСЕ!!! Чем плохо?


 
alex810 ©   (2006-11-17 11:37) [107]


TForm3.StringGrid2DrawCell(StringGrid2, X, Y, ?????, gdFixed);

что мне вместо вопросов поставить??? Я уже больше ничего не прошу


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


> ПУСТЬ ПЕРЕРИСОВЫВАЕТ ВСЕ!!! Чем плохо?

А что он нарисует???????


 
Elen ©   (2006-11-17 11:39) [109]


> что мне вместо вопросов поставить???

Габариты нужной ячейки.


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


> Но мне надо перерисовать определенные ячейки с определенным
> цветом


Ты читать научишься? Или писать только умеешь?

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 := ЦВЕТА_ЯЧЕЕК[ARow, ACol];
    TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
    FillRect(Rect);
end;
end;


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


> alex810 ©   (17.11.06 11:36) [104]
> А если у меня уже есть один обработчик?


Обработчик чего ?


 
Elen ©   (2006-11-17 11:41) [112]


> А что он нарисует???????

То что ты пропишеш в OnDrawCell.
Автор не обижайся - просто ты и сам не знаеш чего хочеш. Легкие пути далеко не всегда правильны. А TForm3.StringGrid2DrawCell(StringGrid2, X, Y, ?????, gdFixed); не даст тебе прорисовку, по крайней мере придется цикл делать.


 
ЮЮ ©   (2006-11-17 11:41) [113]

    Brush.Color := ЦВЕТА_ЯЧЕЕК[ARow, ACol];
    FillRect(Rect);
   TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);

Естественно, сначала стереть с доски, а потом на ней написать :)


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


> Ты читать научишься? Или писать только умеешь?

У меня этот обработчик уже есть. Он рисует когда я выделяю мышью. А мне надо чтобы он рисовал еще и тогда когда создается форма.


 
Elen ©   (2006-11-17 11:43) [115]


>  когда создается форма.

При Креате прорисавка не выполняется.


 
alex810 ©   (2006-11-17 11:44) [116]


> То что ты пропишеш в OnDrawCell.
> Автор не обижайся - просто ты и сам не знаеш чего хочеш.
>  Легкие пути далеко не всегда правильны. А TForm3.StringGrid2DrawCell(StringGrid2,
>  X, Y, ?????, gdFixed); не даст тебе прорисовку, по крайней
> мере придется цикл делать.

Та я понимаю что прийдется делать цикл он у меня уже есть

for X := 1 to stringgrid1.colcount do
  for y := 1 to stringgrid1.rowcount do
   begin
     if Stringgrid1.Cells[x,y] = "1" then
     begin
Сюда что надо написать


 
ЮЮ ©   (2006-11-17 11:44) [117]

Когда ты выделяешь мышью грид рисует только ячейку с которой ты ушел и в которую ты пришел. Проведи над гридом после этого другой формой и удивись тому, как у тебя всё запущено. :)


 
Сергей М. ©   (2006-11-17 11:45) [118]


> alex810 ©   (17.11.06 11:41) [114]



> Он рисует когда я выделяю мышью. А мне надо чтобы он рисовал
> еще и тогда когда создается форма.
>


Он рисует всегда, когда по тем или иным причинам требуется перерисовать ячейку. И одна из этих "причин" (в том числе и в первую очередь) - создание грида в ходе создания формы


 
alex810 ©   (2006-11-17 11:46) [119]


> Когда ты выделяешь мышью грид рисует только ячейку с которой
> ты ушел и в которую ты пришел. Проведи над гридом после
> этого другой формой и удивись тому, как у тебя всё запущено.
>  :)

Вот моя проблема. Как сделать чтобы она прорисовывалась опять так как была


 
ЮЮ ©   (2006-11-17 11:47) [120]

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 := ЦВЕТА_ЯЧЕЕК[ARow, ACol];
   TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
   FillRect(Rect);
end;
end;


Это все что тебе нужно. Осталось в нужным местах заполнять и изменять массив цветов, вызывая после этого перерисовку всего грида StringGrid2.Invalidate


 
ЮЮ ©   (2006-11-17 11:48) [121]

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 := ЦВЕТА_ЯЧЕЕК[ARow, ACol];
   TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
   FillRect(Rect);
end;
end;


Это все что тебе нужно. Осталось в нужным местах заполнять и изменять массив цветов, вызывая после этого перерисовку всего грида StringGrid2.Invalidate

Для невменяемого автора. Может заметит


 
Elen ©   (2006-11-17 11:49) [122]


>  Как сделать чтобы она прорисовывалась опять так как была

.Invalidate. Все вычисления по колору помести в обработчик отрисовки.
> Та я понимаю что прийдется делать цикл он у меня уже есть
>
> for X := 1 to stringgrid1.colcount do
>   for y := 1 to stringgrid1.rowcount do
>    begin
>      if Stringgrid1.Cells[x,y] = "1" then
>      begin
> Сюда что надо написать

Ничего. Вместо этого цикла Stringgrid1.invalidate; Он сам организует прорисовку.
Вот это if Stringgrid1.Cells[x,y] = "1" then лучше перенести в OnDrawCell


 
Плохиш ©   (2006-11-17 11:49) [123]


> alex810 ©   (17.11.06 11:41) [114]

Чукча-писатель!
Товагищь, в oncreate формы читаешь из файла, сохранённый ранее, массив цветов и вариант, многократно озвученный ЮЮ, отрисует твой грид без каких-либо дополнительных телодвижений с твоей стороны.


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


> Это все что тебе нужно. Осталось в нужным местах заполнять
> и изменять массив цветов, вызывая после этого перерисовку
> всего грида StringGrid2.Invalidate

Только что попробовал не получается.


 
ЮЮ ©   (2006-11-17 11:50) [125]

Вынужден был кричать авторским неправильным кодом.

    Brush.Color := ЦВЕТА_ЯЧЕЕК[ARow, ACol];
    FillRect(Rect);
    TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);

Естественно, сначала стереть с доски, а потом на ней написать :)


 
ЮЮ ©   (2006-11-17 11:51) [126]


> Только что попробовал не получается.


Код OnDrawCell - в студию!!!


 
Плохиш ©   (2006-11-17 11:52) [127]


> Elen ©   (17.11.06 11:41) [112]
>
> > А что он нарисует???????
>
> То что ты пропишеш в OnDrawCell.
> Автор не обижайся - просто ты и сам не знаеш чего хочеш.

В данном случае, автор как раз знает что хочет :-) Только степень его знаний по теме не позволяет ему не только найти правильное решение, но, к сожалению, даже понять это решение уже нмогократно пережёванное здесь.


 
Elen ©   (2006-11-17 11:56) [128]

Удалено модератором


 
ASoft   (2006-11-17 11:58) [129]

так.. на чем остановились? :)
>alex810 ©
автор, пока ты не поймешь где, как и что рисуется в принципе вообще  и не сделаешь, простенький пример окрашивания столбца/строки СтрингГрида, тебе будет сложно сваять что-то серьезное!


 
Elen ©   (2006-11-17 12:01) [130]

Удалено модератором


 
alex810 ©   (2006-11-17 12:02) [131]


> Вот это if Stringgrid1.Cells[x,y] = "1" then лучше перенести
> в OnDrawCell


Я так и сделал не получается
procedure TForm3.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var x,y:integer;
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
 else
   for X := 1 to stringgrid1.colcount do
  for y := 1 to stringgrid1.rowcount do
   begin
     if Stringgrid1.Cells[x,y] = "1" then
    begin
      if (state = [gdSelected]) then
   with TStringGrid(Sender), Canvas do
   begin
     Brush.Color := Edit2.Color;
     TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
     FillRect(Rect);
   end
    end;
end;
end;


 
ASoft   (2006-11-17 12:04) [132]

та
> alex810 ©   (17.11.06 12:02) [131]
>
>


>  FillRect(Rect);

так и хочется сказать известную здесь фразу "чукча писатель..." :(


 
KilkennyCat ©   (2006-11-17 12:05) [133]

тайнопись.


 
Elen ©   (2006-11-17 12:06) [134]


> alex810

Когда я говорю Вот это if Stringgrid1.Cells[x,y] = "1" then лучше перенести
> в OnDrawCell
имеется только это, а тоы весь цикель дтуда зафигачил. Совет : попробовать на более простых задачах и примерах понять механизм отрисовки.


 
Плохиш ©   (2006-11-17 12:07) [135]


> alex810 ©   (17.11.06 12:02) [131]

Враньё, этот код компилятор делфи даже не пропустит.


 
Elen ©   (2006-11-17 12:08) [136]


> alex810

Так. Давай спочатку - тебе нужно проверить цифру в ячейке, найти соответствующий ей цвет и отрисовать в такой же ячейке по позиции в другом гриде. Так?


 
Плохиш ©   (2006-11-17 12:09) [137]


> procedure TForm3.StringGrid2DrawCell(Sender: TObject; ACol,
>  ARow: Integer;


>    for X := 1 to stringgrid1.colcount do
>   for y := 1 to stringgrid1.rowcount do

А я - Папа Римский. Спокойно дети мои, спокойно. Там со всеми разберутся...


 
Плохиш ©   (2006-11-17 12:11) [138]


> Плохиш ©   (17.11.06 12:07) [135]

Хотя, умеют же чукчи код форматировать :-)


 
alex810 ©   (2006-11-17 12:12) [139]


> Так. Давай спочатку - тебе нужно проверить цифру в ячейке,
>  найти соответствующий ей цвет и отрисовать в такой же ячейке
> по позиции в другом гриде. Так?

ДАаааааа


 
Elen ©   (2006-11-17 12:13) [140]


> ДАаааааа

Воооо. Нука запусти это :
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;
 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,0,0);
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(23));

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(colors[strtoint(StringGrid1.Cells[0,arow])]);
 StringGrid2.Canvas.Brush.Color:=r;
 //StringGrid2.Canvas.Pen.Color:=r;
 StringGrid2.Canvas.FillRect(rect);
end;
//*****End If*****//

end;

end.


Мысли появляются?


 
ASoft   (2006-11-17 12:13) [141]


> Плохиш ©   (17.11.06 12:09) [137]

это у него от отчаянья
> Плохиш ©   (17.11.06 12:11) [138]

копипаст, однако


 
ЮЮ ©   (2006-11-17 12:16) [142]

может код поймет лучше слов?

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
     Rect: TRect; State: TGridDrawState);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   FDefaulGridColors: array of array of TColor;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 i, j: integer;
begin
 SetLength(FDefaulGridColors, StringGrid1.RowCount, StringGrid1.ColCount);
 for i := 0 to StringGrid1.RowCount - 1 do
   for j := 0 to StringGrid1.ColCount - 1 do begin
     FDefaulGridColors[i, j] := RGB(
       Round(i / (StringGrid1.RowCount - 1) * 255),
       Round(j / (StringGrid1.ColCount - 1) * 255),
       0
     );
     StringGrid1.Cells[j, i] := IntToStr((i + 1));
   end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
 StringGrid1.Canvas.Brush.Color := FDefaulGridColors[ARow, ACol];
 StringGrid1.Canvas.FillRect(Rect);
 StringGrid1.Canvas.Font.Color := StringGrid1.Font.Color;
 StringGrid1.Canvas.TextRect(
   Rect, Rect.Left + 2, Rect.Top + 2, StringGrid1.Cells[aCol, aRow]
 );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 // перекрасим текущую ячейку в белый
 FDefaulGridColors[StringGrid1.Row, StringGrid1.Col] := clWhite;
 StringGrid1.Invalidate;
end;

end.


 
alex810 ©   (2006-11-17 12:19) [143]

УРА!!!!!!!!!!!! Получилось всем огромное спасибо. Особенно тебе Elen ты была со мной самая терпеливая.


 
ЮЮ ©   (2006-11-17 12:20) [144]

Удалено модератором


 
alex810 ©   (2006-11-17 12:22) [145]

Удалено модератором


 
Elen ©   (2006-11-17 12:24) [146]


> alex810

Вооо. Теперь самое трудное - втолковать сие твоему преподу. Держись студент... ;)


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


> Вооо. Теперь самое трудное - втолковать сие твоему преподу.
>  Держись студент... ;)

А втолковывать ничего не надо они все равно прогу не смотрят


 
Сергей М. ©   (2006-11-17 12:28) [148]


> втолковывать ничего не надо они все равно прогу не смотрят


Вот откуда начинается "разврат" будущих инженеров)

"А поршень у двигателя ваще сделан из дерева, патамуша диплом все равно никто не читает" (с) студенческо-дипломное


 
Elen ©   (2006-11-17 12:37) [149]


> А втолковывать ничего не надо они все равно прогу не смотрят

Так нафик тебе эта лабуда на 140 постов. Нарисовал бы в Кореле форму и вставил в отчет.... Лады, надеюс на бущее понял как это делать.


> "А поршень у двигателя ваще сделан из дерева, патамуша диплом
> все равно никто не читает"

К сожелению в моем институте такая же каша.


 
Anatoly Podgoretsky ©   (2006-11-17 12:55) [150]

> Плохиш  (17.11.2006 12:11:18)  [138]

Да брось, откуда
Какое же это форматирование

     begin
end
  else

и ниже

 begin
  end
   end;

Похоже отступы делались методом случайных чисел


 
Anatoly Podgoretsky ©   (2006-11-17 12:56) [151]

> alex810  (17.11.2006 12:26:27)  [147]

> они все равно прогу не смотрят

Наивный, смотрят, просто могут ничего не сказать, если они уже на тебя плюнули.


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

А я, братцы-кролики, так и не въехал, нафига автору "первый StringGrid", показывающий пользователю какие-то там "идентификаторы" ...

Мне теперь что, на свалку истории ?)


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

Где там Суслик (С) ?)
Намедни он живо интересовался сей патологией ..


 
Elen ©   (2006-11-17 13:17) [154]


> афига автору "первый StringGrid",

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


> Где там Суслик (С) ?)

Ха Жалко тут Кетмар не появился.


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


> Автор писал


Все это расчудесно)

Но, повторюсь, тупица я эдакий,  мне не понятно, для чего тот кто по идее должен лупиться на экран, изображающий эту программу, обязан лупиться на эти идентификаторы)

Их, эти идентификаторы, с чем употреблять-то ? Нахрена они показаны тому самому "кому-то" ?) Просто "щоб було" ?)


> Жалко тут Кетмар не появился.


"Да ...уж .." (с) Киса В.


 
Elen ©   (2006-11-17 13:27) [156]


>  Просто "щоб було"

Таки ДА. А що? Може комусь i треба.

P.S. Тупиц тут нет - есть шутники


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


> Elen ©   (17.11.06 13:27) [156]



> А що? Може комусь i треба


Да вот и прелюбопытно мне - таки кому ?

Преподу оно, как выясняется, даром не надо.. Реальных юзеров сего "шедевра" тоже вроде бы не предвидится ..



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

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

Наверх




Память: 0.93 MB
Время: 0.057 c
1-1160324072
flaxe
2006-10-08 20:14
2006.12.03
Несколько вопросов по компоненту TWebBrowser.


6-1152536756
Ал
2006-07-10 17:05
2006.12.03
Синхронизация часов


2-1163766009
Grant
2006-11-17 15:20
2006.12.03
ODBC


4-1153810612
DmitrySukach
2006-07-25 10:56
2006.12.03
Получение сертификата пользователя через Active Directory


10-1126629436
mvs
2005-09-13 20:37
2006.12.03
Отключение перерегистрации сервера автоматизации при запуске