Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Зеркальное заполнение матрицы StringGrid


Автор: Rashkin 21.5.2008, 15:55
Здравствуйте. Помогите пожалуйста.
Я уже писал здесь,было задание нахождение изолированных вершин в графе. Программу написал,но вот правильное заполнение матрицы смежности,представленной элементом StringGrid сделать не получается.
Имеется матрица смежности для графа, она должна быть симметричная. Тоесть если к примеру заполняем ячейку:
Tabl.Cells[ARow,ACol]:='1';
то в ячейке 
Tabl.Cells[ACol,ARow]:='1';
Тоесть если ячейка [2,5]=1(0).то и ячейка [5,2] должна автоматически становится равной 1(0).
У меня есть автозаполнение, там вся матрица сразу заполняется, а относительно ручного заполнения хотелось бы,чтобы было как написано выше.
 А если уж совсем наглеть smile , то подскажите пожалуйста как сделать, чтобы по диагонали [1,1],[2,2] итд
нельзя было редактировать ячейки, тоесть при инициализации таблицы в них записаны 0 и чтобы нельзя было менять.
Большое спасибо.

Автор: Rodman 21.5.2008, 16:09
Код

  for i:=0 to Tabl.ARow-1 do
      for j:=0 to Tabl.ACol-1 do
      begin  
           Tabl.Cells[i, j]:=Random(1);
           Tabl.Cells[i, j]:=abs(not StrToInt(Tabl.Cells[i, j]));
      end;    

Автор: ama_kid 21.5.2008, 16:15
Цитата(Rashkin @  21.5.2008,  15:55 Найти цитируемый пост)
как сделать, чтобы по диагонали [1,1],[2,2] итд
нельзя было редактировать ячейки, тоесть при инициализации таблицы в них записаны 0 и чтобы нельзя было менять. 
Самое простое - это запретить вообще в них заходить:
Код
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
 if ACol=ARow then CanSelect:=false;
end;

Автор: Rashkin 21.5.2008, 17:41
Большое спасибо за ответы,жаль плюсики не могу поставить. 
To Rodman 
Обьясните пожалуйста в какой процедуре StrinGrid можно использовать ваш фрагмент кода, чтобы все работало?
OnGetEditText?

Автор: Rodman 22.5.2008, 11:02
Цитата(Rashkin @  21.5.2008,  17:41 Найти цитируемый пост)
Обьясните пожалуйста в какой процедуре StrinGrid можно использовать ваш фрагмент кода, чтобы все работало?

тебе же надо автоматом заполнить ГРИД?

если да, то надо просто в событии формы OnShow или OnActivate повесить.. ну или на крайняк на кнопку какую-то...
я же не совсем в курсе всей задачи!

Автор: Rodman 22.5.2008, 12:35
Код

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
begin
  if(StrToInt(StringGrid1.Cells[ACol, ARow])=1)then
    StringGrid1.Cells[StringGrid1.RowCount-ARow-1, StringGrid1.ColCount-ACol-1]:='0'
  else
    StringGrid1.Cells[StringGrid1.RowCount-ARow-1, StringGrid1.ColCount-ACol-1]:='1';
end;

Автор: Rashkin 23.5.2008, 17:47
Большое спасибо. Последнее пришлось подправить и все работает, только теперь стирать нельзя(точнее вылетает ошибка,но стирает),но думаю решу этот вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)