Форум: "Начинающим";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];
ВнизОбращение к переменной из другой формы Найти похожие ветки
← →
lstalkerl © (2006-05-25 01:23) [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
З.Ы. Просьба, кто возьметься помочь, не просто скинуть рабочую версию, а еще обьяснить, что изменили(добавили, удалили) и почему было не правильно, т.е. тыкнуть где была ошибка.
← →
Asail (2006-05-25 01:30) [1]Делай примерно так:
В модуле первой формы:unit Unit1;
interface
type
TForm1 = class(TForm)
...
end;
var
Form1 : TForm1;
NM : Integer;
А в модуле 2-ой:unit Unit2;
uses Unit1;
после чего можешь обращаться из 2-й формы к переменной так: Unit1.NM:=10;
Ежели я вопрос правильно понял :-)
← →
lstalkerl © (2006-05-25 02:03) [2]Неа....че то не работает(((
вот текст 3 формы
unit Unit3;
interface
uses
...
type
TForm3 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses SAPER_1;
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
var
z1:integer;
begin
saper_1.NM1 := StrToInt(Edit1.Text); form3.close;
end;
end.
А это текст процедуры NewGameprocedure NewGame();
var
row,col : integer;
n : integer; // кол-во поставленных мин
k : integer;
begin
NM1:=12;
for row :=1 to MR do
for col :=1 to MC do
Pole[row,col] := 0;
Randomize();
n := 0; // êîë-âî ìèí
repeat
row := Random(MR) + 1;
col := Random(MC) + 1;
if ( Pole[row,col] <> 9) then
begin
Pole[row,col] := 9;
n := n+1;
end;
until ( n = NM1 );
for row := 1 to MR do
for col := 1 to MC do
if ( Pole[row,col] <> 9 ) then
begin
k :=0 ;
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;
Pole[row,col] := k;
end;
status := 0;
nMin := 0;
nFlag := 0;
end;
Procedure Mina(Canvas : TCanvas; x, y : integer);
begin
with Canvas do
begin
Brush.Color := clGreen;
Pen.Color := clBlack;
Rectangle(x+16,y+26,x+24,y+30);
Rectangle(x+8,y+30,x+16,y+34);
Rectangle(x+24,y+30,x+32,y+34);
Pie(x+6,y+28,x+34,y+44,x+34,y+36,x+6,y+36);
MoveTo(x+12,y+32); LineTo(x+26,y+32);
MoveTo(x+8,y+36); LineTo(x+32,y+36);
MoveTo(x+20,y+22); LineTo(x+20,y+26);
MoveTo(x+8, y+30); LineTo(x+6,y+28);
MoveTo(x+32,y+30); LineTo(x+34,y+28);
end;
end;
Теперь ошибка не выскакивает, но получаеться так, что кол-во мин
← →
lstalkerl © (2006-05-25 02:08) [3]упс, не дописал ))
...что количество мин всегда получаеться равным 12...
Хотя подозрение на то, что сначала то выполняеться NewGame, а потом уж тока вводиться кол-во мин, а в NewGame, то уже задано 12, и после того, когда я задаю новое кол-во, NewGame больше не выполняеться.......хе......мож в этом ошибка.....не подскажешь как сделать, чтобы после того как выполниться процедура отвечающая за кол-во мин, выполнялась NewGame из первой формы?
← →
Джо © (2006-05-25 02:11) [4]> Хотя подозрение на то, что сначала то выполняеться NewGame,
> а потом уж тока вводиться кол-во мин
Отладчик на что даден в пытливые руки? ;)
← →
Asail (2006-05-25 02:18) [5]
> procedure NewGame();
>
> var
> row,col : integer;
> n : integer; // кол-во поставленных мин
> k : integer;
> begin
> NM1:=12;
Ну, и чему должно равнятся NM1? Как по-твоему?
← →
lstalkerl © (2006-05-25 02:31) [6]Я то в Делфи не особо разбираюсь(( Нада просто до завтра это все сделать, завтра курсач сдавать уже, а времени читать учебник нет((( Вот надеюсь на чью-нить помощь.
> Отладчик на что даден в пытливые руки? ;)
Не знаю че такое отладчик...
> Ну, и чему должно равнятся NM1? Как по-твоему?
Конечно 12...Но вот мне нада к-нить сделать, чтоб он брал значение NM1 из второй формы. Если удалить ету строку, то прога не компилируеться, понятно, что у NM сначала работы программы не будет никакого значения. По.тому и поставил NM1:=12; . Мне надо вот че сделать, ведь NewGame заполняет минами игровое поле, но дело в том, что она выполняеться самой первой, и поэтому любое значение данное NM1 во второй форме игнорируеться. Как бы сделать так, чтобы когда вводишь кол-во мин, во второй форме, после нажатия на кнопку NewGame выполнялось еще раз? Думаю если переписать все процедуры из первой, во вторую форму то может и будет работать, но за такой код меня препод убьет((( Нада сделать к-нить, чтобы процедура из 2 формы, после нажатия на кнопку, вызывала процедуру из 1 формы NewGame, думаю тогда будет все работать. Но на всякий случа, мало ли какие ещепараметры могут повлиять, скачайте плиз исходник, ссылка в 1 посте.
← →
Плохиш © (2006-05-25 02:44) [7]
> lstalkerl © (25.05.06 02:31) [6]
> Я то в Делфи не особо разбираюсь(( Нада просто до завтра
> это все сделать, завтра курсач сдавать уже, а времени читать
> учебник нет
Не сдашь курсач. Вылетишь из института. Пойдёшь служить. Что там президент в последнем послании про пушечное мясо говорил?
← →
lstalkerl © (2006-05-25 02:49) [8]To Плохишь
Ты бы лучше помог, чем напоминать мне об отчислении. ;)
← →
Плохиш © (2006-05-25 02:56) [9]
> Ты бы лучше помог
У меня есть выбор, помочь тебе (учитывая, что "Я то в Делфи не особо разбираюсь") или пойти спокойно спать.
← →
lstalkerl © (2006-05-25 02:58) [10]to Плохишь
> не особо разбираюсь
Если можешь, помоги, если нет , то лучше иди спать...
← →
lstalkerl © (2006-05-25 03:52) [11]хм...или нет никого, или никто отвечать не хочет....ну ладна..
Тут такой еще вопрос. Нада было сделать к проге файл справки, не стал долго мучаться, чего то там выдумывать, сделал так. Подключил модуль shellapi на онклик ShellExecute(h,"open","C:\saper.doc","","C:\",SW_SHOWDEFAULT) Теперь вопрос. Делал я это не сам, мне знакомый подсказал как сделать ссылку на документ, чтоб он открылся в стандартном приложении, так вот знакомый из аськи вышел, а я не догадался спросить, как сделать так, чтобы он открывал doc из того места, где лежит EXEшник, т.е. положил ЕХЕ в любое место, нажал справку, а он его открыл.
← →
lstalkerl © (2006-05-25 06:48) [12]Кто помог, спасибо, уже со все разобрался.
← →
lstalkerl © (2006-05-25 07:18) [13]Еще вопрос. Когда запускаеться игра, мне надо, чтобы вместо поля, была 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
← →
Elen © (2006-05-25 07:43) [14]
> lstalkerl ©
NewGame в каком модуле? в том где форма или нет? если нет то пишиform1.label1.visible:=false
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.011 c