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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2012, 12:39   #1
Heng
Форумчанин
 
Регистрация: 27.02.2012
Сообщений: 117
По умолчанию Sdringgrid как запомнить координаты ячейки на которую кликаю

Проблема вот в чем:
Написал код При клике на ячейку перемещается значение ячейки в соседнюю свободную. и так для каждой из 16 всей моей таблицы
но теперь хочу сделать универсальный код для N ячеек но не знаю как запомнить координаты ячейки на которую кликаю. Как можно это написать ?

Вот мои два кода
1) Первый все работает идеально
Код:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,ARow: Integer; var CanSelect: Boolean);
var
   a:string;
if ((ACol = 0) AND (ARow = 0)) then begin
  if stringgrid1.Cells[1,0]='' then begin a:=stringgrid1.Cells[0,0]; stringgrid1.Cells[0,0]:=stringgrid1.Cells[1,0];stringgrid1.Cells[1,0]:=a;
  end;
  if stringgrid1.Cells[0,1]='' then begin a:=stringgrid1.Cells[0,0]; stringgrid1.Cells[0,0]:=stringgrid1.Cells[0,1];stringgrid1.Cells[0,1]:=a;
  end;
 end;
2) Второй модернизировал по примеру первого, но он чет неправельно ячейки перемещает.
Код:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,ARow: Integer; var CanSelect: Boolean);
var
   a:string;
   n,m:integer;
   x,y:integer;
begin

 n:=ACol; // Помойму это будет номер столбца
 m:=ARow; // Помойму это будет номер строки
 x:=Stringgrid1.ColCount; //  номер последнего столбца, перемещение правее его исключается
 y:=Stringgrid1.RowCount; // номер последней строки, перемещение ниже ее исключается

  if ((ACol = n) AND (ARow = m)) then begin
  if n<>x then if stringgrid1.Cells[n+1,m]='' then begin a:=stringgrid1.Cells[n,m]; stringgrid1.Cells[n,m]:=stringgrid1.Cells[n+1,m];stringgrid1.Cells[n+1,n]:=a;
  end;
  if n<>y then if stringgrid1.Cells[n,m+1]='' then begin a:=stringgrid1.Cells[n,m]; stringgrid1.Cells[n,m]:=stringgrid1.Cells[n,m+1];stringgrid1.Cells[n,m+1]:=a;
  end;
  if n<>0 then if stringgrid1.Cells[n-1,m]='' then begin a:=stringgrid1.Cells[n,m]; stringgrid1.Cells[n,m]:=stringgrid1.Cells[n-1,m];stringgrid1.Cells[n-1,m]:=a;
  end;
  if m<>0 then if stringgrid1.Cells[n,m-1]='' then begin a:=stringgrid1.Cells[n,m]; stringgrid1.Cells[n,m]:=stringgrid1.Cells[n,m-1];stringgrid1.Cells[n,m-1]:=a;
  end;
 end;

Последний раз редактировалось Heng; 17.10.2012 в 12:53.
Heng вне форума Ответить с цитированием
Старый 17.10.2012, 14:27   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

По мойму, если два кода сработают вместе:

Код:
  if n<>x then if stringgrid1.Cells[n+1,m]='' then begin a:=stringgrid1.Cells[n,m]; stringgrid1.Cells[n,m]:=stringgrid1.Cells[n+1,m];stringgrid1.Cells[n+1,n]:=a;
  end;
и

Код:
  if n<>0 then if stringgrid1.Cells[n-1,m]='' then begin a:=stringgrid1.Cells[n,m]; stringgrid1.Cells[n,m]:=stringgrid1.Cells[n-1,m];stringgrid1.Cells[n-1,m]:=a;
  end;
то ниче и не изменится: предположим, изначально n=5, x=4, тогда при 5<>4 получаем n=6 и при 5... пардон, уже 6<>0 получаем обратно n=5

UPD. кстати, вместо вот этого

Код:
if stringgrid1.Cells[n+1,m]='' then stringgrid1.Cells[n,m]:=stringgrid1.Cells[n+1,m]
проще написать

Код:
if stringgrid1.Cells[n+1,m]='' then stringgrid1.Cells[n,m]:=''
Но это сугубо имхо
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 17.10.2012 в 14:31.
Sciv вне форума Ответить с цитированием
Старый 17.10.2012, 16:55   #3
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Heng, если вам необходимо запомнить координаты ячейки тогда используйте глобальные переменные m и n.
По вашему же коду
Код:
 n:=ACol; // чем вас не устраивают перменные
 m:=ARow; // ACol и Arow?
 x:=Stringgrid1.ColCount; //  количество столбцов, нумерация с нуля => последний столбец -1
 y:=Stringgrid1.RowCount; // аналогично столбцам

  if ((ACol = n) AND (ARow = m)) then //вы же не изменяете значения переменых m и n - условие всегда верно
совершенно не понятно к чему вы определяете переменные n,m - дублирующие ACol и Arow, а также x и y
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 17.10.2012, 17:01   #4
Heng
Форумчанин
 
Регистрация: 27.02.2012
Сообщений: 117
По умолчанию

Цитата:
Сообщение от Step_UA Посмотреть сообщение
Heng, если вам необходимо запомнить координаты ячейки тогда используйте глобальные переменные m и n.
По вашему же коду
Код:
 n:=ACol; // чем вас не устраивают перменные
 m:=ARow; // ACol и Arow?
 x:=Stringgrid1.ColCount; //  количество столбцов, нумерация с нуля => последний столбец -1
 y:=Stringgrid1.RowCount; // аналогично столбцам

  if ((ACol = n) AND (ARow = m)) then //вы же не изменяете значения переменых m и n - условие всегда верно
совершенно не понятно к чему вы определяете переменные n,m - дублирующие ACol и Arow, а также x и y
Мне нужно чтоб m,n были динамичными, чтоб когда я кликаю по ячейке [3,1] то переменные m,n были навны n=3,m=1. А переменные x,y это постоянные величины равные количеству столбцов и строк. Самый главный вопрос Как записать значение ячейки в данный момент ?

Последний раз редактировалось Heng; 17.10.2012 в 17:06.
Heng вне форума Ответить с цитированием
Старый 17.10.2012, 17:09   #5
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Цитата:
Мне нужно чтоб m,n были динамичными, чтоб когда я кликаю по ячейке [3,1] то переменные m,n были навны n=3,m=1
они локальные и во время выполнения процедуры ACol и Arow - не изменяются
Цитата:
А переменные x,y это постоянные величины равные количеству столбцов и строк.
вы единожды обращаетесь к значениям этих переменных ...
Код:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  with StringGrid1 do
    begin
      if (ACol > 0) and (Cells[ACol-1, ARow ] = '') then
        begin cells[acol-1,arow]:=cells[ACol,arow]; cells[ACol,arow]:='' end
       else if (ACol < ColCount-1) and (cells[ACol+1,arow]='') then
        begin cells[acol+1,arow]:=cells[ACol,arow]; cells[ACol,arow]:='' end
       else if (ARow >0) and (cells[ACol,ARow-1]='') then
        begin cells[acol,arow-1]:=cells[ACol,arow]; cells[ACol,arow]:='' end
       else if (ARow <RowCount-1) and (cells[ACol,ARow+1]='') then
        begin cells[acol,arow+1]:=cells[ACol,arow]; cells[ACol,arow]:='' end
    end;
end;
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 17.10.2012, 17:23   #6
Heng
Форумчанин
 
Регистрация: 27.02.2012
Сообщений: 117
По умолчанию

Цитата:
Сообщение от Step_UA Посмотреть сообщение
они локальные и во время выполнения процедуры ACol и Arow - не изменяются
вы единожды обращаетесь к значениям этих переменных ...
Код:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  with StringGrid1 do
    begin
      if (ACol > 0) and (Cells[ACol-1, ARow ] = '') then
        begin cells[acol-1,arow]:=cells[ACol,arow]; cells[ACol,arow]:='' end
       else if (ACol < ColCount-1) and (cells[ACol+1,arow]='') then
        begin cells[acol+1,arow]:=cells[ACol,arow]; cells[ACol,arow]:='' end
       else if (ARow >0) and (cells[ACol,ARow-1]='') then
        begin cells[acol,arow-1]:=cells[ACol,arow]; cells[ACol,arow]:='' end
       else if (ARow <RowCount-1) and (cells[ACol,ARow+1]='') then
        begin cells[acol,arow+1]:=cells[ACol,arow]; cells[ACol,arow]:='' end
    end;
end;
Ништяг, оказывается все просто! Все работает, ниче не глючит, Спасибо!
Heng вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как нарисовать в OpenGL сферу которую которую можно рассматривать с разных ракурсов Sh0cK Мультимедиа в Delphi 2 07.11.2017 14:51
Как запомнить координаты Image? werrey Общие вопросы Delphi 4 21.07.2011 23:08
Как можно найти координаты выделенного ячейки в Excel? Aqil_f Microsoft Office Excel 8 31.08.2010 13:46
Можно ли своей функцей менять цвет ячейки в которую эта фу-я вставлена? maeglah Microsoft Office Excel 3 21.04.2009 05:23
как определить координаты ячейки с найденным текстом Тимониссимо Безопасность, Шифрование 2 30.05.2007 15:23