Текущий архив: 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.5 MB
Время: 0.033 c