通过HH8WilEdit学习WIL 文件编码 11 改变程序,用STREAM来读取WIL ,WIX 文件

unit TestWilMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TImageByte = array of Byte; TWMImageHeader = record Title: string[40]; ImageCount: Integer; ColorCount: Integer; PaletteSize: Integer; end; TWMImageInfo = record Width: SmallInt; Height: SmallInt; px: SmallInt; py: SmallInt; bits: PByte; end; TWMIndexHeader = record Title: string[40]; IndexCount: Integer; end; TWMIndexInfo = record Position: Integer; Size: Integer; end; TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Memo2: TMemo; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; var Form1: TForm1; WilStream: TFileStream ; IndexSteam: TFileStream; WilFileName: string; IndexFileName: string; WmImageHeader: TWMImageHeader; WmIndexHeader: TWMIndexHeader; WMImageInfo: TWMImageInfo; IndexList: array of Integer; ImageByte: TImageByte; v : Byte; str: string; x, y: SmallInt; offset: Integer; i: Integer; implementation {$R *.dfm} function ExtractFileNameOnly(const fname: string): string; var extpos: Integer; ext, fn: string; begin ext := ExtractFileExt(fname); fn := ExtractFileName(fname); if ext <> '' then begin extpos := Pos(ext, fn); Result := Copy(fn, 1, extpos - 1); end else Result := fn; end; procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then WilFileName := OpenDialog1.FileName; if WilFileName <> '' then begin Memo1.Clear; Memo1.Lines.Add(WilFileName); if WilStream <> nil then WilStream.Free; SetLength(IndexList, 0); WilStream := TFileStream.Create(WilFileName, fmOpenRead or fmShareDenyNone); WilStream.Position := 0; WilStream.Read(WmImageHeader, SizeOf(WmImageHeader)); Memo1.Lines.Add('文件标示: ' + WmImageHeader.Title); Memo1.Lines.Add('图片数目: ' + IntToStr(WmImageHeader.ImageCount)); Memo1.Lines.Add('颜色数目: ' + IntToStr(WmImageHeader.ColorCount)); Memo1.Lines.Add('调色板大小:' + IntToStr(WmImageHeader.PaletteSize)); Memo1.Lines.Add('文件大小:' + IntToStr(WilStream.Size)); IndexFileName := ExtractFilePath(WilFileName) + ExtractFileNameOnly(WilFileName) + '.wix'; if IndexSteam <> nil then IndexSteam.Free; Memo2.Clear; Memo2.Lines.Add(IndexFileName); IndexSteam := TFileStream.Create(IndexFileName, fmOpenRead or fmShareDenyNone); IndexSteam.Position := 0; IndexSteam.Read(WmIndexHeader, SizeOf(WmIndexHeader)); Memo2.Lines.Add('文件标示: ' + WmIndexHeader.Title); Memo2.Lines.Add('图片数目: ' + IntToStr(WmIndexHeader.IndexCount)); SetLength(IndexList, WmIndexHeader.IndexCount); IndexSteam.Read(IndexList[0], 4 * WmIndexHeader.IndexCount); for i := 0 to WmIndexHeader.IndexCount -1 do begin Memo2.Lines.Add(IntToStr(i) + ': ' + IntToStr(IndexList[i])); end; for i := 0 to WmIndexHeader.IndexCount -1 do begin offset := IndexList[i]; WilStream.Seek(offset, 0); WilStream.Read(WMImageInfo, SizeOf(WMImageInfo)); Memo1.Lines.Add(IntToStr(i) + ':' + IntToStr(offset)); Memo1.Lines.Add(IntToStr(WMImageInfo.Width) + '*' + IntToStr(WMImageInfo.Height)); Memo1.Lines.Add(IntToStr(WMImageInfo.px) + '*' + IntToStr(WMImageInfo.py)); WilStream.Seek(offset + 8, 0); str := '' ; for y := 0 to WMImageInfo.Height -1 do begin for x := 0 to WMImageInfo.Width -1 do begin WilStream.Read(v,1); str := str + ' ' + IntToStr(v) end; str := str + #13#10; end; Memo1.Lines.Add(str); end; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if WilStream <> nil then WilStream.Free; if IndexSteam <> nil then IndexSteam.Free; end; end.
读WIL文件,显示其信息。
学到了,
记录里面的指针是在程序运行后的内存中存在的,要求OS建立分配的,而不在磁盘的文件,或者读到内存中的文件流里面存在。
记录里的那个指针是记录的数据结构,是抽象的,用SIZEOF 看它占了4BYTE的空间, 但是对应与实际的磁盘文件的这个位置是无效的,
memo 的一点点用法,其lines.add, #13#10回车换行
避免频繁的操作memo,它需要显示。可以操作一个字符串完成后再给MEMO。
对于指针的理解相当肤浅。