2011-01-23 4 views
2

Я хочу, когда будет создан Tform2, тогда покажите сообщение пользователю. Я использую этот код, но не работаю хорошо.Показать сообщение, когда Tform2 создан?

procedure TForm1.Button1Click(Sender: TObject); 
var 
    a:TForm2; 
begin 

if a=nil then 
begin 
    a := TForm2.Create(Self); 
    a.Show; 
end 
else 
begin 
    showmessage('TForm2 is created'); 
end; 

end; 
+0

Он вообще не работает, yuo проверяет Random (High (LongWord)) = 0. Кроме того, логика с ShowMessage встречается. –

+2

критический комментарий червя относится к тому факту, что вы тестируете неинициализированную локальную переменную и ее значение не определено. Жаль, что червь сказал это таким бесполезным образом. –

+0

@GolezTrol: почему? – User

ответ

10

Это потому, что вы объявляете a в качестве локальной переменной. Каждый раз, когда вы вводите TForm1.Button1Click, эта переменная будет совершенно новой и неинициализированной, хотя может быть и Form2. Это означает, что проверка на нуль даже не будет работать.

Вы должны либо: (? Вы основная форма)

  • Сделать a глобальные (как Form2 глобальные вы получаете, когда вы сначала создать форму)
  • Сделать a части декларации Form1 или datamodule другого класса, который живет во всей вашей программе.
  • Не используйте переменную вообще, но отметьте Screen.Forms, чтобы узнать, есть ли у вас Form2.

[править]

Как это:

var 
    i: Integer; 
begin 
    // Check 
    for i := 0 to Screen.FormCount - 1 do 
    begin 
    // Could use the 'is' operator too, but this checks the exact class instead 
    // of descendants as well. And opposed to ClassNameIs, it will force you 
    // to change the name here too if you decide to rename TForm2 to a more 
    // useful name. 
    if Screen.Forms[i].ClassType = TForm2 then 
    begin 
     ShowMessage('Form2 already exists'); 
     Exit; 
    end; 
    end; 

    // Create and show. 
    TForm2.Create(Self).Show; 
end; 
+0

Хотя образец кода работает, могу ли я предположить, что вы никогда не должны писать такой код. другая альтернатива, глобальная намного лучше. –

+0

Я думаю, что лучший вариант - это центральный класс контроллера приложений, который используется как один сингл, который управляет этим материалом для вас, но я думаю, что это может быть слишком сложным для OP на данный момент. Я думаю, что вы должны максимально ограничить использование в качестве глобалов, но, возможно, вам стоит объяснить, почему вы должны «никогда» не писать такой код и почему глобальный лучше? – GolezTrol

0

Самое простое решение вашей проблемы является использование глобальной переменной вместо локальной переменной или сделать переменная поля (переменная экземпляра) в вашем классе.

Глобальная переменная типа TForm2 инициализируется автоматически до нуля, но, как вы узнали выше, локальная переменная, которая находится на чем-то, называемом «стек», не является.

Вы должны прочитать и узнать о локальных и глобальных областях переменных, а также о том, что такое стек и куча. Это общие понятия, которые применяются практически на любом языке программирования, который не полностью «управляется». Другими словами, вы должны думать об этом в C и C++, а также в Pascal.

Такие вещи (неинициализированные локальные переменные и нарушения доступа) - это то, что некоторые языки (C# и java) в какой-то мере защищают вас.

 Смежные вопросы

  • Нет связанных вопросов^_^