Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2013, 05:19   #1
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию StringGrid1SetEditText и прочие вопросы по StringGrid

Доброго времени суток.
Требуется организовать проверку введенных чисел, так что бы они в матрице не повторялись.
Решил использовать StringGrid1SetEditText.
Код:
var
  a : array of array of real;
  i, j : integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Form1.StringGrid1.ColCount := StrToInt(Form1.Edit2.Text);
 Form1.StringGrid1.RowCount := StrToInt(Form1.Edit1.Text);
 SetLength(a,StrToInt(Form1.Edit2.Text),StrToInt(Form1.Edit1.Text));
end;
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
  const Value: string);
begin
     a[ACol,ARow] := StrToFloat(Value);
end;
Думаю для начала нужно записать это число в массив, а потом его проверять.
Но столкнулся с проблемой. Выдаёт ошибку. Может я что-то не правильно делаю?
Для начала задаю размерность динамическому массиву.
Потом как вводиться число я записываю его в ячейку массива используя удобную процедуру TForm1.StringGrid1SetEditText(Sende r: TObject; ACol, ARow: Integer;
const Value: string);
которая выдаёт мне номер строки и столбца ячейки и что я туда записываю.
Включается эта процедура при вводе числа.
Но не получается.
Может я ошибаюсь? Англ язык не очень хорошо знаю и ничего толкового по StringGrid1SetEditText не нашел, но думаю что работает именно так.

Последний раз редактировалось Artsiom; 17.12.2013 в 02:32.
Artsiom вне форума Ответить с цитированием
Старый 16.12.2013, 07:59   #2
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Помогите пожалуйста.
Artsiom вне форума Ответить с цитированием
Старый 16.12.2013, 09:04   #3
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

проверять нужно во время ввода или уже когда полностью матрица в ведена?
вот как то так
Код:
mas:aray of array:integer;
...
procedure SerchPovtor(chislo,n,m:integer):boolean;
var
   i,j:integer;
begin
   for i:=0 to n do
      for j:=0 to m do
         if mas[i,j]=chislo then
            SerchPovtor=true
         else
             SerchPovtor=false
   
end;
для ввода можно использовать обычный edit и кнопку в которой будет вызов функции и передача параметров размерности и числа

Последний раз редактировалось Lokos; 16.12.2013 в 09:10.
Lokos вне форума Ответить с цитированием
Старый 16.12.2013, 09:15   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

присоединяюсь к вопросу Lokos

и ещё. проверить несложно. Что делать, если повторы найдены?


p.s.
Цитата:
Думаю для начала нужно записать это число в массив, а потом его проверять.
строго говоря - не обязательно. Можно написать много различных вариантов. Использование дополнительного массива не является обязательным условием, ведь в самом StringGrid можно получить содержимое любой ячейки по индексам!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.12.2013, 09:25   #5
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

отвлекли просто, выводить сообщение что найден повтор ну это уже в кнопочке условие надо приписать

Код:
if SerchPovtor(chislo,n,m)=true then
   Showmessage('повтор')
else
...
Lokos вне форума Ответить с цитированием
Старый 17.12.2013, 02:29   #6
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Ага, ну так я уже думал что ничего не получиться и придётся криво через кнопочку делать проверку на повторения.
Пока подойдёт и так
Код:
function SerchPovtor(n, m : integer): boolean;
var
   i1,j1 :integer;
begin
Result := false;
   for i1:=0 to Form1.StringGrid1.ColCount do
      for j1:=0 to Form1.StringGrid1.RowCount do
         if Form1.StringGrid1.Cells[i1, j1]<>'' then
         if StrToFloat(Form1.StringGrid1.Cells[i1, j1])=StrToFloat(Form1.StringGrid1.Cells[n, m]) then
         if ((i1<>n) or (j1<>m)) then
          Result := true;
end;
Код:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
     if SerchPovtor(StringGrid1.Col,StringGrid1.Row)=true then
     begin
   Showmessage('повтор');
 StringGrid1.Row:=ARow;
StringGrid1.Col:=ACol;
     end;
end;
Помогите выйти из бесконечного цикла, но так, что бы фокус был на той ячейки которая проверялась на повторения.

Я не помню что сделал когда пытался завершить процесс, но когда у меня завис диспетчер задач я немного наложил в штаны. Хоть кода и не много, но жалко терять.
Код:
StringGrid1.Row:=ARow;
StringGrid1.Col:=ACol;
Не могу сообразить, что можно переписать в вышеописанном.

Последний раз редактировалось Artsiom; 17.12.2013 в 03:36. Причина: Упс...
Artsiom вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц