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

Вниз

Обращение к переменной из другой формы   Найти похожие ветки 

 
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.


А это текст процедуры NewGame

procedure 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.056 c
2-1148269241
Raf
2006-05-22 07:40
2006.06.11
ACCESS


2-1148533266
Tempora
2006-05-25 09:01
2006.06.11
Вопрос по стандартному компоненту TrayIcon


9-1130503651
Булат Шакиров
2005-10-28 16:47
2006.06.11
Решил попробовать UnDelphiX. При установке на Delphi 7 дает ошибк


2-1148826063
Мурзилка
2006-05-28 18:21
2006.06.11
косяк с дэлфи


4-1142502339
balepa
2006-03-16 12:45
2006.06.11
Обмен данными между процессами