Invalid Pointer Operation - Gif

0

Witam, zainstalowałem wszystkie dodatki aby załadować do swojego programu Gif'a i wszytsko działa jeśli ładuje gifa z tak:

procedure TEdit21.FormCreate(Sender: TObject);
begin
Image1.Picture.LoadFromFile('C:\1.gif');
end;

natomiast jeśli chcę go załadować z Object inspectora mam błąd jak w temacie.
Gif jest obrazem 'statycznym' bo chodzi mi jedynie o brak tła, aby komponował się ładnie, więc plik musi być *.gif lub *.png
Problem polega na tym, że program na innym komputerze nie otworzy pliku z moim gifem, bo nie znajdzie ścieżki, jak mogę go inaczej skompilować do programu?

0

Wszystkie dodatki to znaczy jakie? Jaka wersja Delphi?

0

To tak nie działa, załaduj do TGifImage a potem za pomocą Assign do Image.

0

Delphi7, dodatek to TGifImage.

poczytałem i napisałem coś takiego:

procedure TEdit21.FormCreate(Sender: TObject);
begin
GIF := TGIFImage.Create;
GIF.LoadFromFile('C:\1.gif');
Image1.Picture.Assign(GIF);
end; 

ale nadal coś nie działa..

1
Image1.Picture.LoadFromFile('1.gif');

I już znajdzie obrazek

0

@daro1337 - używasz bezwzględnej ścieżki do pliku, więc jedynie u Ciebie plik istnieje w tym miejscu; Na innym komputerze, z inną nazwą użytkownika czy inną wersją systemu, ścieżka będzie nieprawidłowa;

Używaj bezwzględnych nazw plików, tak jak podał poprzednik, a najlepiej jak do samej (gołej) nazwy pliku dodasz ścieżkę pliku wykonywalnego, np. w ten sposób:

Image1.Picture.LoadFromFile(ExtractFilePath(ParamtStr(0)) + '1.gif');

Jeżeli plik istnieje w katalogu specjalnym, to musisz pobrać ścieżkę takiego katalogu (np. pulpitu) za pomocą odpowiedniej funkcji, np. SHGetSpecialFolderPath z WinAPI; Więcej informacji o tym znajdziesz tutaj.

0

@furious programming wszystko rozumiem, problem w tym, że nie chce pliku *.gif przenosić na komputery, tylko chcę aby był załadowany do pliku .exe na stałe. Tak jakbyś za pomocą Objectiv Inspectora wrzucał zwykle zdjęcie to ono się kompiluje z programem i jest 'na zawsze' do niego przypisane. :)

1

No to dołącz go do zasobów pliku wykonywalnego i ładuj ze strumienia klasy TResourceStream - nic trudnego; Jeśli dobrze pamiętam, to będzie to wyglądać mniej więcej tak:

procedure TForm1.FormCreate(Sender: TObject);
var
  gifImage: TGIFImage;
  rsInput: TResourceStream;
begin
  rsInput := TResourceStream.Create(HInstance, 'gif_image', 'RT_RCDATA');
  gifImage := TGIFImage.Create();
  try
    gifImage.LoadFromStream(rsInput);
    Image1.Picture.Assign(gifImage);
  finally
    gifImage.Free();
    rsInput.Free();
  end;
end;

Ale dość słabo pamiętam obsługę klasy TGIFImage; Tylko dodaj sobie GIFa jako ogólny typ zasobu (RT_RCDATA), no i wybierz mu inną nazwę, niż pokazany wyżej gif_image; Ewentualnie dodaj go do zasobu, udostępnij poprzez indeks, a przy tworzeniu instancji klasy strumienia, skorzystaj z konstruktora CreateFromID;

PS: Nie myślałeś o przesiadce na darmowego Lazarusa? Tam nie trzeba nic doinstalowywać - GIF, PNG i inne formaty obsługiwane są w standardzie.

0

a mogę odtworzyć obecny projekt z Delphi 7 czy wymaga to przepisania wsyztskiego ;)?

0

W Lazarusie istnieje importer projektów z Delphi więc spróbować możesz. Nie zawsze uda się jednak przenieść wszystko automatem. Lazarus trzyma względną kompatybilność z Delphi 7, ale może brakować pewnych standardowych komponentów czy bibliotek.

0
daro1337 napisał(a):

a mogę odtworzyć obecny projekt z Delphi 7 czy wymaga to przepisania wsyztskiego ;)?

Nie musisz tworzyć nowego, po prostu utwórz sobie plik zasobu (z rozszerzeniem .res) za pomocą kompilatora brcc32.exe i dodaj dyrektywą $R lub $RESOURCE nazwę pliku zasobu w odpowiednim pliku źródłowym; Najlepiej w sekcji Initialization, jeśli nie wiesz jak się tego używa;

To wystarczy, aby podczas kompilacji projektu, plik zasobów został włączony do pliku wykonywalnego.

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