Rekordy + TImage + TOpenDialog = Invalid FileName

Odpowiedz Nowy wątek
2006-11-05 15:28

Rejestracja: 16 lat temu

Ostatnio: 2 lata temu

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, poprostu wszystko jest OK, problem zaczyna się po wrzuceniu na formę TOpenDialog :|

Pozostało 580 znaków

2006-11-05 16:56

Rejestracja: 16 lat temu

Ostatnio: 7 lat temu

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ć


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-11-05 18:33

Rejestracja: 16 lat temu

Ostatnio: 2 lata temu

0

No wiesz.... to, że gdzieś jest błąd to wiem, pozatym 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 :|

Pozostało 580 znaków

siwy102
2006-11-05 20:02
siwy102
0

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

Pozostało 580 znaków

2006-11-05 21:05

Rejestracja: 13 lat temu

Ostatnio: 3 lata temu

Lokalizacja: Poznań

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 :>


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance

Pozostało 580 znaków

2006-11-06 12:37

Rejestracja: 16 lat temu

Ostatnio: 2 lata temu

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.....

Pozostało 580 znaków

2006-11-06 15:40

Rejestracja: 15 lat temu

Ostatnio: 8 lat temu

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';

Suma inteligencji na świecie jest wartością stałą, niestety ludzi przybywa.

Pozostało 580 znaków

2006-11-06 16:05

Rejestracja: 17 lat temu

Ostatnio: 8 miesięcy temu

Lokalizacja: Sosnowiec

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);)

Pozostało 580 znaków

2006-11-06 16:10

Rejestracja: 16 lat temu

Ostatnio: 7 lat temu

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-11-06 17:40

Rejestracja: 16 lat temu

Ostatnio: 2 lata temu

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 :/ :-[

Pozostało 580 znaków

2006-11-06 18:01

Rejestracja: 16 lat temu

Ostatnio: 7 lat temu

0

i wystarczyło trochę kodu :p


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

Odpowiedz

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