Ĺadny brzuch
A więc mam problem. Mianowicie mam taki kod przy FormClose:
procedure TFilmy.FormClose(Sender: TObject; var Action: TCloseAction); var F: TFileStream; begin F := TFileStream.Create('filmy.dat', fmCreate); try F.WriteComponent(Lista); finally F.Free; end; end;
oraz przy FormCreate:
procedure TFilmy.FormCreate(Sender: TObject); var F: TFileStream; MenuItemInfo: TMenuItemInfo; Buff: array[0..255] of Char; begin if FileExists('filmy.dat') then begin F := TFileStream.Create('filmy.dat', fmOpenRead or fmShareDenyWrite); try F.ReadComponent(Lista); finally F.Free; end; end; end;
No i jesli umieszczę program na płycie cd/dvd to wyskoczy mi bład, że nie może zapisac pliku (no chyba oczywiste :D). No i pomaga tylko Menadżer zadań :(. Co zrobić, żeby wyskoczyło okienko z informacją "Nie można zapisać na tym nośniku danych, jeśli chcesz wyjść z programu - nie zapisując dokonanych zmian naciśnij przycisk OK, w przeciwnym wypadku naciśnij Anuluj". No i teraz chciałbym, żeby pojawiły się dwa przyciski "OK" i "Anuluj" i jeśli ktoś wciśnie "OK" to program mu się zamyka (mianowicie ta forma) bez żadnego zapisywania ListView do pliku, a jeśli kliknie "Anuluj" to nic się nie stanie.
Ja dopiero zaczynam naukę, także jeśli moglibyście to podajcie kod z małym wytłumaczeniem, będę umiał na przyszłość :)
Pozdrawiam i dziękuje za pomoc!
Użytkownik mateok edytował ten post 06 lipiec 2007, 14:18
Z tego co widze, chcesz zapisac plik tam gdzie exek. Masz nazwy funkcji: ExtractFileDrive, GetDriveType. Za pomoca tych funkcji zrobisz tak jak chcesz. Co do drugiego pytania to MessageBox, poczytasz na msdn.com dokladny opis lub 4p, google itd.
var F: TFileStream; label start; //definiujemy etykietę begin start: //ustawiamy, że to jest start try // próbujemy F := TFileStream.Create('filmy.dat', fmCreate); try F.WriteComponent(Lista); finally F.Free; end; except // jeżeli nie wyjdzie //teraz komunikat z pytanie if Application.MessageBox('nie zapisanou. Czy chcesz wyjść?','Pytanie',MB_YESNO or MB_ICONQUESTION)= IDYES then //jeżeli tak Application.Terminate // to zamykamy else //jeżeli nie GoToStart; //wracamy tam gdzie ustawiliśmy start end; end;
To działa tylko bez kompilatora, bo on zaraz będzie chciał debugować :)
Chyba, że wyłączysz tą opcję, ale ona wykrywa większość błędów w trakcie działania.
Więcej o messagebox dowiesz się tutaj: http://www.informaty.../messagebox.htm
Użytkownik DJ Mentos edytował ten post 06 lipiec 2007, 11:47
var F: TFileStream; label start; //definiujemy etykietę begin start: //ustawiamy, że to jest start try // próbujemy F := TFileStream.Create('filmy.dat', fmCreate); try F.WriteComponent(Lista); finally F.Free; end; except // jeżeli nie wyjdzie //teraz komunikat z pytanie if Application.MessageBox('nie zapisanou. Czy chcesz wyjść?','Pytanie',MB_YESNO or MB_ICONQUESTION)= IDYES then //jeżeli tak Application.Terminate // to zamykamy else //jeżeli nie GoToStart; //wracamy tam gdzie ustawiliśmy start end; end;
To działa tylko bez kompilatora, bo on zaraz będzie chciał debugować :)
Chyba, że wyłączysz tą opcję, ale ona wykrywa większość błędów w trakcie działania.
Więcej o messagebox dowiesz się tutaj: http://www.informaty.../messagebox.htm
Tzn. jak bez kompilatora? Tak szczerze to bardziej mi zależy na FormClose niż na FormCreate :). A co do zapisywania to ja wiem, że zapisuję tu gdzie jest exe i chce tak nadal zapisywać, tylko chodzi mi o to, że jak nagram sobie ten program na płytę, to wyskakuje błąd i chciałbym, że jeżeli nie może zapisać na tej płycie, to żeby wyskoczył komunikat i była opcja nie zapisywania. Jak to zrobić?
@Dj_Mentos: Bez kompilatora?? oO
@mateok: Dostałeś już odpowiedź jak to zrobić więc zastosuj, a pytaj dopiero jak będziesz miał jakieś konkretne wątpliwości. Poza tym - użyj dodatkowo sprawdzenia czy plik nie jest tylko do odczytu (atrybuty - file+attr w helpie/google). Poza tym - czy czytałeś coś o przedrostkach w tematach? :>
@Dj_Mentos: Bez kompilatora?? oO
oj wiesz o co mi chodzi. xD
Jak w delphi wywali będzie problem, to wyskoczy ci komunikat o błędzie i zawiesi program itd. jak to sie normalnie dzieje...
A jak wyłączysz opcję debugowania to zrobi to co ma zrobić.
Jak masz włączone debugowanie, to czy masz to try czy go nie masz najpierw żuci się debugger a potem jak wznowisz prace dopiero ruszy to co było w except.
//Zrobić to tak jak ci napisałem, tylko Cię ostrzegam na przyszłość, bo wiem jak ja to stosowałem pierwszy raz, to mnie szlag trafiał bo delphi się waliło, a nie bylo tego co miało być. Oświeciło mnie wtedy bo tygodniu jak błąd mi wyskoczył na innym kompie.
Użytkownik DJ Mentos edytował ten post 06 lipiec 2007, 16:26
Kompilator != debugger...
Polecam jednak stosować try .. except do nieprzewidzianych przypadków. A tutaj przede wszystkim użycie metody o której pisał krajew pomoże...
@Down: "To działa tylko bez kompilatora, bo on zaraz będzie chciał debugować smile.gif" - w sumie to nie wiem jak to interpertować - zdanie bez ładu i składu :D.
Użytkownik Ali240 edytował ten post 06 lipiec 2007, 22:17
ale czy ja porównywałem debugger z kompilatorem ? :>
Ja miałem na myśli wbudowany w kompilator debugger.
A co do tematu, to faktycznie, najpierw sprawdź czy plik istnieje, potem czy jest zapisywalny, dopiero potem próbuj go wgrać.
Tzn. plik istnieje, także z tym nie byłoby problemu. A moglibyście podać przykładowy kod? Bo aż tak zaawansowanym programistą nie jestem :(. Tylko później napiszcie do czego dana linia służy, bo chciałbym wiedzieć jak to działa i wiedzieć na przyszłość :)
Z góry wielkie THX
if FileExists('fajnyplik.roz') then //jezeli plik istnieje SprawdzCzyDaSieZapisac else ShowMessage('Plik nie instnieje');
Nie chce mi sie szukać procedury na Sprawdzanie czy da sie zapisac, ale myśle, że na 4P powinno coś o tym być.
Użytkownik DJ Mentos edytował ten post 07 lipiec 2007, 09:34
if FileExists('fajnyplik.roz') then //jezeli plik istnieje SprawdzCzyDaSieZapisac else ShowMessage('Plik nie instnieje');
Nie chce mi sie szukać procedury na Sprawdzanie czy da sie zapisac, ale myśle, że na 4P powinno coś o tym być.
Tylko mi nie chodzi o to czy plik istnieje czy nie, bo ja go już stworzyłem i on jest. Chodzi mi o to, że jak nie da się zapisać danych z ListView do tego pliku (bo np. plik jest niezapisywalny, bo jest na płycie) to żeby wyskoczył mi komunikat o tym i żebym mógł zamknąć program bez zapisywania, a nie poprzez CTRL+ALT+DELETE :(
1. TO CO BYŁO PISANE
2. GOOGLE/HELP
Sorry za krzyk ale powoli mam dość. I do półki pytający nie raczy ruszyć się i posprawdzać to co już było mu sugerowane, niech nie pisze dalej pytań! Ech, jak ja się wdrażałem w delphi to internet miałem 2 godziny na tydzień, a jakoś sobie dawałem radę...
mateok: czytaj moj pierwszy post w temacie.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
procedure TFilmy.FormClose(Sender: TObject; var Action: TCloseAction); var F: TFileStream; begin F := TFileStream.Create('filmy.dat', fmCreate); try F.WriteComponent(Lista); finally F.Free; end; end;
oraz przy FormCreate:
procedure TFilmy.FormCreate(Sender: TObject); var F: TFileStream; MenuItemInfo: TMenuItemInfo; Buff: array[0..255] of Char; begin if FileExists('filmy.dat') then begin F := TFileStream.Create('filmy.dat', fmOpenRead or fmShareDenyWrite); try F.ReadComponent(Lista); finally F.Free; end; end; end;
No i jesli umieszczę program na płycie cd/dvd to wyskoczy mi bład, że nie może zapisac pliku (no chyba oczywiste :D). No i pomaga tylko Menadżer zadań :(. Co zrobić, żeby wyskoczyło okienko z informacją "Nie można zapisać na tym nośniku danych, jeśli chcesz wyjść z programu - nie zapisując dokonanych zmian naciśnij przycisk OK, w przeciwnym wypadku naciśnij Anuluj". No i teraz chciałbym, żeby pojawiły się dwa przyciski "OK" i "Anuluj" i jeśli ktoś wciśnie "OK" to program mu się zamyka (mianowicie ta forma) bez żadnego zapisywania ListView do pliku, a jeśli kliknie "Anuluj" to nic się nie stanie.
Ja dopiero zaczynam naukę, także jeśli moglibyście to podajcie kod z małym wytłumaczeniem, będę umiał na przyszłość :)
Pozdrawiam i dziękuje za pomoc!
Użytkownik mateok edytował ten post 06 lipiec 2007, 14:18
Z tego co widze, chcesz zapisac plik tam gdzie exek. Masz nazwy funkcji: ExtractFileDrive, GetDriveType. Za pomoca tych funkcji zrobisz tak jak chcesz. Co do drugiego pytania to MessageBox, poczytasz na msdn.com dokladny opis lub 4p, google itd.
var F: TFileStream; label start; //definiujemy etykietę begin start: //ustawiamy, że to jest start try // próbujemy F := TFileStream.Create('filmy.dat', fmCreate); try F.WriteComponent(Lista); finally F.Free; end; except // jeżeli nie wyjdzie //teraz komunikat z pytanie if Application.MessageBox('nie zapisanou. Czy chcesz wyjść?','Pytanie',MB_YESNO or MB_ICONQUESTION)= IDYES then //jeżeli tak Application.Terminate // to zamykamy else //jeżeli nie GoToStart; //wracamy tam gdzie ustawiliśmy start end; end;
To działa tylko bez kompilatora, bo on zaraz będzie chciał debugować :)
Chyba, że wyłączysz tą opcję, ale ona wykrywa większość błędów w trakcie działania.
Więcej o messagebox dowiesz się tutaj: http://www.informaty.../messagebox.htm
Użytkownik DJ Mentos edytował ten post 06 lipiec 2007, 11:47
var F: TFileStream; label start; //definiujemy etykietę begin start: //ustawiamy, że to jest start try // próbujemy F := TFileStream.Create('filmy.dat', fmCreate); try F.WriteComponent(Lista); finally F.Free; end; except // jeżeli nie wyjdzie //teraz komunikat z pytanie if Application.MessageBox('nie zapisanou. Czy chcesz wyjść?','Pytanie',MB_YESNO or MB_ICONQUESTION)= IDYES then //jeżeli tak Application.Terminate // to zamykamy else //jeżeli nie GoToStart; //wracamy tam gdzie ustawiliśmy start end; end;
To działa tylko bez kompilatora, bo on zaraz będzie chciał debugować :)
Chyba, że wyłączysz tą opcję, ale ona wykrywa większość błędów w trakcie działania.
Więcej o messagebox dowiesz się tutaj: http://www.informaty.../messagebox.htm
Tzn. jak bez kompilatora? Tak szczerze to bardziej mi zależy na FormClose niż na FormCreate :). A co do zapisywania to ja wiem, że zapisuję tu gdzie jest exe i chce tak nadal zapisywać, tylko chodzi mi o to, że jak nagram sobie ten program na płytę, to wyskakuje błąd i chciałbym, że jeżeli nie może zapisać na tej płycie, to żeby wyskoczył komunikat i była opcja nie zapisywania. Jak to zrobić?
@Dj_Mentos: Bez kompilatora?? oO
@mateok: Dostałeś już odpowiedź jak to zrobić więc zastosuj, a pytaj dopiero jak będziesz miał jakieś konkretne wątpliwości. Poza tym - użyj dodatkowo sprawdzenia czy plik nie jest tylko do odczytu (atrybuty - file+attr w helpie/google). Poza tym - czy czytałeś coś o przedrostkach w tematach? :>
@Dj_Mentos: Bez kompilatora?? oO
oj wiesz o co mi chodzi. xD
Jak w delphi wywali będzie problem, to wyskoczy ci komunikat o błędzie i zawiesi program itd. jak to sie normalnie dzieje...
A jak wyłączysz opcję debugowania to zrobi to co ma zrobić.
Jak masz włączone debugowanie, to czy masz to try czy go nie masz najpierw żuci się debugger a potem jak wznowisz prace dopiero ruszy to co było w except.
//Zrobić to tak jak ci napisałem, tylko Cię ostrzegam na przyszłość, bo wiem jak ja to stosowałem pierwszy raz, to mnie szlag trafiał bo delphi się waliło, a nie bylo tego co miało być. Oświeciło mnie wtedy bo tygodniu jak błąd mi wyskoczył na innym kompie.
Użytkownik DJ Mentos edytował ten post 06 lipiec 2007, 16:26
Kompilator != debugger...
Polecam jednak stosować try .. except do nieprzewidzianych przypadków. A tutaj przede wszystkim użycie metody o której pisał krajew pomoże...
@Down: "To działa tylko bez kompilatora, bo on zaraz będzie chciał debugować smile.gif" - w sumie to nie wiem jak to interpertować - zdanie bez ładu i składu :D.
Użytkownik Ali240 edytował ten post 06 lipiec 2007, 22:17
ale czy ja porównywałem debugger z kompilatorem ? :>
Ja miałem na myśli wbudowany w kompilator debugger.
A co do tematu, to faktycznie, najpierw sprawdź czy plik istnieje, potem czy jest zapisywalny, dopiero potem próbuj go wgrać.
Tzn. plik istnieje, także z tym nie byłoby problemu. A moglibyście podać przykładowy kod? Bo aż tak zaawansowanym programistą nie jestem :(. Tylko później napiszcie do czego dana linia służy, bo chciałbym wiedzieć jak to działa i wiedzieć na przyszłość :)
Z góry wielkie THX
if FileExists('fajnyplik.roz') then //jezeli plik istnieje SprawdzCzyDaSieZapisac else ShowMessage('Plik nie instnieje');
Nie chce mi sie szukać procedury na Sprawdzanie czy da sie zapisac, ale myśle, że na 4P powinno coś o tym być.
Użytkownik DJ Mentos edytował ten post 07 lipiec 2007, 09:34
if FileExists('fajnyplik.roz') then //jezeli plik istnieje SprawdzCzyDaSieZapisac else ShowMessage('Plik nie instnieje');
Nie chce mi sie szukać procedury na Sprawdzanie czy da sie zapisac, ale myśle, że na 4P powinno coś o tym być.
Tylko mi nie chodzi o to czy plik istnieje czy nie, bo ja go już stworzyłem i on jest. Chodzi mi o to, że jak nie da się zapisać danych z ListView do tego pliku (bo np. plik jest niezapisywalny, bo jest na płycie) to żeby wyskoczył mi komunikat o tym i żebym mógł zamknąć program bez zapisywania, a nie poprzez CTRL+ALT+DELETE :(
1. TO CO BYŁO PISANE
2. GOOGLE/HELP
Sorry za krzyk ale powoli mam dość. I do półki pytający nie raczy ruszyć się i posprawdzać to co już było mu sugerowane, niech nie pisze dalej pytań! Ech, jak ja się wdrażałem w delphi to internet miałem 2 godziny na tydzień, a jakoś sobie dawałem radę...
mateok: czytaj moj pierwszy post w temacie.