Autor Beitrag
Stevie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85

Windows 7
Delphi XE Professional
BeitragVerfasst: Di 14.12.04 16:28 
Hallo Leute,

ich möchte ein meinem Programm die Bitmaps für die Komponenten aus einer dcr-Datei laden und anzeigen.
Ich weiß, dass das "nur" eine res-Datei ist. Folgendes erzeugt den Fehler: "Bitmap ist ungültig"
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm2.FormCreate(Sender: TObject);
type
  TResHeader = packed record
    DataSize: LongWord;
    HeaderSize: LongWord;
  end;

var
  Buffer: array[1..4000] of Char;
  FileStream: TFileStream;
  Header: TResHeader;
  MemoryStream: TMemoryStream;
begin
  try
    FileStream := TFileStream.Create('D:\Comps.dcr', fmOpenRead and fmShareExclusive);
    FileStream.Read(Buffer, 32);
    FileStream.Read(Header, SizeOf(Header));
    FileStream.Read(Buffer, Header.HeaderSize - SizeOf(Header));
    MemoryStream := TMemoryStream.Create;
    MemoryStream.CopyFrom(FileStream, Header.DataSize);
    MemoryStream.Seek(0, soFromBeginning);
    Image.Picture.Bitmap.LoadFromStream(MemoryStream);
  finally
    FreeAndNil(MemoryStream);
    FreeAndNil(FileStream);
  end;
end;

Wo ist mein Fehler???
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 14.12.04 18:40 
Ich denke mal du bekommst die Meldung deswegen, da du nicht genau auf dem Anfang des Bildes stehst. Dann kann er es ja auch nicht laden. Warum linkst du die Resource nicht mit in deine Anwendung? Also entweder in die Exe oder in das kompilierte Package (dcp wenn ich mich nicht irre) oder sonst wohin. Dann kannst du die Bilder mittels LoadFromResource aus dem geladenen Modul (exe, dcp o. dll) laden. So macht Delphi das ja auch nur.

Ein kompiliertes Package ist auch nur so etwas wie eine Dll. Also bevor die Frage aufkommt.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Stevie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85

Windows 7
Delphi XE Professional
BeitragVerfasst: Do 16.12.04 08:52 
Ich möchte in meinem Programm einen Viewer für dcr-Dateien (Symbole für Komponenten) einbauen.
Deshalb kann ich die nicht in diese Anwendung einbauen, sondern ich geb dort die Datei an und
möchte alle Bitmaps angezeigt bekommen, die dort enthalten sind.
Stevie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 85

Windows 7
Delphi XE Professional
BeitragVerfasst: Do 16.12.04 11:18 
Also, ich hab mich mal in die Struktur einer Res-Datei reingelesen und kann mit Bestimmtheit sagen, dass der Teil, den ich in den MemoryStream lese, der richtige ist. Allerdings weiß ich auch, dass das nicht das richtige Format für eine Bitmap ist.
Weiß jemand, wie ich den Stream aus der Resource in ein Bitmap-kompatibles Format konvertieren kann?

Ok, ich hab's:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
procedure LoadImagesFromResource(const FileName: string; ImageList: TImageList; Strings: TStrings);
type
  TResourceHeader = packed record
    DataSize: DWord;
    HeaderSize: DWord;
    ResType: packed array[0..1] of Word;
    ResName: string;
    DataVersion: DWord;
    MemoryFlags: Word;
    LanguageID: Word;
    Version: DWord;
    Characteristics: DWord;
  end;

var
  Bitmap: TBitmap;
  Buffer: array[1..2000] of Char;
  FileStream: TFileStream;
  MemoryStream: TMemoryStream;
  Header: TResourceHeader;
  bmpInfo: BITMAPINFO;
  bmpFileHeader: BITMAPFILEHEADER;

  function ReadHeader: Boolean;
  var
    i: Integer;
    w: Word;
  begin
    Header.ResName := '';
    Result := False;
    if FileStream.Read(Header, 12) < 12 then
      Exit;
    for i := 1 to ((Header.HeaderSize - 28) div 2) do
    begin
      FileStream.Read(w, 2);
      if w <> 0 then
        Header.ResName := Header.ResName + Chr(w);
    end;
    FileStream.Read(Header.DataVersion, 4);
    FileStream.Read(Header.MemoryFlags, 2);
    FileStream.Read(Header.LanguageID, 2);
    FileStream.Read(Header.Version, 4);
    FileStream.Read(Header.Characteristics, 4);
    Result := True;
  end;

begin
  Bitmap := TBitmap.Create;
  FileStream := TFileStream.Create(FileName, fmOpenRead and fmShareDenyWrite);
  FileStream.Read(Buffer, 32);
  while ReadHeader do
  begin
    FileStream.Read(bmpInfo, SizeOf(bmpInfo));
    FileStream.Seek(-SizeOf(bmpInfo), soFromCurrent);
    FileStream.Read(Buffer, Header.DataSize);
    bmpFileHeader.bfType := 19778;
    bmpFileHeader.bfSize := SizeOf(bmpFileHeader) + Header.DataSize;
    bmpFileHeader.bfReserved1 := 0;
    bmpFileHeader.bfReserved2 := 0;
    bmpFileHeader.bfOffBits := 1078;
    MemoryStream := TMemoryStream.Create;
    MemoryStream.Write(bmpFileHeader, SizeOf(bmpFileHeader));
    MemoryStream.Write(Buffer, Header.DataSize);
    MemoryStream.SaveToFile(Header.ResName + '.bmp');
    MemoryStream.Seek(0, soFromBeginning);
    Bitmap.LoadFromStream(MemoryStream);
    ImageList.Add(Bitmap, nil);
    Strings.Add(Header.ResName);
    FreeAndNil(MemoryStream);
  end;
  FreeAndNil(FileStream);
  FreeAndNil(Bitmap);
end;