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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2011, 21:04   #1
Renok
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 36
По умолчанию Создать UNDO для стринггрида

Всем доброго времени суток)
Столкнулся с проблемой.
Создаю программу, в которой будут использоваться горячие клавиши. Копирование, вставку, вырез я сумел написать. А вот отмену действий оказалось весьма сложно.
Элементарную отмену, типа введенное число заменить предыдущем, сделал. Осталось дописать условия, когда в стринггрид вставляется массив ячеек, или наоборот убирается. Знаю, что то что я сделал никак не сочетается с тем, что нужно сделать.

Жду помощи
Renok вне форума Ответить с цитированием
Старый 06.06.2011, 22:28   #2
Ghennadiy
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 153
Стрелка

думаю тебе стоит покопать демки Delphi, или просто сделать отдельный буфер в который будет писаться значения, а кнопка назад будет их оттуда ставить обратно
Ghennadiy вне форума Ответить с цитированием
Старый 07.06.2011, 06:23   #3
Renok
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 36
По умолчанию

То что нужен буфер, это естественно. Ведь нужно записывать историю действий и хранить ее на протяжении действия программы.
Мне нужен принцип, по которому можно будет сохранять в буфер и извлекать из него данные. Которые заносятся в программу по средствам ctrl+v
Renok вне форума Ответить с цитированием
Старый 07.06.2011, 10:08   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Код:
type
  RTile = record // map format description in 'hmm3form' directory
    tertype  : byte ;   // Terrain type 00-09
    terconf  : byte ;   // terrain config  by bmp from def
    rivtype  : byte ;   // river type 00 - no river  00-04
    rivconf  : byte ;   // river config 00-10
    roadtype : byte ;   // road type  00 - no road  00-03
    roadconf : byte ;   // road config  0-16
    mirror : byte ;     // mirror for a cell , bitwise 00-63
    end ;

  ptile = ^Rtile  ;

  Rundo = record
  xcord : word ;
  ycord : word ;
  level : byte ; // 1 - subterra
  tile : Rtile ;
  end ;
...

{form}
procedure BundoClick(Sender: TObject) ;
procedure setundo(cu : cardinal) ;
property curundo :cardinal read fcurundo write setundo ;
...
var
Aundo: array of Rundo ;
aundol : cardinal ;
...     

procedure TForm1.BcopycellsClick(Sender: TObject) ;
var i,j : word ;
begin
if not maploaded
  then exit ;
with DG.Selection do begin      // gets copying area to temp array
  tempsizex := Right-left+1 ;
  tempsizey := bottom-top+1 ;
  setlength(tempcells,tempsizey,tempsizex) ;
  for i := left to right do
    for j := top to bottom do begin
      if activegrid = 0
        then tempcells[j-top,i-left] := acellsGND[j,i]
        else tempcells[j-top,i-left] := acellsSTR[j,i] ; // stores copying data
      end ;
  end ;
end ;


procedure TForm1.BpastecellsClick(Sender: TObject) ;
var i,j,sz : word ;

begin
if not maploaded
  then exit ;
sz := sizeof (rtile) ;
with DG.Selection do begin           // locates pasting area, excludes outofmap
  for i := left to left + tempsizex-1 do
    for j := top to top + tempsizey-1 do begin
      if (j >= mapsize) or (i >= mapsize)
        then continue ;

      if activegrid = 0
        then ptile1 := @acellsGND[j,i]
        else ptile1 := @acellsSTR[j,i] ;
      ptile2 := @tempcells[j-top,i-left] ;  // sets tiles for comparing

      if CompareMem(ptile1, ptile2, sz)     // compares and if different then pastes
        then continue ;                     // and saves to undo
      curundo := curundo + 1 ; // calls setundo
      Aundo[curundo].xcord := i ;
      Aundo[curundo].ycord := j ;
      Aundo[curundo].level := activegrid ;
      Aundo[curundo].tile := ptile1^ ;
      ptile1^ := tempcells[j-top,i-left] ;
      drawtile(i,j) ;     // draws all pasted tiles
      end ;
  end ;
end ;

procedure TForm1.setundo(cu : cardinal) ; // setter for property 'curundo'
begin
fcurundo := cu ;
if aundol <= cu
  then begin              // increase undolimit
  inc (aundol,100) ;
  setlength(aundo,aundol) ;
  end ;
Mundo.caption := lng_bundo+' '+inttostr(cu) ; // write current undo
end ;

procedure TForm1.BundoClick(Sender: TObject) ;
begin
if curundo = 0
  then exit ;
with aundo[curundo] do begin  // restore changes via undo
  curundo := curundo-1 ;
  if (xcord > mapsize-1) or (ycord > mapsize-1) // if outofmap then skip
    then exit ;
  if level = 0
    then acellsGND[ycord,xcord] := tile
    else acellsSTR[ycord,xcord] := tile ;  // undoing tile
  if activegrid <> level
    then begin
    activegrid := level;   //   move view to undo cell
    CBlevelchange(nil);
    end;
  if ((xcord < DG.LeftCol) or (xcord > DG.LeftCol+dg.visiblecolcount))
    then if (xcord > 10)
      then DG.LeftCol := xcord-10
      else DG.LeftCol := 0;
  if ((ycord < DG.toprow) or (ycord > DG.toprow+dg.visiblerowcount))
    then if (ycord > 10)
      then DG.toprow := ycord-10
      else DG.toprow := 0;
  drawtile(xcord,ycord) ;  // draw tile on a grid, only if visible
  end ;
end ;
Не могу особо разъяснять.. но это вырезка из кода для редактора карт игры. Там при любом изменении клетки(как при одиночном рисовании, так и массовом, вроде копи-пасты) происходит сохранение в ундо. После можно от-ундо-ить кнопочкой, Кнопочкой. много раз. не всё сразу. специфика редактора

Если что, весь проект тут http://phomm.narod.ru/programs/h3mtered.htm

Последний раз редактировалось phomm; 07.06.2011 в 10:11.
phomm вне форума Ответить с цитированием
Старый 07.06.2011, 13:52   #5
Ghennadiy
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 153
По умолчанию

с кодом я тебе не очень помогу но смотри это
http://habrahabr.ru/blogs/net/80174/
и тебе просто нужен скрипт завести думаю, с описанием действий и процедуру которая будет реагировать на событие с указанными параметрами, а они будут лежать в твоем буфере как сделанные шаги, можно много раз подряд undo redo делать
Ghennadiy вне форума Ответить с цитированием
Старый 07.06.2011, 16:28   #6
Renok
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 36
По умолчанию

phomm
За код спасибо, вот если бы еще понять что к чему... Или исходники той программы, а то на сайте нет.

Ghennadiy
Ссылка что надо) Вот только там тоже нет исходников. Понять что и куда записывать сложно.
А со скриптами я просто пока не умею работать. Так что вариант не подходит.
Renok вне форума Ответить с цитированием
Старый 07.06.2011, 21:44   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

А это что ? http://phomm.narod.ru/programs/h3mtered.zip
Исходники все в архиве с прогой.
Комментировано средне-мало, на англ. языке.
phomm вне форума Ответить с цитированием
Старый 10.06.2011, 19:46   #8
Renok
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 36
По умолчанию

Допустим исходники не помогли...Может кодик есть опробованный?
Renok вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как пересчитать ячейки стринггрида TotKtoNado БД в Delphi 7 17.04.2011 14:37
Рандомное заполнение массива и стринггрида Repac123456 Помощь студентам 5 09.11.2010 00:29
ширина колонки СтрингГрида Lisi4ka Общие вопросы Delphi 1 12.05.2009 09:37
Undo-Redo NeiL Общие вопросы Delphi 8 14.03.2008 19:04