[Delphi] ImageList - zapis i odczyt ikon z pliku

0

Witam,

mam kolejny problem, z którym nie mogę sobie poradzić. Niestety, na Forum nic nie znalazłem na ten temat, więc liczę na Waszą pomoc.

Chodzi mi tu konkretnie, jak zapisać do pliku wszystkie ikony znajdujące się w ImageList oraz jak później, z takiego pliku, ponownie załadować ikony do ImageList?

Za pomoc z góry dzięki...

Pozdrawiam
RYGAR

0

a znasz takie coś jak pliki zasobów?

0

Szczerze mówiąc, to nie wiem o co chodzi z tymi plikami zasobów. Ale żeby nie było niejasności, to nie chodzi mi o to, żeby ikony były "zaszyte" w programie, tylko żeby program przy starcie mógł je załadować z pliku do ImageList.

Będę wdzięczny za dalsze wskazówki. Ale proszę bardziej konkretnie udzielać odpowiedzi, a nie pytaniem na pytanie... :]

Pozdrawiam
RYGAR

0

Nie mam teraz delphi ale czy TImagList nie ma takiego czegos jak : LoadFromFile ?

0

No właśnie nie ma i w tym cały problem... :-D
Dlatego proszę o jakieś wskazówki, albo przykład... ;-)

Pozdrawiam
RYGAR

0

na szybko wyszukan moze cos podopwie ;)
http://entwickler-forum.de/showthread.php?t=14039

0

Spróbuję się z tym pobawić... Na razie dzięki za podpowiedź... ;)
Jeśli mi nic z tego nie wyjdzie, to dalej będę męczył... :P
Zastanawiam się, czy dam sobie radę, bo j.niemiecki, to dla mnie CZARNA MAGIA...

Pozdrawiam
RYGAR

0

a znasz takie coś jak pliki zasobów?

Zasoby

function FileLoad(ResType: TResType; const Name: string; MaskColor: TColor): Boolean;
function Add(Image: TBitmap; Mask: TBitmap): Integer;
0
Mitring napisał(a)

na szybko wyszukan moze cos podopwie ;)
http://entwickler-forum.de/showthread.php?t=14039

Mitring, ślicznie dziękuję za linka... właśnie trafiłeś w samo sedno... :]
Dwa ostatnie fragmenty kodu śmigają jak należy :)
Z tym pierwszym i drugim fragmentem nie mogłem sobie poradzić. Wiem tylko tyle, że zostały wykorzystane pliki strumieniowe. Oto ten kod:

var SF: TFileStream; SA: TStreamAdapter; ||
begin ||
SF := TFileStream.Create(ImageFile); ||
SA := TStreamAdapter.Create(SF); ||
try ||
// der folgende Befehl ist wohl Windows-Standard und übernimmt ImageList.Handle ||
if not ImageList_Write(ImageListe.Handle, SA) ||
then raise EWriteError.CreateRes(@SImageWriteFail); ||
finally ||
SF.Free; ||
SA.Free; ||
end; ||
end;<br>

procedure TForm1.Images_Read( ImageListe: TImageList; ImageFile: string ); ||
var SF: TFileStream; SA: TStreamAdapter; ||
begin ||
SF := TFileStream.Create(ImageFile); ||
SA := TStreamAdapter.Create(Stream); ||
try ||
ImageListe.FreeHandle; ||
ImageListe.Handle := ImageList_Read(SA); ||
if ImageListe.Handle = 0 then raise EReadError.CreateRes(@SImageReadFail); ||
finally ||
SF.Free; ||
SA.Free; ||
end; ||
end;

Mitring, a możesz mi wytłumaczyć, jak zmodyfikować poniższy kod, który zresztą działa bez zarzutów, aby mieć kontrolę nad każdym przesyłanym bajtem? Chodzi o to, że chciałbym mieć możliwość łączenia danych ImageList'a z innymi danymi w jednym pliku. Innymi słowy - mając jakiś tam plik, np. DANE.DAT z bazą np. słów - chcę na końcu tego pliku dołączyć dane z ImageList (wszystkie ikonki)... :)
Coś na wzór przesyłania danych bajt za bajtem, tak jak to się robi za pomocą Write(plik, bajt)... ;-)

var Bild: TBitmap; i1: integer; Ausgabe: TMemoryStream; ||
begin ||
Bild := TBitmap.Create; ||
Ausgabe := TMemoryStream.Create; ||
try ||
for i1 := 0 to ImageListe.Count - 1 ||
do begin ||
ImageListe.GetBitmap( i1, Bild ); ||
Bild.SaveToStream(Ausgabe); ||
end; ||
Ausgabe.SaveToFile( ImageFile ); ||
finally ||
Ausgabe.Free; ||
Bild.Free; ||
end; ||
end;

procedure TForm1.Images_Read ( ImageListe: TImageList; ImageFile: string ); ||
var Bild: TBitmap; Ausgabe: TMemoryStream; ||
begin ||
Bild := TBitmap.Create; ||
Ausgabe := TMemoryStream.Create; ||
ImageListe.Clear; ||
try ||
Ausgabe.LoadFromFile(ImageFile); ||
Ausgabe.Seek( 0, soFromBeginning ); ||
repeat ||
Bild.LoadFromStream(Ausgabe); ||
ImageListe.Add(Bild,nil); ||
until Ausgabe.Position >= Ausgabe.Size; ||
finally ||
Ausgabe.Free; ||
Bild.Free; ||
end; ||
end;

Oleksy_Adam o zasobach czytałem ostatnio, ale to dość trudny dla mnie temat. Może za jakiś czas to zrozumiem. Co do tych wymienionych funkcji, to też starałem się coś z nimi zrobić, ale nic mi nie wychodziło. Tym bardziej, że nie wiem co to jest TResType. A może pokazałby mi ktoś, na przykładzie, jak to zrobić? ;)

Pozdrawiam
RYGAR

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