Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.


А это текст процедуры 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.02 c
15-1147822853
Imbac
2006-05-17 03:40
2006.06.11
Сеть


6-1139390426
Lynx_rus
2006-02-08 12:20
2006.06.11
Выбор Dialap- соеденения


15-1146823558
Delphi basic
2006-05-05 14:05
2006.06.11
Что такое сабж?


1-1146830214
Ярослав
2006-05-05 15:56
2006.06.11
Обращение к компонентам размещенным на MDI


15-1148064518
Ten10
2006-05-19 22:48
2006.06.11
Численные методы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский