Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы со StringGrid [D2005]


Magister Crazy ©   (2006-11-15 22:53:00) 

Есть кусок кода (обработчик кнопки):

for i:=0 to NumFields-1 do
 if i<>k then
 begin
  for j:=0 to NumFields-1 do
   sg_a.Cells[j,i]:=FloatToStr(a[i,j]*a[k,k]-a[k,j]*a[i,k]);
  sg_b.Cells[0,i]:=FloatToStr(b[i]*a[k,k]-b[k]*a[i,k]);
 end;


так вот в чем проблема. Непонятным образом последний элемент таблицы (с номером NumFields-1,NumFields-1) НЕ ПЕРЕРИСОВЫВАЕТСЯ. Но значение в нем МЕНЯЕТСЯ. Как его перерисовать вручную или как сделать так, чтобы само перерисовалось?


MsGuns   (2006-11-18 00:22:00) [1]

Magister Crazy ©  

Попробуйте сначала проставить отступы в коде, чтобы он стал, наконец, читабельным. Потом нарисуйте блок-схему. Потом подумайте. Как минимум, пару несуразностей Вы должны найти.


RASkov   (2006-11-17 23:37:00) [2]

> [15] Magister Crazy ©   (17.11.06 23:18)

Ну включи их обратно на время, проверь... Кстати, как ты отключаешь редактирование строк... По умолчанию goEditing=False.


Magister Crazy   (2006-11-17 23:18:00) [3]

Ситуация правильная... К сожалению нет рабочей версии 7 Дельфи. Проверялась на 8 и 2005 и на обоих такая фигня...  Может это как-то связано с отключением редактирования ячеек... Хотя не верится в это...


RASkov   (2006-11-16 23:55:00) [4]

Попробывал, все обновляется, правда у меня D7, может что и не так сделал, кинул на форму два SG и описал два обработчика - один твой.
procedure TForm1.FormCreate(Sender: TObject);
var i, j: Integer;
begin
 NumFields:=5;
 for i:=0 to NumFields-1 do begin
  for j:=0 to NumFields-1 do
   sg_a.Cells[j,i]:=FloatToStr(Random);
   sg_b.Cells[0,i]:=FloatToStr(Random);
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var i,j:integer;
var a:array[0..256] of array[0..256] of double;
var b:array[0..256] of double;
begin
if k=0 then
begin
sg_a.Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine];
sg_b.Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine];
end;

for i:=0 to NumFields-1 do
begin
for j:=0 to NumFields-1 do
 a[i,j]:=StrToFloat(sg_a.Cells[j,i]);
b[i]:=StrToFloat(sg_b.Cells[0,i]);
end;
//sg_a.
for i:=0 to NumFields-1 do
if i<>k then
begin
 for j:=k to NumFields-1 do
  sg_a.Cells[j,i]:=FloatToStr(a[i,j]*a[k,k]-a[k,j]*a[i,k]);
 sg_b.Cells[0,i]:=FloatToStr(b[i]*a[k,k]-b[k]*a[i,k]);
end;
Inc(k);
end;

Но может быть я не правильно воссоздал ситуацию...


RASkov   (2006-11-16 23:18:00) [5]

> sg_a.

?
Так вроде все нормально. Что есть NumFields, k?
Сейчас попробую воспроизвести твою ситуацию.....


Magister Crazy   (2006-11-16 22:58:00) [6]

Лехко ;)


procedure TForm1.btnStepClick(Sender: TObject);
var i,j:integer;
var a:array[0..256] of array[0..256] of double;
var b:array[0..256] of double;
begin
if k=0 then
begin
 sg_a.Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine];
 sg_b.Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine];
end;

for i:=0 to NumFields-1 do
begin
 for j:=0 to NumFields-1 do
  a[i,j]:=StrToFloat(sg_a.Cells[j,i]);
 b[i]:=StrToFloat(sg_b.Cells[0,i]);
end;
sg_a.
for i:=0 to NumFields-1 do
 if i<>k then
 begin
  for j:=k to NumFields-1 do
   sg_a.Cells[j,i]:=FloatToStr(a[i,j]*a[k,k]-a[k,j]*a[i,k]);
  sg_b.Cells[0,i]:=FloatToStr(b[i]*a[k,k]-b[k]*a[i,k]);
 end;
 Inc(k);
end;


RASkov   (2006-11-16 22:57:00) [7]

> [0] Magister Crazy ©   (15.11.06 22:53)

Попробуй показать полный код "Кнопки".


Magister Crazy   (2006-11-16 22:44:00) [8]

Еще нашел забавный факт: при клике на ячейку, отличную от проблемной, проблемная волшебным образом перерисовывается!!! Ничерта не понимаю :(


Magister Crazy   (2006-11-16 22:39:00) [9]

Кстати говоря, последний элемент столбца sg_b так же не перерисовывается, но считается правильно.


Magister Crazy   (2006-11-16 22:35:00) [10]


> Интересно, а как ты узнаешь, что значение меняется?


Просто вывожу ShowMessage() для соответствующей ячейки после цикла. Правильно, зараза, выводит. Пробовал и Repaint и Update+ProcessMessages - результат один. :((


> MikePetrichenko ©   (16.11.06 03:09) [7]
> > if i<>k then
> А к чему равно?


можно написать if i=k then continue;

смысл не изменится %)


MikePetrichenko   (2006-11-16 03:09:00) [11]

> if i<>k then
А к чему равно?


RASkov   (2006-11-16 02:59:00) [12]

Интересно, а как ты узнаешь, что значение меняется?
И Update, помоему, не перерисовывает контрол, а дает команду что нужно его перерисовать. Поетому может следует после Update вызвать Invalidate или вместо них обоих - Repaint.
Хотя если после Update делать application.procesmessage вроде бы должен был перерисоваться.
А может и нет в очереди сообщений - перерисовка - стоит только один раз и после Update могло что нибудь.....


Magister Crazy   (2006-11-15 23:21:00) [13]

втыкал уже, после цикла есть Inc(k), но я не верю, что это мешает...


KilkennyCat   (2006-11-15 23:13:00) [14]

вероятно, после этого цикла есть еще что-то, что не дает перерисоваться... может, стоит воткнуть application.procesmessage и посмотреть?


Magister Crazy   (2006-11-15 23:01:00) [15]

например, случай sg_a.visible:=false; sg.visible:=true; РАБОТАЕТ ИНОГДА.


Magister Crazy   (2006-11-15 23:00:00) [16]

не работает :(


KilkennyCat   (2006-11-15 22:57:00) [17]

sg_a.update?


Наверх

Титульная страница Поиск, карта сайта Написать письмо