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

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


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

Наверх





Память: 0.92 MB
Время: 0.049 c
2-1163476380
begg
2006-11-14 06:53
2006.12.03
Help me pls


15-1163566298
vamp_avp
2006-11-15 07:51
2006.12.03
Траблтикет


15-1163246281
SPad
2006-11-11 14:58
2006.12.03
Раскладка клавиатуры.


15-1162911202
SkySpeed
2006-11-07 17:53
2006.12.03
Как в Excel построить следующую поверхность функции:x*x+y*y+z*z=1


2-1163670719
galyc
2006-11-16 12:51
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский