Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

Нужна помощь по формам   Найти похожие ветки 

 
lstalkerl ©   (2006-05-25 01:32) [0]

У меня такая проблемма. Есть 2 формы. Сначала запускаеться 1, потом вторая. В 1 форме, есть процедрура, которая начинает выполняться сразу после запуска программы(игра Сапер), которая формирует игровое поле с помощью матрицы, назовем ее NewGame. Эта процедура использует для создания поля - NM-кол-во мин N-кол-во клеток по вертикали M-горизонтали. Моя задача состоит в том, чтобы дать возможность самому вводить кол-во мин(оно раньшше содержалось в Const NM=10). Я сделал так. В менню добавил параметр - кол-во мин, на OnClick поставил действие, чтобы запускалась 2 форма. Вторая форма состоит из Edit и Button. Из Edit она берет строку, переводит ее в integer и присваивает переменной NM, которую я удалил из const 1 формы, записал в Public второй формы. После копиляции прога выдает ошибку. Как я думаю, она сначала запускает процедуру NewGame, и при ее выполнении начинает материца, ведь NM не имеет еще никакого значения. Тогда я после слова Begin в процедуре NewGame написал form2.nm:=10, ну типо чтобы она сначала приняла значение 10, чтобы прога нормально запустилась, а потом уж если че, можно будет поменять это значение из меню -задать кол-во мин.

Вроде все....обьяснил наверно непонятно....вообщем тут исходник, кое че не сходиться(названия переменных) с вышенаписанным текстом, но суть одна и таже.

http://webfile.ru/962715

З.Ы. Просьба, кто возьметься помочь, не просто скинуть рабочую версию, а еще обьяснить, что изменили(добавили, удалили) и почему было не правильно, т.е. тыкнуть где была ошибка.


 
Rial ©   (2006-05-25 03:39) [1]

Посмотрел, не поленился, код.
Спасибо за комментарии кстати! Первый раз вижу комменты в таком количестве на русском!

Дело в том, что на момент создания 1-й формы остальные двеформы еще не созданы. А ты обращаешься к ним в OnCreate первой формы.

Вохда два:
1. Простой, но не оптимальный.
Переместить код с использованием других форм (следующих в списке создания) в OnShow, например, который в штатных (читай - простых) ситуаниях вызывается 1 раз. Для верности прописать там флаг:
OnCreate
MyFlag:=False;
OnShot
If (Not MyFlag)then begin
//Делай то, что мужно было
MyFlag:=True;
end;
2.По - моему, белее верный.
- Открываешь исходник проекта (Ctrl+F12, Имя проекта).
- Удаляешь строки
 Application.CreateForm(TForm2, Form2);
 Application.CreateForm(TForm3, Form3);
- В самом начале OnCreate первой формы пишешь:
Form2:=TForm2.Create(Application);
Form3:=TForm3.Create(Application);

А можно и
Form2:=TForm2.Create(Nil);
Form3:=TForm3.Create(Nil);

Таким образом, у тебя формы будут созданы все еще после первой, но
до обращения к ним твоих процедур.

3.Но, откровенно гороря, идея с автоматическим созданием игрового поля
сразу при загрузке мне не очень нравится. Поэтому :))  и работало это
плохо у тебя сначала.

4.
ShellExecute(h27,"open","C:\saper.doc","","C:\",SW_SHOWDEFAULT);
А почему у тебя все привязано к абсолытным путям то ?
Не надо так делать, скопируй все файлы в папку с игрой ( или ее подпапки)
и используй отновительные пути к файлам.

5.
Обзови формы как -нибудь иначе. Если будешь мутить крытую игруху,
потом могут возникнуть проблумы с именами.

6. Убей твои константы.
Пусть юзер выбирает эти параметры сам.

7. Разделайся с поганым forward.
Либо забей все процедуры в класс формы,
либо создай отдельный юнит для движка игры, и там их в разделе interface опиши.

8. Статус сделай не Int, а множество, например
TStatus=(gsBegin,gsResult,gsGame);
От путаницы застрахуешься.

9.
"k:=k+1;"     =:=        "Inc(K);"

10.
Нарисуй вначале один раз мину на Bitmap"е. (У него тоже есть Canvas).
Потом выводиуже сам рисунок.
Это ускорит многократно работу.
Так же и с остальными картинками.

11.
 if Pole[row-1,col-1] = 9 then k := k + 1;
 if Pole[row-1,col]   = 9 then k := k + 1;
 if Pole[row-1,col+1] = 9 then k := k + 1;
 if Pole[row,col-1]   = 9 then k := k + 1;
 if Pole[row,col+1]   = 9 then k := k + 1;
 if Pole[row+1,col-1] = 9 then k := k + 1;
 if Pole[row+1,col]   = 9 then k := k + 1;
 if Pole[row+1,col+1] = 9 then k := k + 1;
Создай еще два цикла.
Кстати о птичках, а как же все точки по периметру, ты их то что забыл ??

12.
В Form1.OnCrate есть код:
  Form1.ClientHeight := H*MR + 1;
  Form1.ClientWidth := W*MC + 1;
А можно просто
ClientHeight := H*MR + 1;
ClientWidth := W*MC + 1;
так как сидим в одном классе.

13. Canvas !!!

14. Блин, откуда такая прилежность в комментах и формате.
Мне бы такую :)).


 
lstalkerl ©   (2006-05-25 04:54) [2]

Эх....стыдно мне (((


> Спасибо за комментарии кстати! Первый раз вижу комменты
> в таком количестве на русском!



>  Блин, откуда такая прилежность в комментах и формате.


Скажу всю правду)) Делал я Сапера не сам(( С нета скачал, просто мне курсач завтра сдавать, и времени вообще нет самому писать. Просто решил немного доработать программу, если бы сам делал, то многое бы изменил...


> 3.Но, откровенно гороря, идея с автоматическим созданием
> игрового поля
> сразу при загрузке мне не очень нравится.


Угу, незнаю зачем так придумали ...


> 4.
> ShellExecute(h27,"open","C:\saper.doc","","C:\",SW_SHOWDEFAULT);
>
> А почему у тебя все привязано к абсолытным путям то ?
> Не надо так делать, скопируй все файлы в папку с игрой (
> или ее подпапки)
> и используй отновительные пути к файлам.


Не подскажешь как относительные пути сделать? А то с делфи всего 3-4 дня работаю, и то чето получаеться, потому что Паскаль более менее знаю...


> 7. Разделайся с поганым forward.
> Либо забей все процедуры в класс формы,


Я даже представления не имею что такое форвард, пытался найти в учебнике по 7 делфи, не нашел(( Кратко не расскажешь? И как забить процедуры в класс формы?


> 10.
> Нарисуй вначале один раз мину на Bitmap"е. (У него тоже
> есть Canvas).
> Потом выводиуже сам рисунок.
> Это ускорит многократно работу.


Попробую сделать, мне самому не нравиться, что по точкам все рисуеться.


> 11.
>  if Pole[row-1,col-1] = 9 then k := k + 1;
>  if Pole[row-1,col]   = 9 then k := k + 1;
>  if Pole[row-1,col+1] = 9 then k := k + 1;
>  if Pole[row,col-1]   = 9 then k := k + 1;
>  if Pole[row,col+1]   = 9 then k := k + 1;
>  if Pole[row+1,col-1] = 9 then k := k + 1;
>  if Pole[row+1,col]   = 9 then k := k + 1;
>  if Pole[row+1,col+1] = 9 then k := k + 1;
> Создай еще два цикла.
> Кстати о птичках, а как же все точки по периметру, ты их
> то что забыл ??


А зачем еще циклы? А какие точки по периметру? Туплю просто...2 сутки не сплю((


 
lstalkerl ©   (2006-05-25 04:59) [3]

Кстати, ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ ! ! ! !

з.ы. Кстати, если вдруг нужна помощь в 3д, обращайся ;) В нем я побольше разбираюсь, чем в Делфи))


 
lstalkerl ©   (2006-05-25 06:27) [4]

Попробывал сделать так как ты сказал, все, теперь формы создаються до запуска процедур. Но я немогу задать кол-во мин, ведь после запуска программы запускаеться процедура NewGame, и расставляет мины на поле, и когда я выбираю кол-во мин в опциях, то процедура еще раз не выполняеться, и мин остаеться столько, сколько стоит по умолчанию. Как можно сделать так, чобы после выполнения процедуры из 3 формы, выполнялась процедура из 1 формы?


 
lstalkerl ©   (2006-05-25 06:50) [5]

Все, усе работает)) Просто ступил...Надо было убрать NewGame из OnCreate.
Но вопрос по 4 , 7 и 11 пункту из 2 поста, так и остался.


 
lstalkerl ©   (2006-05-25 07:16) [6]

Еще вопрос. Когда запускаеться игра, мне надо, чтобы вместо поля, была Label с надписью, я сделал так

procedure TForm1.Form1Create(Sender: TObject);
var
 row,col : integer;
begin
  label1.Enabled:=true;
  label1.visible:=true;
  NM1:=10;


Т.е после запуска у меня, вместо игрового поля, Label с надписью САПЕР.Потом после нажатия Новая игра, действие передается процедуре NewGame. Как сделать, что нада в этой процедуре написать, чтобы это поле исчезло? Я пробывал так

procedure NewGame();

  var
    row,col : integer;
    n : integer;      
    k : integer;      
  begin
    label1.Enabled:=false;
    label1.visible:=false;


Но, вылазиет ошибка, как нада обьявить в NewGame label, чтобы он его рассматривал не как переменную, а как поле, т.е. работал бы с ним как в процедуре procedure TForm1.Form1Create


 
Mortem ©   (2006-05-25 08:04) [7]

Form1.label1.visible := False;

Про пути:
Я обычно делаю следующим образом:
1. Создаём строковую переменную dirRoot.
2. В OnCreate основной формы пишем
dirRoot := ExtractFileDir(ParamStr(0));
3. Ну и применяем
ShellExecute(h27, "open", dirRoot+"saper.doc", "", dirRoot, SW_SHOWDEFAULT);
При этом "saper.doc" должен лежать в директории с твоей программой.


 
Rial ©   (2006-05-25 14:48) [8]

I.
Если, кочечно, сегодня тебе сдавать, то я опоздал (спать приходится иногда, бли н!). Но все же.

Пример:
Было
procedure MyProc(...);forward;
begin
...
end;

Делаем:
1)
Type
...
  TForm1=Class(Form)
  ....
  public
    procedure MyProc(..);
...
end;

....
implementation
...
procedure TForm1.MyProc(..);
begin
...
end;

2)
Создаем новый юнит
Unit MyUnit;
interface
procedure MYProc(..);

...
implementation
...
procedure MyProc(...);forward;
begin
...
end;

Не забыдь в модуле формы "Unit1.pas" указать в Uses модуль MyUnit.

II.
 if Pole[row-1,col-1] = 9 then k := k + 1;
if Pole[row-1,col]   = 9 then k := k + 1;
if Pole[row-1,col+1] = 9 then k := k + 1;
if Pole[row,col-1]   = 9 then k := k + 1;
if Pole[row,col+1]   = 9 then k := k + 1;
if Pole[row+1,col-1] = 9 then k := k + 1;
if Pole[row+1,col]   = 9 then k := k + 1;
if Pole[row+1,col+1] = 9 then k := k + 1;

Замени на
Var ...
  K,L:Int;
begin
...
for k:=row-1 do row+1 do
for l:=col-1 do col+1 do
 if (pole[k,l]=9)then inc(k);
...
end;

А вот по поводу точек по периметру разберь сам.
Суть в следующем: для всех точек из
[1..rowcount][1..colcount] у тебя счетается кол-во мин.
А как же 0-й (MR+1)-й столбцы, и 0-й и (MC+1)-й строки ?
Там, насколько я понял, гуляет ветер...

Нужно что - то наподобие этого:
row:=0;
While (row<=mr+1)do begin
col:=0;
While (col<=mc+1)do begin
 for k:=row-1 do row+1 do
  for l:=col-1 do col+1 do
   if (k>=0)and(K<=mr+1)and
      (l>=0)and(l<=mc+1)and
      (pole[k,l]=9)then inc(k);
 col:=col+mc+1;
end;//while col
row:=row+mr+1;
end;/*while row

Не оптимально, но работать будет.


 
Rial ©   (2006-05-25 14:48) [9]

Сори, тег забыл закрыть ....


 
Rial ©   (2006-05-25 14:56) [10]

Чем именно ты занимаешься в 3d ?
В принципе, я бы не отказался от помощи дизайнера или от неплохой озвучки для игры.



Страницы: 1 вся ветка

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.036 c
2-1175254920
Alex_C
2007-03-30 15:42
2007.04.22
При FreeLibrary( hDLL ) основное окно проги пропадает


15-1174899957
db2admin
2007-03-26 13:05
2007.04.22
Где достать информацию по IntelliJ Idea на русском?


2-1175156081
Shpux
2007-03-29 12:14
2007.04.22
Имя поля с пробелом


15-1175142761
Novice
2007-03-29 08:32
2007.04.22
Работа с FS (FAT16, FAT32, NTFS x.x)


4-1164636377
Creative
2006-11-27 17:06
2007.04.22
есть ли разница между onKeyUp и onKeyPress?