Invalid Pointer Operation - Gif

Odpowiedz Nowy wątek
2015-01-06 16:40
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?

edytowany 2x, ostatnio: furious programming, 2015-01-06 17:56
W tagach podawaj także nazwę języka/środowiska, żeby od razu było to wiadome, bez dopytywania się; - furious programming 2015-01-06 17:40

Pozostało 580 znaków

2015-01-06 16:44
0

Wszystkie dodatki to znaczy jakie? Jaka wersja Delphi?


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2015-01-06 16:45
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-06 16:58
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..

edytowany 2x, ostatnio: daro1337, 2015-01-06 17:35

Pozostało 580 znaków

2015-01-06 17:28
1
Image1.Picture.LoadFromFile('1.gif');

I już znajdzie obrazek

Niby tak, ale nie zawsze; Jeśli plik znajduje się w katalogu z programem, to znajdzie go tylko w trybie debugowania; Najbezpieczniej jest skorzystać z bezwzględnych ścieżek, posługując się dynamicznie wyekstrahowaną ścieżką pliku wykonywalnego; A jeśli plik znajduje się w specjalnym katalogu, to trzeba pobrać jego ścieżkę za pomocą dedykowanej funkcji; - furious programming 2015-01-06 17:38

Pozostało 580 znaków

2015-01-06 17:37
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.


edytowany 1x, ostatnio: furious programming, 2015-01-06 17:39

Pozostało 580 znaków

2015-01-06 17:44
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. :)

Pozostało 580 znaków

2015-01-06 17:45
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.


edytowany 3x, ostatnio: furious programming, 2015-01-06 17:58

Pozostało 580 znaków

2015-01-06 18:02
0

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

Pozostało 580 znaków

2015-01-06 18:30
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.

Pozostało 580 znaków

2015-01-06 18:42
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.


edytowany 1x, ostatnio: furious programming, 2015-01-06 18:43

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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