![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
![]() Не должно быть никаких ограничений. А какие проблемы?
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#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); вместо закрыть/показать |