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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2014, 16:53   #1
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию Как обойти прорисовку формы?

Есть такой вот код:

Код:
type
  TKletka= class (TPanel)
     FX,FY:Integer;
    constructor Create(X,Y:Integer);
  end;

  TPole=class(TObject)
    Kletki:array[0..100,0..50]of Pointer;
    constructor Create();
    function KletkaState(X,Y:Integer):Integer;
    destructor Destroy; override;
  end;

  TForm1 = class(TForm)
    Btn4: TButton;
    procedure Btn4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Kletka:TKletka;
  Pole:TPole;

impementation
...................................
constructor TKletka.Create(X, Y: Integer);
begin
inherited Create(Form1);
  Parent:=Form1;
  Fx:=X*10;
  FY:=Y*10;
  Color:=clRed;
  SetBounds(FX,FY,10,10);
end;

constructor TPole.Create;
var X,Y:Integer;
begin
  inherited;
  for Y:=0 to 45 do begin
    for X:=0 to 100 do begin
         Kletki[X,Y]:=TKletka.Create(X,Y);
    end;
  end;
end;


procedure TForm1.Btn4Click(Sender: TObject);
begin
  Pole:=TPole.Create;
end;
Работает, но так медленно. Тормозит прорисовка формы после создание каждого объекта. клеточки появляются полосами, поле заполняется около минуты.
Как сделать так, чтобы все появлялось сразу, а не каждый объект в отдельности?

Пробовал:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Pole:=TPole.Create;
end;
Выдает access violation.
beringoff вне форума Ответить с цитированием
Старый 14.05.2014, 16:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как сделать так, чтобы все появлялось сразу, а не каждый объект в отдельности?
Использовать drawGrid и не выдумывать чепухи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.05.2014, 17:06   #3
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Да я и рад бы, но - такова задача.
beringoff вне форума Ответить с цитированием
Старый 14.05.2014, 17:17   #4
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

а что такое KletkaState ?
Может оно тормозит?
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 14.05.2014, 17:19   #5
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Код:
function TPole.KletkaState(X, Y: Integer):Integer;
begin
  Result:=1;
  if Kletki[x,y]=nil then Exit;
  Kletka:=Kletki[x,y];
  case Kletka.Color of
//    32: Kletka.Color:=16;
    clTeal: Kletka.Color:=1;
    clBlue: Kletka.Color:=clTeal;
    clRed: Kletka.Color:=clBlue;
  end;
  Kletka.Refresh;
  if Kletka.Color=1 then begin
      Pole.Kletki[x,y]:=nil;
      Kletka.Free;
      Result:=0;
  end;
end;
Да не, она не вызывается. До ее создание было то же самое.
beringoff вне форума Ответить с цитированием
Старый 14.05.2014, 17:37   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но - такова задача.
Допустим. Но из кода в топе не понятно что и где прорисовывается.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.05.2014, 17:44   #7
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Вот:
Код:
constructor TKletka.Create(X, Y: Integer);
begin
inherited Create(Form1);
  Parent:=Form1;
  Fx:=X*10;
  FY:=Y*10;
  Color:=clRed;
  SetBounds(FX,FY,10,10);
end;
прорисовывается панелька 10х10 на форме, 5000 штук одна за одной, в притирочку. TPole - массив указателей на клеточки, который в будущем будет управлять поведением этих клеточек.
beringoff вне форума Ответить с цитированием
Старый 14.05.2014, 18:04   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Да я и рад бы, но - такова задача.
Задача задачей, но реализацию делаете вы. И делать крестики-нолики, морской бой с рисованием ячеек, ввиде панелей - бред. Ни к чему хорошему это не приведет, т.к. панель вообще не для этого придумана была, у неё своя "жизнь", у каждой в отдельности, своя.

DrawGrid лишен этого, все что находится внутри него - живет 1 жизнью с DrawGrid'ом, если это не кнопки и прочее.

Так что:
Код:
Использовать drawGrid и не выдумывать чепухи.
Цитата:
прорисовывается панелька 10х10 на форме, 5000 штук одна за одной, в притирочку. TPole - массив указателей на клеточки, который в будущем будет управлять поведением этих клеточек.
О ужас...
Используйте DrawGrid, и не парьтесь. Координаты ячеек и сами ячейки, в полуготовом виде, уже вам даны и нарисованы, и за пару мс вам зарисуется хоть 100 хоть 10000 ячеек одновременно.

Последний раз редактировалось Человек_Борща; 14.05.2014 в 18:10.
Человек_Борща вне форума Ответить с цитированием
Старый 14.05.2014, 18:05   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Угу теперь ясно что делаешь.
Тормоза при резайце формы, когда мульон этих клеток начинают отрисовываться.
Увы я продолжу настаивать на использовании DrawGrid.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.05.2014, 18:17   #10
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Я так и поступлю.
Я добился чтобы прорисовывалось все сразу(убрал doubleBuffer и все заработало в Oncreate), но все равно прорисовывается не красиво.
но задачка была именно такая, у знакомова в вузе, так шта....
А где эта ДравГрид находится? Я по базам больше, но зацепило.
beringoff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в Canvas сделать прорисовку задаваемого пользователем количества линий? CallMeJammer Общие вопросы Delphi 3 18.05.2011 22:51
Как обойти проблему ??? wisdom2you Свободное общение 3 17.10.2010 19:08
Как обойти getch() ? Boвa Общие вопросы C/C++ 6 22.05.2010 22:03
Как обойти ограничения? HAMMAN Свободное общение 3 19.12.2009 14:57