ОБСУЖДЕНИЕ

Не компилируется OnFormCreate

19 ответов 12,3 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Люди, почему не компилируется программа во вложении? (в справочниках ответов не нашёл)
И вообще почёму такой код может выполняться в процедуре onFormCreate, а в основном тексте после begin'а не выполняется? Почему в основном коде программы надо писать form1.button1..., а в процедурах можно сразу button1 без form1? Требую немного объяснений, я здесь чайник...причём чугунный...совсем :)
 

Вложения

  • 2.rar
    2.rar
    3,3 КБ · Просмотры: 283
Для: Vadik®
Ознакомьтесь с п.2.6 правил. Последнее устное предупреждение
 
согласен, что-то с названием темы я перемудрил :( . Но может всё-таки кто-нибудь скажет почёму не идёт код из вложения в #1.
 
Да.
 
Unit - суть модуль
.
Похоже до меня начинает доходить. Код модулей выполняется реньше ж чем код самой проги? Тогда выходит я пытаюсь изменить надпись на кнопке, которой ещё не существует, правильно я понял? И нужный мне код надо вставлять после application.createform, так как после application.run мой код уже почему-то не выполняеться.

или писать где-то в модуле begin with TButton.Create(Self) do begin parent:=form1... типа того?
 
Насчёт Self я знаю только что это переводиться как "сам". И ещё в самоучителе видел код, который написал выше. Более конкретно про self я не знаю.
 
Для: sax_ol.
Спасибо за проявленное терпение. Теперь у меня заработала прога. :) :D :( :D :)
 
<!--QuoteBegin-Vadik®+18:12:2007, 11:43 -->
<span class="vbquote">(Vadik® @ 18:12:2007, 11:43 )</span><!--QuoteEBegin-->Спасибо за проявленное терпение.
[snapback]90313" rel="nofollow" target="_blank[/snapback]​
[/quote]
Вообще-то, на форуме принято благодарить повышением репутации
 
Хотя нет, вот ещё кажется последний вопросик для полноты знаний:
Пусть у меня есть на форме Button1 и WebBrowser1. Я хочу сделать так, чтобы когда приложение полностю запустится, то есть оно будет выглядеть так, как после выполнения
Код:
Application.Initialize;
application.createform(TForm, Form1);
application.run;
. То есть окно с приложением можно было сворачивать, перемещать и т.д. Значит, когда приложение запустится, оно подождало 5 секунд и открыло страницу Яндекса(ну или форума codeby, кому как удобно). Так вот. А если человек кликнет по кнопке button1, то надо, что бы обработчик выполнялся после начала открытия яндекса.Если написать такой код:
Код:
uses forms, sysutils....
application.createform(TForm, Form1);
sleep(5000);
form1.webbrowser1.navigate('http://www.yandex.ru');
application.run;
то в таком случае человек не видит форму.
Если написать:
Код:
uses forms, sysutils....
application.createform(TForm, Form1);
form1.show;
sleep(5000);
form1.webbrowser1.navigate('http://www.yandex.ru');
application.run;
то в таком случае форма видна, зато на месте button1 стоит какая-то белая область(видимо, кнопка ещё не создана).
Ещё раз повторю, если плохо написал, что должна делать прога.
1. Запуститься.
2. Пождать 5 сек.
3. Открыть яндекс.
4. Выполнять команды пользователя. Если пользователь кликнул по кнопке в то время, пока приложение ждало 5 секунд, то код всё равно будет выполняться, но только после начала загрузки страницы. То есть всё это должно быть в 1 потоке.
 
Код:
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
webbrowser1.Navigate('http://www.yandex.ru/');
end;

end.
Так? Я так понял, что загрузка формы - это её создание. Более подходящего события я не нашёл. Если я правильно сделал, то что надо делать дальше?
 
OnDocumentComplete, OnNavigateComplete2 эти?
 
Наверно, вот наилучший пример объяснить то, чего я хочу.
Посмотреть вложение hLaPEx.rar
Суть не в самой программе, которая взламывает линейку. Нет, не в этом. Просто когда запускаешь прогу, то ты можешь свободно кликать по счётчику от майла, даже в то время пока идут секунды на кнопке. Мне нужен код проги, запуская которую у меня на кнопке будет отсчёт в секундах с 9 до 0 и компонент веббраузер с загружаемым яндексом.
Я пытался сделать что-то вроде
Код:
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
begin
for i:=9 DownTo 1 Do
begin
button1.Caption:=IntToStr(i);
sleep(1000)
end;
end;

end.
, но форма появлялась только после того как на кнопке появится 1. В общем за готовый исходник нужной мне проги +1 обеспечено.
 
Ладно, на этом пока остановимся. Я обсуждать эту тему смогу только после изучения TTimer'а. Постараюсь побыстрее.
 
Всё, я нашёл ответ и на этот вопрос:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
button1.Caption:=IntToStr(StrToInt(button1.Caption)-1);
if button1.Caption='0' then timer1.Enabled:=False;
end;
. Единственное, что мне не нравится вообще в делфи (или вообще во всех языках, хотя может я и не прав), что на событие онформкреате операторы процедуры выполняются, но пользователь не может наблюдать за этим. О чём свидетельствует уже не полюбившийся мне sleep. То есть штука
Код:
procedure ....form1create
begin
button1.caption:='ok';
sleep(5000);
end;
. Пользователь не видит форму пока не выполнится слип на 5 сек. А мне охота добится того, чтобы текст на кнопке изменялся в процессе выполнения приложения, не опираясь ни на какие события. То есть появляеться форма, кнопка с надписью "button1" и тут же на ней надпись меняется на "ok". Согласен, на существующих машинах человек не заметит ту долю секунды, когда это выполняется. Чтобы лучше описать вопрос, сравню это с консольным приложением. Пусть дан код
Код:
program project1;
uses
SysUtils;

{$APPTYPE CONSOLE}

var
st : string;
begin
write('st=');
readln(st);
end.
1. Вот в этом коде появляеться чёрненькое окошко. Это я сравниваю с появлением формы, то есть форма видима пользователем.
2. Окно поначалу пусто. Сравниваю с "кнопка имеет надпись "button1"".
3. Печатаеться "st=". Сравниваю с изменением надписи на "ok".
4. Ждёться считывание строки. Сравниваю с "Приложение работает".
Но почему то у меня всегда выходит так, что если сравнивать мой код с консольным приложением, то выходит:
3. печатаеться строка st=
1. ПОТОМ ПОЯВЛЯЕТСЯ само чёрненькое окно
4. Потом считывается строка.
А второго пункта вообще нету. Как-то нелогично.
 
Код:
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);

form1.Button1.Caption:='ok';//До запуска и не событие

Application.Run;
end.
 
Тема с бессмысленным названием до сих пор обсуждаеться! Я уже нарисовал то, что мне надо. Только не могу реализовать. Помогите, кто может сделать.
 

Вложения

<!--QuoteBegin-Vadik®+2:01:2008, 12:32 -->
<span class="vbquote">(Vadik® @ 2:01:2008, 12:32 )</span><!--QuoteEBegin-->Тема с бессмысленным названием до сих пор обсуждаеться!
[snapback]92028" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ты ж её так сам и назвал
 
Да ладно, одарю. Только сколько?
 
Наконец-то! Различными комбинациями я добился своего! :D :D :) :)
Здесь всё, как я хотел!
Код:
program Project1;

uses
Forms, SysUtils,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Form1.Show;
Application.ProcessMessages;
Sleep(5000);
Form1.Button1.Caption:='ok';
Application.Run;
end.
В принципе, да, это код Чернобыля, просто
Код:
Form1.Show;
Application.ProcessMessages;
Sleep(5000);
делает наглядность для пользователя!
Всё, тему можно закрывать!
 
<!--QuoteBegin-Vadik®+3:01:2008, 11:53 -->
<span class="vbquote">(Vadik® @ 3:01:2008, 11:53 )</span><!--QuoteEBegin-->Всё, тему можно закрывать!
[snapback]92119" rel="nofollow" target="_blank[/snapback]​
[/quote]
да не вопрос

мои позддравления
 
Статус
Закрыто для дальнейших ответов.