Ĺadny brzuch
Na formie Form2 mam Button w ktorego procedurze onclick znajduje sie taki kod:
procedure TForm2.Button4Click(Sender: TObject); begin Sleep(700); Application.CreateForm(Tgame, game); game.Show; BASS_StreamFree(Uchwyt2); BASS_Stop; BASS_Free; Form2.Free; end;
natomiast na formie game rowniez jest button z taki kodem:
procedure Tgame.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2); Form2.Show; game.Free; end;
I teraz gdy klikam na tego buttona na Form2 utworzy mi sie forma game a forma Form2 zostaje zwolniona. Gdy klikam na buttona na formie game to tworzy mi sie forma Form2 a game zostaje zwolniona. Wszystko to dziala za pierwszym razem. Przy kolejnych probach utworzenia formy game wyskakuje mi blad Acces Violation. Wczesniej pojawial sie takze AbstractError ale cos nagrzebalem i juz go nie ma. Ktos wie jak to zrobic zeby wszystko bylo ok?? Dodam tylko ze glowna forma jest Form1 jesli ma to w czyms pomoc.
To może zrób tak, bo nie wiem jak działa application.createform:
Form2 := TForm2.Create(nil);
dalej nic nie dziala
dalej nic nie dziala
Bo zwalniasz formę w jej metodzie. Robiąc tak musisz jeszcze użyć jakiegoś Abort lub coś podobnego. Albo usuwać formę z poza niej.
tzn. jak?? bo wogole nie wiem o co teraz chodzi :(
tzn. jak?? bo wogole nie wiem o co teraz chodzi :( Mysle ze chodzi mu o to, ze powinienes kod Form2.Free wywalic z "procedure TForm2.Button4Click(Sender: TObject);" i wstawic go np. do zdarzenia OnShow formy tgame. Musisz oczywiscie tez zmienic kolejnosc polecen w "procedure TForm2.Button4Click(Sender: TObject);" tak aby forma pokazala sie po przygotowaniu BASSa, bo w przeciwnym razie nie bedzie grania.
Wiem juz jak to mialo wygladac ale dalej nie dziala. Teraz jest tylko tak ze blad wyskakuje przy probie stworzenia formy game przy czym proba ta jest wieksza niz 1. gdy z formy game tworze forme Form2 to wszystko jest ok
A to abort to uciekło całkiem :> ? Czytaj wszystko co się pisze...
ale w ktory momencie mam wywolac to abort?? bo mam cos takiego
procedure Tgame.Button1Click(Sender: TObject); begin Form2:=TForm2.Create(nil); Form2.Show; Abort; end;
procedure TForm2.Button4Click(Sender: TObject); begin game:=Tgame.Create(nil);; BASS_StreamFree(Uchwyt2); BASS_Stop; BASS_Free; game.Show; abort; end;
i to tez nie dziala a jak dam abort wczesniej to program nie wykonuje dalszych instrukcji w procedurze
Abort powinien przerwać wszystko. Daj _po zwolnieniu obiektu_.
Dalej nic nie dziala. Dam tutaj unity tych form bo moze blad lezy gdzies indziej
Form2
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, BASS, jpeg; type TForm2 = class(TForm) Panel1: TPanel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Label1: TLabel; Button5: TButton; tlo: TImage; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } Uchwyt2: Cardinal; public { Public declarations } end; var Form2: TForm2; implementation uses Unit1, Unit3, Unit4, Unit5; {$R *.dfm} procedure TForm2.FormCreate(Sender: TObject); var szerokosc, wysokosc: Integer; begin szerokosc:=Screen.Width; wysokosc:=Screen.Height; WindowState:=wsMaximized; BorderStyle:=bsNone; Panel1.Left:=szerokosc div 2 - Panel1.Width div 2; Panel1.Top:=wysokosc - Panel1.Height - Panel1.Height div 2; Label1.Left:=szerokosc div 2 - Label1.Width div 2; Label1.Top:=wysokosc - Label1.Height - 20; end; procedure TForm2.Button1Click(Sender: TObject); begin BASS_StreamFree(Uchwyt2); Application.Terminate; end; procedure TForm2.FormShow(Sender: TObject); begin Button5Click(self); game.Free; abort; end; procedure TForm2.Button5Click(Sender: TObject); begin if BASS_GetVersion = MAKELONG(2,1) then begin BASS_Init(1, 44100, 0, Handle, nil); BASS_Start; end else begin ShowMessage('Wymagane bass.dll w wersji 2.1!'); end; Uchwyt2 := BASS_StreamCreateFile(False, pChar('data\menu.mp3'), 0, 0, BASS_SAMPLE_LOOP); Bass_ChannelPlay(Uchwyt2, False); end; procedure TForm2.Button2Click(Sender: TObject); begin Form3.Show; Enabled:=False; end; procedure TForm2.Button3Click(Sender: TObject); begin Form4.Show; Enabled:=False; end; procedure TForm2.Button4Click(Sender: TObject); begin game:=Tgame.Create(nil);; BASS_StreamFree(Uchwyt2); BASS_Stop; BASS_Free; game.Show; end; end.
game
unit Unit5; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg; type Tgame = class(TForm) Button1: TButton; stat: TPanel; mapaprzew: TPageScroller; mapa: TImage; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var game: Tgame; implementation uses Unit2; {$R *.dfm} procedure Tgame.Button1Click(Sender: TObject); begin Form2:=TForm2.Create(nil); Form2.Show; end; procedure Tgame.FormCreate(Sender: TObject); var szerokosc, wysokosc: Integer; begin szerokosc:=Screen.Width; wysokosc:=Screen.Height; WindowState:=wsMaximized; BorderStyle:=bsNone; stat.Height:=trunc(0.22*wysokosc); mapaprzew.Left:=0; mapaprzew.Top:=0; mapaprzew.Width:=szerokosc; mapaprzew.Height:=wysokosc-stat.Height; mapa.Height:=wysokosc-stat.Height; mapa.Width:=szerokosc; end; procedure Tgame.FormShow(Sender: TObject); begin Form2.Free; abort; end; end.
Szkoda tylko, że nie wpadłeś na to, że ja pisałem odnośnie pierwszej wersji czyli z free w click...
begin formb := TFormx.create(); formb.schow(); forma.free(); abort();
Poza tym, jak zrobisz coś takiego z formą główną (tworzoną w źródle projektu) to możliwe, że program się sypnie. Ale możesz sprawdzić - a nóż zadziała...
nie przeczę, że zwalnianie instancji obiektu w jego metodzie jest wręcz genialnym pomysłem na miarę publikacji naukowej ... No ale nikt nikomu tak robić zabronić nie może.
A ktoś słyszał o czymś takim jak Close; i o Action := caFree; w OnClose Formy :>
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
procedure TForm2.Button4Click(Sender: TObject); begin Sleep(700); Application.CreateForm(Tgame, game); game.Show; BASS_StreamFree(Uchwyt2); BASS_Stop; BASS_Free; Form2.Free; end;
natomiast na formie game rowniez jest button z taki kodem:
procedure Tgame.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2); Form2.Show; game.Free; end;
I teraz gdy klikam na tego buttona na Form2 utworzy mi sie forma game a forma Form2 zostaje zwolniona. Gdy klikam na buttona na formie game to tworzy mi sie forma Form2 a game zostaje zwolniona. Wszystko to dziala za pierwszym razem. Przy kolejnych probach utworzenia formy game wyskakuje mi blad Acces Violation. Wczesniej pojawial sie takze AbstractError ale cos nagrzebalem i juz go nie ma. Ktos wie jak to zrobic zeby wszystko bylo ok?? Dodam tylko ze glowna forma jest Form1 jesli ma to w czyms pomoc.
To może zrób tak, bo nie wiem jak działa application.createform:
Form2 := TForm2.Create(nil);
dalej nic nie dziala
dalej nic nie dziala
Bo zwalniasz formę w jej metodzie. Robiąc tak musisz jeszcze użyć jakiegoś Abort lub coś podobnego. Albo usuwać formę z poza niej.
tzn. jak?? bo wogole nie wiem o co teraz chodzi :(
tzn. jak?? bo wogole nie wiem o co teraz chodzi :( Mysle ze chodzi mu o to, ze powinienes kod Form2.Free wywalic z "procedure TForm2.Button4Click(Sender: TObject);" i wstawic go np. do zdarzenia OnShow formy tgame. Musisz oczywiscie tez zmienic kolejnosc polecen w "procedure TForm2.Button4Click(Sender: TObject);" tak aby forma pokazala sie po przygotowaniu BASSa, bo w przeciwnym razie nie bedzie grania.
Wiem juz jak to mialo wygladac ale dalej nie dziala. Teraz jest tylko tak ze blad wyskakuje przy probie stworzenia formy game przy czym proba ta jest wieksza niz 1. gdy z formy game tworze forme Form2 to wszystko jest ok
A to abort to uciekło całkiem :> ? Czytaj wszystko co się pisze...
ale w ktory momencie mam wywolac to abort?? bo mam cos takiego
procedure Tgame.Button1Click(Sender: TObject); begin Form2:=TForm2.Create(nil); Form2.Show; Abort; end;
procedure TForm2.Button4Click(Sender: TObject); begin game:=Tgame.Create(nil);; BASS_StreamFree(Uchwyt2); BASS_Stop; BASS_Free; game.Show; abort; end;
i to tez nie dziala a jak dam abort wczesniej to program nie wykonuje dalszych instrukcji w procedurze
Abort powinien przerwać wszystko. Daj _po zwolnieniu obiektu_.
Dalej nic nie dziala. Dam tutaj unity tych form bo moze blad lezy gdzies indziej
Form2
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, BASS, jpeg; type TForm2 = class(TForm) Panel1: TPanel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Label1: TLabel; Button5: TButton; tlo: TImage; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } Uchwyt2: Cardinal; public { Public declarations } end; var Form2: TForm2; implementation uses Unit1, Unit3, Unit4, Unit5; {$R *.dfm} procedure TForm2.FormCreate(Sender: TObject); var szerokosc, wysokosc: Integer; begin szerokosc:=Screen.Width; wysokosc:=Screen.Height; WindowState:=wsMaximized; BorderStyle:=bsNone; Panel1.Left:=szerokosc div 2 - Panel1.Width div 2; Panel1.Top:=wysokosc - Panel1.Height - Panel1.Height div 2; Label1.Left:=szerokosc div 2 - Label1.Width div 2; Label1.Top:=wysokosc - Label1.Height - 20; end; procedure TForm2.Button1Click(Sender: TObject); begin BASS_StreamFree(Uchwyt2); Application.Terminate; end; procedure TForm2.FormShow(Sender: TObject); begin Button5Click(self); game.Free; abort; end; procedure TForm2.Button5Click(Sender: TObject); begin if BASS_GetVersion = MAKELONG(2,1) then begin BASS_Init(1, 44100, 0, Handle, nil); BASS_Start; end else begin ShowMessage('Wymagane bass.dll w wersji 2.1!'); end; Uchwyt2 := BASS_StreamCreateFile(False, pChar('data\menu.mp3'), 0, 0, BASS_SAMPLE_LOOP); Bass_ChannelPlay(Uchwyt2, False); end; procedure TForm2.Button2Click(Sender: TObject); begin Form3.Show; Enabled:=False; end; procedure TForm2.Button3Click(Sender: TObject); begin Form4.Show; Enabled:=False; end; procedure TForm2.Button4Click(Sender: TObject); begin game:=Tgame.Create(nil);; BASS_StreamFree(Uchwyt2); BASS_Stop; BASS_Free; game.Show; end; end.
game
unit Unit5; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg; type Tgame = class(TForm) Button1: TButton; stat: TPanel; mapaprzew: TPageScroller; mapa: TImage; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var game: Tgame; implementation uses Unit2; {$R *.dfm} procedure Tgame.Button1Click(Sender: TObject); begin Form2:=TForm2.Create(nil); Form2.Show; end; procedure Tgame.FormCreate(Sender: TObject); var szerokosc, wysokosc: Integer; begin szerokosc:=Screen.Width; wysokosc:=Screen.Height; WindowState:=wsMaximized; BorderStyle:=bsNone; stat.Height:=trunc(0.22*wysokosc); mapaprzew.Left:=0; mapaprzew.Top:=0; mapaprzew.Width:=szerokosc; mapaprzew.Height:=wysokosc-stat.Height; mapa.Height:=wysokosc-stat.Height; mapa.Width:=szerokosc; end; procedure Tgame.FormShow(Sender: TObject); begin Form2.Free; abort; end; end.
Szkoda tylko, że nie wpadłeś na to, że ja pisałem odnośnie pierwszej wersji czyli z free w click...
begin formb := TFormx.create(); formb.schow(); forma.free(); abort();
Poza tym, jak zrobisz coś takiego z formą główną (tworzoną w źródle projektu) to możliwe, że program się sypnie. Ale możesz sprawdzić - a nóż zadziała...
nie przeczę, że zwalnianie instancji obiektu w jego metodzie jest wręcz genialnym pomysłem na miarę publikacji naukowej ... No ale nikt nikomu tak robić zabronić nie może.
A ktoś słyszał o czymś takim jak Close; i o Action := caFree; w OnClose Formy :>