![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
||||
|
||||
|
Не должно быть никаких ограничений. А какие проблемы?
|
|
#17
|
|||
|
|||
|
Извините за беспокойство!) Это был глюк моей дельфи.
Но вопрос остался открытым: А вообще существуют более удобные способы связать всю программу воедино (за исключением hide-show)? Например объединить два-три проекта под общей оболочкой, как подпрограммы? |
|
#18
|
|||
|
|||
|
В Delphi для этого есть Project group. Он создается когда вы создаете свой проект, просто обычно группа состоит из одного проекта :-)
По-поводу связки форм, не проще использовать PageControl? |
|
#19
|
|||
|
|||
|
Можно немножко поподробнее о PageControl?
|
|
#20
|
|||
|
|||
|
Компонент PageControl (Закладка Win32).
Компонент имеет в себе набор страниц (TabSheet), на которых собственно можете размещать содержимое, которое вы размещали на формах. Переключение производится либо в виде закладок, либо программно. Практически любой стандартный Windows-визард создан с помощью его. Есго также можете увидет в свойствах экрана (закладки наверху). Наименования закладок можно скрыть(TabSheet1.TabVisible), тогда придется переключатся с помощью: 1. PageControl.ActivePageIndex (индексы естественно начинаются с 0) 2. PageControl.ActivePage := TabSheet1; 3. PageControl.Pages[0].TabVisible := true; Вообщем компонент стандартный начиная с Win95 (в Win 3.0 тоже был :-) но назывался по другому) поэтому доступен и через WinAPI. В целом это контейнер содержащий в себе диалоговые окна. |
|
#21
|
|||
|
|||
|
А еще есть такая вещь как MDI интерфейс
![]() Читайте сейчас в любом учебнике по Delphi! |
|
#22
|
|||
|
|||
|
Всем большое спасибо за оперативные и правильные советы! :-)
Разрешите задать Вам вопрос. Есть две связанных формы Form1 и Form2 ( то есть, на form1 есть Button1, открывающая Form2). На Form2 расположена Button2. Как сделать так, чтобы при нажатии на Button2 заново выполнялась программа, написанная в Form2? я сделала так: Код HTML:
|
|
#23
|
|||
|
|||
|
Смотря в какой процедуре Form2 эта программа написана.
Для Вашего случая можно записать код в событие формы Form2 OnActivate |
|
#24
|
|||
|
|||
|
про такую процедуру слышала, но, как её применять, к сожалению, не знаю.
Прилагаю проект. Прямо по процедурам сказать вряд ли что смогу, так как на Дельфи работаю не больше месяца, и программа не мной написана. Не подскажите, как тут можно организовать повторный запуск? Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Hide;
form2.show;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Tabs, Buttons, OleServer, StdCtrls,
ComCtrls, ExtCtrls, jpeg;
type
TForm2 = class(TForm)
Panel3: TPanel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Button1: TButton;
Label2: TLabel;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
ttst=record
ask:string;
one:string;
two:string;
three:string;
ans:integer;
subject:string;
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
const
max=5;
var
bal:integer;
TstWord,Tst:array[1..max] of ttst;
countY,countN:integer;
countT:integer;
indx:array[1..max]of integer;
mas:array[1..max]of string;
i:integer;
procedure CreateIndx; // задаем случайным образом вывод вопросов
var
rnd1,rnd2,i,z:integer;
begin
randomize;
for i:=1 to max do
Indx[i]:=i;
i:=1000000;
while 0<i do begin
rnd1:=random(max-1)+1;
rnd2:=random(max-1)+1;
z:=Indx[rnd1];
Indx[rnd1]:=Indx[rnd2];
Indx[rnd2]:=z;
dec(i);
end;
end;
procedure CreateTestWord;
begin
with TSTword[1] do begin
ask:='При растяжении';
one:='85';
two:='85,045';
three:='85,988';
ans:=1;
end;
with tstword[2] do begin
ask:='При растяжении в';
one:='85,00074879';
two:='85,04532314 ';
three:='85,09030112';
ans:=2;
end;
with tstword[3] do begin
ask:='При растяже';
one:='85,00074879';
two:='85,04532314 ';
three:='85,09030112';
ans:=3;
end;
with tstword[4] do begin
ask:='При растяжении волокн';
one:='85,00074879';
two:='85,04532314 ';
three:='85,09030112';
ans:=3;
end;
with tstword[5] do begin
ask:='При растяжении волокна с n';
one:='85,00074879';
two:='85,04532314 ';
three:='85,09030112';
ans:=3;
end;
end;
procedure PrintAsk(i:integer);
begin
with form2 do begin
Memo1.Text:='Задача: '+Tst[i].Ask;
RadioButton1.Caption:=Tst[i].one;
RadioButton2.Caption:=Tst[i].Two;
RadioButton3.Caption:=Tst[i].three;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
form2.Color:=rgb(236,233,216);
bal:=0;
CountY:=0;
CountN:=0;
CountT:=1;
i:=1;
CreateIndx;
CreateTestWord;
Tst:=TstWord;
PrintAsk(Indx[CountT]);
label2.caption:='Задача 1';
end;
procedure TForm2.Button1Click(Sender: TObject);
var
mark:string;
function FindMas(A:string):boolean;
var
k:integer;
begin
FindMas:=false;
for k:=1 to i do
if Mas[k]=A then begin
FindMas:=true;
break;
end;
end;
begin
with Tst[Indx[CountT]] do begin
if RadioButton1.Checked and (ans=1) then inc(CountY)
else if RadioButton2.Checked and (ans=2) then inc(CountY)
else if RadioButton3.Checked and (ans=3) then inc(CountY)
else begin
inc(CountN);
if not FindMas(subject) then begin
mas[i]:=subject;
inc(i);
end;
end;
label2.Caption:='Задача '+inttostr(CountT+1);
inc(CountT);
if countT=4 then begin
label2.Caption:='Задача 3';
button1.Enabled:=false;
bal:=1;
if CountY=3 then
begin
Button3.Show;
mark:='Отлично'; end
else if CountY>=2 then
begin
Button3.Show;
mark:='Хорошо';end
else if CountY>=1 then
begin
Button2.Show;
mark:='Удовлетворительно'; end
else begin mark:='Плохо! Решите правильно хотя бы 2 задачи';
Button2.Show;
bal:=0;
end;
showmessage('Правильно решено = '+inttostr(CountY)+#13+
'Неправильно решено = '+inttostr(CountN)+ #13+#13+
' Оценка: '+mark);
end else begin
RadioButton1.Checked:=false;
RadioButton2.Checked:=false;
RadioButton3.Checked:=false;
PrintAsk(Indx[CountT]); end;
end;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
form2.close;
form1.Show;
end;
end. |
|
#25
|
|||
|
|||
|
У вас запуск теста осуществляется в событии формы OnCreate. Лучше всего создать новую внутреннюю процедуру, и назвать напрмер TestBegin.
В эту процедуру скинуть текст кода из процедуры OnCreate. А в событии OnClick кнопки на первой форме вызывать эту процедуру (TestButton). А для начала я бы предложил весь код аккуратно пробелами выравнять. А то уж больно трудно понять что к чему. |
|
#26
|
|||
|
|||
|
MegaPiha, тут переправить пробелы не получилось, но приложила сам проект. Без OnCreate программа отказывается работать
|
|
#27
|
|||
|
|||
|
Цитата:
![]() |
|
#28
|
|||
|
|||
|
может неактуально уже, но можно же вызывать обработчик OnCreate (как и любой другой) как процедуру...
в коде кнопки что-то типа form2.OnCreate(Sender); вместо закрыть/показать |