Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
I am programmer
0 / 0 / 1
Регистрация: 03.12.2012
Сообщений: 16
1

Ошибка при открытии формы через другую

03.01.2013, 11:11. Просмотров 1269. Ответов 21
Метки нет (Все метки)

Вроде бы код нормальный, а работать не хочет. Помогите разобраться где ошибка
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
implementation
uses unit2;
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=true;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
VolumeSerialNumber : DWORD;
MaximumComponentLength : DWORD;
FileSystemFlags : DWORD;
SerialNumber : string;
HTTP:TIdHTTP;
i:integer;
Find:string; // Искомая строка
begin
try
GetVolumeInformation('C:\',  nil, 0, @VolumeSerialNumber,MaximumComponentLength, FileSystemFlags,  nil,  0);
SerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) +   '-' +
IntToHex(LoWord(VolumeSerialNumber), 4);
SerialNumber:=MD5DigestToStr(MD5String(SerialNumber));// получаю md5 строки
sedit1.Text:=(SerialNumber);
sMemo1.Lines.Add(IdHTTP1.Get('ссылка на файл'));
For i:=0 to sMemo1.Lines.Count-1 do // Запускаем цикл поиска строки
If Pos(SerialNumber, sMemo1.Lines.Text)>0   then
begin
form2.Show;
form1.Hide;
end
else
begin
form1.Height:=449;
end;
finally
  timer1.free
end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2013, 11:11
Ответы с готовыми решениями:

При открытии одной формы через другую нельзя писать в dbedit
Доброго времени суток. В общем такая ситуация. На первой форме открываю вторую,...

Ошибка при открытии формы!!!!!!!
здравствуйте!! помогите!! у меня такая проблема.. когда открываю свой проект...

Ошибка при открытии формы
Доброго времени суток! Ошибка (скрин во сложении) возникает только на...

При открытии формы через ОпенДиалог прочитать текстовый файл с числами
interface {При открытии формы через ОпенДиалог прочитать текстовый файл с...

Ошибка при переходе с одной формы на другую
Собственно выдает ету ошибку Исходники моего "Кода": unit Unit1;...

21
xNeKiToSx
330 / 83 / 16
Регистрация: 10.01.2011
Сообщений: 516
Записей в блоге: 1
03.01.2013, 11:43 2
Возможно ошибка в том, что второй формы еще не существует.
Delphi
1
2
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
т.е. создается форма 1, срабатывает
Delphi
1
2
3
4
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=true;
end;
А в таймере используется форма 2, которая не создана. варианты решения - перед обращением к форме 2 проверять существует ли она (циклом\зацикливать + Application.ProcessMessages), создавать форму 2 динамически, создавать форму 2 первой(по отношению к форме 1)
2
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
03.01.2013, 11:47 3
Ты бы сразу писал какая ошибка. Возможно ещё не успевает закончиться обработка, наступает опять прерывание таймера и всё начинается поновой. Может нужно просто запретить очередное прерывание.
1
I am programmer
0 / 0 / 1
Регистрация: 03.12.2012
Сообщений: 16
03.01.2013, 12:38  [ТС] 4
Цитата Сообщение от Одиночка Посмотреть сообщение
Ты бы сразу писал какая ошибка. Возможно ещё не успевает закончиться обработка, наступает опять прерывание таймера и всё начинается поновой. Может нужно просто запретить очередное прерывание.
Про setVisible что то пишет
Скрины:
Ошибка при открытии формы через другую

Ошибка при открытии формы через другую


Добавлено через 7 минут
Попробовал сделать так:
Ошибка при открытии формы через другую

Вторая форма появляется и следом за ней вылетает ошибка:
Ошибка при открытии формы через другую
0
FIL
Модератор
3419 / 2555 / 726
Регистрация: 19.09.2012
Сообщений: 7,923
03.01.2013, 12:46 5
Последняя ошибка говорит о том, что АнтиФриз может быть только один во всей проге.
1
I am programmer
0 / 0 / 1
Регистрация: 03.12.2012
Сообщений: 16
03.01.2013, 12:47  [ТС] 6
Цитата Сообщение от gorfil Посмотреть сообщение
Последняя ошибка говорит о том, что АнтиФриз может быть только один во всей проге.
Дело в том, что он как раз один, и находится на второй форме, а на первой его нет
0
FIL
Модератор
3419 / 2555 / 726
Регистрация: 19.09.2012
Сообщений: 7,923
03.01.2013, 12:52 7
Значит своим кодом ты создаешь Форму2 второй раз и, следовательно, еще один АнтиФриз.
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
03.01.2013, 12:52 8
Значит на этот момент форма 2 уже создана, и повторно этого делать не нужно.
0
FIL
Модератор
3419 / 2555 / 726
Регистрация: 19.09.2012
Сообщений: 7,923
03.01.2013, 12:53 9
Вообще надо всю прогу смотреть, а то так можно долко блох ловить.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26120 / 17516 / 6947
Регистрация: 22.10.2011
Сообщений: 30,854
Записей в блоге: 6
03.01.2013, 12:54 10
I am programmer, вот кто тебя научил
1) вызывать CreateForm вручную, и при этом не отключать автосоздание?
2) удалять через Free то, что тобой создано не было (я про Timer1)?
0
I am programmer
0 / 0 / 1
Регистрация: 03.12.2012
Сообщений: 16
03.01.2013, 12:59  [ТС] 11
Весь код целиком:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, sMemo, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, sSkinManager, sLabel, acProgressBar,
  sGauge, ExtCtrls, sPanel, sEdit,md5;
 
type
  TForm1 = class(TForm)
    sMemo1: TsMemo;
    sEdit1:TsEdit;
    IdHTTP1: TIdHTTP;
    sSkinManager1: TsSkinManager;
    sLabelFX4: TsLabelFX;
    sGauge1: TsGauge;
    Timer1: TTimer;
    Timer2: TTimer;
    sLabelFX2: TsLabelFX;
    sLabelFX3: TsLabelFX;
    sLabelFX5: TsLabelFX;
    sLabelFX6: TsLabelFX;
    sLabelFX7: TsLabelFX;
    sLabelFX9: TsLabelFX;
    sPanel2: TsPanel;
    sPanel3: TsPanel;
    sLabel1: TsLabel;
    sEdit2: TsEdit;
 
 
    procedure Timer1Timer(Sender: TObject);
 
    procedure FormCreate(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
uses unit2;
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
 
Application.ProcessMessages;
timer1.Enabled:=true;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
VolumeSerialNumber : DWORD;
MaximumComponentLength : DWORD;
FileSystemFlags : DWORD;
SerialNumber : string;
HTTP:TIdHTTP;
i:integer;
Find:string; // Искомая строка
begin
try
GetVolumeInformation('C:\',  nil, 0, @VolumeSerialNumber,MaximumComponentLength, FileSystemFlags,  nil,  0);
SerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) +   '-' +
IntToHex(LoWord(VolumeSerialNumber), 4);
SerialNumber:=MD5DigestToStr(MD5String(SerialNumber));// хэш строки
sedit1.Text:=(SerialNumber);
sMemo1.Lines.Add(IdHTTP1.Get('ссылка на txt файл'));
Application.ProcessMessages;
For i:=0 to sMemo1.Lines.Count-1 do // Запускаем цикл поиска строки
If Pos(SerialNumber, sMemo1.Lines.Text)>0   then
begin
Application.ProcessMessages;
Application.CreateForm(TForm2, Form2);
form1.Hide;
end
else
begin
form1.Height:=408;
end;
finally
  timer1.destroy;
end;
end;
end.
Добавлено через 55 секунд
Цитата Сообщение от UI Посмотреть сообщение
1) вызывать CreateForm вручную, и при этом не отключать автосоздание?
2) удалять через Free то, что тобой создано не было (я про Timer1)?
Я как бы начинающий в этом деле, а не ошибается тот, кто ничего не делает
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26120 / 17516 / 6947
Регистрация: 22.10.2011
Сообщений: 30,854
Записей в блоге: 6
03.01.2013, 13:00 12
Это не весь код. Нужен проект, включая DPR-файл, а не этот огрызок...

Добавлено через 35 секунд
Цитата Сообщение от I am programmer Посмотреть сообщение
Я как бы начинающий в этом деле
Как бы начинающий не лезет в процесс создания форм... Начинают - с другого...
1
FIL
Модератор
3419 / 2555 / 726
Регистрация: 19.09.2012
Сообщений: 7,923
03.01.2013, 13:07 13
В файле проекта (.dpr) измени порядок создания форм:
Delphi
1
2
3
4
5
6
begin
  Application.Initialize;
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Еще не понятно зачем тебе таймер вообще нужен. Я бы его убрал.

Добавлено через 2 минуты
и timer1.destroy; не многим лучше timer1.free;
Delphi
1
Timer1.Enabled := false;
1
I am programmer
0 / 0 / 1
Регистрация: 03.12.2012
Сообщений: 16
03.01.2013, 13:13  [ТС] 14
Цитата Сообщение от gorfil Посмотреть сообщение
В файле проекта (.dpr) измени порядок создания форм:
Delphi
1
2
3
4
5
6
begin
  Application.Initialize;
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Еще не понятно зачем тебе таймер вообще нужен. Я бы его убрал.

Добавлено через 2 минуты
и timer1.destroy; не многим лучше timer1.free;
Delphi
1
Timer1.Enabled := false;
Попробовал сделать как ты предложил, вторая форма появилась, а первая нет. Мне нужно что бы первая форма сначала появлялась, и если выполнялось условие (if pos serialNumber>0) то показывалась вторая.
Вот, гляньте исходник и поймете http://rghost.ru/42698689
0
FIL
Модератор
3419 / 2555 / 726
Регистрация: 19.09.2012
Сообщений: 7,923
03.01.2013, 13:45 15
Тогда из .dpr строку убери:
Delphi
1
Application.CreateForm(TForm2, Form2);
а в таймер добавь:
Delphi
1
2
3
  Application.CreateForm(TForm2, Form2);
  Hide;
  Form2.Show;
Но надо проконтролировать, чтобы Ф2 создавалась лишь один раз, т.к. у тебя все это в цикле и может создасться несколько Ф2:
Delphi
1
For i:=0 to sMemo1.Lines.Count-1 do // Запускаем цикл поиска строки
1
I am programmer
0 / 0 / 1
Регистрация: 03.12.2012
Сообщений: 16
03.01.2013, 14:04  [ТС] 16
Цитата Сообщение от gorfil Посмотреть сообщение
Тогда из .dpr строку убери:
Delphi
1
Application.CreateForm(TForm2, Form2);
а в таймер добавь:
Delphi
1
2
3
  Application.CreateForm(TForm2, Form2);
  Hide;
  Form2.Show;
Но надо проконтролировать, чтобы Ф2 создавалась лишь один раз, т.к. у тебя все это в цикле и может создасться несколько Ф2:
Delphi
1
For i:=0 to sMemo1.Lines.Count-1 do // Запускаем цикл поиска строки
Спасибо. А как нибудь можно без таймера это делать? В событии onShow показывать другую форму не получается, компилятор ругается
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
03.01.2013, 14:31 17
Сделай как у тебя изначально было. Только в начале кода поставь:
Delphi
1
Timer1.Enabled:=False;
и убери:
Delphi
1
Timer1.Free;
В дизайнере поставь свойство Visible Form2 в False.
Запуск таймера поставь в Form1 OnShow.
И попробуй запустить.

Не по теме:

Чтобы увидеть ответ нужно обновлять страницу.

1
I am programmer
0 / 0 / 1
Регистрация: 03.12.2012
Сообщений: 16
03.01.2013, 14:49  [ТС] 18
Цитата Сообщение от Одиночка Посмотреть сообщение
и убери:
Код Delphi
1
Timer1.Free;
Убрал, стало ругаться на компонент антифриз (пришлось убить его), и пришлось вернуть Timer1.Free, потому что формы плодиться начинали
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
03.01.2013, 15:01 19
Я немного не подумал. Пускай запуск таймера будет в OnCreate первой формы.
Timer1.Free обязательно убери.
И обязательно поставь:
Delphi
1
Timer1.Enable:=False;
В начале кода обработки события таймера.
На таймере поставь такое время, сколько хочешь чтобы показывалась первая форма.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=true;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
VolumeSerialNumber : DWORD;
MaximumComponentLength : DWORD;
FileSystemFlags : DWORD;
SerialNumber : string;
HTTP:TIdHTTP;
i:integer;
Find:string; // Искомая строка
begin
  timer1.Enabled:=False;
try
GetVolumeInformation('C:\',  nil, 0, @VolumeSerialNumber,MaximumComponentLength, FileSystemFlags,  nil,  0);
SerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) +   '-' +
IntToHex(LoWord(VolumeSerialNumber), 4);
SerialNumber:=MD5DigestToStr(MD5String(SerialNumber));// получаю md5 строки
sedit1.Text:=(SerialNumber);
sMemo1.Lines.Add(IdHTTP1.Get('ссылка на файл'));
For i:=0 to sMemo1.Lines.Count-1 do // Запускаем цикл поиска строки
If Pos(SerialNumber, sMemo1.Lines.Text)>0   then
begin
form2.Show;
form1.Hide;
end
else
begin
form1.Height:=449;
end;
finally
end;
end;
Может у тебя опять на Антифриз ругаться стало из-за того, что использовал код в котором создание второй формы было уже в событии таймера.

Добавлено через 5 минут
Естественно, в *dpr файле восстанови строку создания второй формы.
1
FIL
Модератор
3419 / 2555 / 726
Регистрация: 19.09.2012
Сообщений: 7,923
03.01.2013, 15:08 20
Цитата Сообщение от I am programmer Посмотреть сообщение
Спасибо. А как нибудь можно без таймера это делать? В событии onShow показывать другую форму не получается, компилятор ругается
В TForm1.FormCreate из Таймера все перекинь. (Это если следовать предложенному мной варианту)
1
03.01.2013, 15:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2013, 15:08

При закрытии одной формы и переходе на другую выходит ошибка
implementation uses Unit2; {$R *.dfm} procedure...

Нужно сделать, чтобы при открытии главной формы открывалась еще одна (форма 2) сразу при появлении первой формы
я попробывал в евентс поставить онкреэйт форм 2 .шов ,программа запускается но...

Музыка через Player при открытии формы
Добрый вечер. Как сделать так, чтобы музыка(mp3) проигрывалась через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru