Rekordy + TImage + TOpenDialog = Invalid FileName

0

Witam, tworze program korzystający z plików rekordowych. (taka mała baza danych)
Mam 2 TForm, na których jest są 2 TImage. Do TImgae wczytuje podczas startu formy obrazek *.bmp lub *.jpg.

Potem gdy chcę dodać nowy rekord, otwieram drugą formę, wpisuję dane i klikam zapisz(procedura zapisująca rekord) - i wszystko jest OK.

ALE... gdy wrzuce na formę TOpenDialog, żeby użytkownik sam mógł załadować obrazek (nadal jest OK, tzn. obrazek się ładuje do TImage i jest wporzo) i otworzę drugą formę, żeby wpisać dane, a potem uruchomię procedurę zapisu to nagle wyskakuje "Invalid filename" - i to odnośnie pliku wskazującego na rekord.

Jeżeli użytkownik pozostawi w spokoju TOpenDialog i nie będzie wybierał obrazka to wszystko działa (rekord jest zapisywany, nie wyskakuje żaden błąd - NIC ).

Kurde, troche to zawiłe, jeżeli ktoś będzie zainteresowany pomocą to podam linki do całego projektu, albo wrzuce kawałki kodu. Albo też jak ktoś ma chwilę to zapraszam na GG : 55 19 55
Problem moim zdaniem ciekawy, bo za chiny nie mogę się dopatrzeć błędu, po prostu wszystko jest OK, problem zaczyna się po wrzuceniu na formę TOpenDialog :|

0

wiesz dzisiaj niedziela i wróżki nie urzędują.
Ale bez wróżki mogę Ci powiedzieć, że masz błędnie napisany kod i trzeba go poprawić

0

No wiesz.... to, że gdzieś jest błąd to wiem, poza tym nie ma programów bezbłędnych. Sęk w tym, że sprawdzałem wszystko kilka razy, ścieżkę wskazującą na plik rekordowy zapodałem jak stałą, wszędzie zamykam plik, zwalniam niepotrzebne strumienie itp.
I nadal nie wiem o co chodzi :|

0

Jak podasz do czego zapisujesz ten obrazek (Jaka struktura) i wkleisz troche kodu z zapisem i wczytywaniem obrazka to moze cos sie poradzi

0

sam sobie odpowiedziales na pytanie. problem lezy w ustawieniu TFileName. Moze przed zapisem dodaj SaveDialog1(lub Opendialog1).Filename:=''; i dopiero po tym wywołaj if savedialog1.execute then save cos tam z wykozystaniem savedialog1.filename. wiem ze nie mam daru tlumaczenia ale mniej wiecej powiniennes zatrybic o co chodzi :>

0
procedura w OnClick (TButton)
 var Rec : TDane;
     F  : TFDane;
     k : integer;    //  numer katalogu
     S : TStringList;
     AMemo : array[0..2] of TMemo;
begin
 AssignFile(F,plik);

 Reset(F);        < ------- w tym miejscu wywala błąd
  Seek(F,FileSize(F));
    Rec.tytul := Edit1.Text;
    Rec.lp := FileSize(F);
    k := FileSize(F);
  Write(F,Rec);
  CloseFile(F);

  CreateDirectory(PChar('db\'+inttostr(k)),nil);
   AMemo[0] := Memo1;
   AMemo[1] := Memo2;
   AMemo[2] := Memo3;

   S := TStringList.Create;
    S.Add(Edit2.Text); // tytul oryginalny
     itd.....

 AddInfoToFile(S,K,AMemo); // procka nizej...
 S.Free;
 AddToList(Main.Lst);  // dodaje to TListBox - nie ma potrzeby opisywania
 AddFrm.Close;
end;

---> procki.pas

const
 plik = 'data\nfx.ttd';
procedure AddInfoToFile(S : TStringList;
  Katalog : integer;AMemo : array of TMemo);   // zapisywanie zawartosci TMemo do poszczegolnych katalogów
             begin
   S.SaveToFile('movies\'+IntToStr(Katalog)+'\'+IntToStr(Katalog));
   AMemo[0].Lines.SaveToFile('movies\'+IntToStr(Katalog)+
   '\'+IntToStr(Katalog)+'.txt');
   AMemo[1].Lines.SaveToFile('movies\'+IntToStr(Katalog)+
   '\'+IntToStr(Katalog)+'_'+IntToStr(Katalog)+'.txt');
   AMemo[2].Lines.SaveToFile('movies\'+IntToStr(Katalog)+
   '\'+IntToStr(Katalog)+'_'+IntToStr(Katalog)+'_'+
   IntToStr(Katalog)+'.txt');
  end;

struktura rekordu:

 type TDane = record
  tytul : string[50];
  lp : integer;
  obejrzany : boolean;
 end;

i to w zasadzie wszystko. Jeżeli wrzuce na główną formę, gdzie są tylko kontrolki które pokazują dane z rekordu, TImage i TOpenDialog - a potem załaduję obrazek .bmp/.jpg - i kliknę TButton - to wyskakuje błąd Invalid FileName. Jeżeli natomiast w ogóle nie będę ruszał TOpenDialog, czyli nie będę nic ładował to TImage to wszystko jest wporzo :|
O CO TU CHODZI ? Bo juz głupieje.....

0

Domyślam się że ładujesz obrazki z innego katalogu niż ten w którym jest Twój *.exe, pokombinuj z tym:

const
 plik = 'c:\data\nfx.ttd';
0

Przed Reset(F) dodaj np. if not FileExists(plik) then ShowMessage('nie ma takiego pliku!').
Jeśli ten komunikat się pojawi, to musisz poprawić nazwę pliku (spróbuj: plik := ExpandFileName(plik);)

0

po wybraniu jakiegoś pliku w OpenDialog zmienia się aktualny katalog dla exeka na ten, w którym był otwarty w nim plik. Jeśli to tylko możliwe to używaj bezwzględnych ścieżek.

na dobrą sprawę jak zamienisz

 plik = 'data\nfx.ttd';

na

 plik := ExtractFileDir(Application.ExeName) + 'data\nfx.ttd';

i oczywiście plik trzeba zrobić zmienną
to powinno być OK

0

Boshe.... co idiotyczny błąd !!! Faktycznie trzeba było używać ścieżek bezwzgłednych, użyłem więc
ExtractFilePath(Application.ExeName) +'RESZTA' - i jest git.
Dzięki panowie, główkowałem nad tym już drugi dzień, a tu prosze, taki idiotyzm :/ :-[

0

i wystarczyło trochę kodu :p

1 użytkowników online, w tym zalogowanych: 0, gości: 1