function Confirm(const AMsg: String): Boolean; begin
Result := MessageDlg(AMsg, mtConfirmation, mbYesNoCancel, 0) = idYes; end;
{ Non Event Handlers }
procedure TMainForm.LoadResources(ResList: TResourceList; Node: TTreeNode); var
I: Integer;
CNode: TTreeNode; begin for I := 0 to ResList.Count - 1 do with ResList[I] do begin
CNode := TreeView.Items.AddChildObject(Node, Name, ResList[I]); if IsList then begin
CNode.SelectedIndex := 1;
LoadResources(List, CNode); endelse begin
CNode.ImageIndex := ImageMap[ResList[I].ResType];
CNode.SelectedIndex := CNode.ImageIndex; end;
end; end;
procedure TMainForm.DisplayResources; begin
ListView.Items.Clear;
TreeView.Selected := nil;
TreeView.Items.Clear;
LoadResources(FExeFile.Resources, nil);
Caption := Format('%s - %s', [SFormCaption, AnsiLowerCaseFileName(FExeFile.FileName)]); with TreeView do begin
SetFocus;
Selected := Items[0]; end; end;
procedure TMainForm.UpdateViewPanel; var
R: TResourceItem; begin with TreeView do begin if Visible and Assigned(Selected) then begin
R := TResourceItem(Selected.Data); if R.IsList then UpdateListView(R.List) else begin case R.ResType of
rtBitmap, rtIconEntry, rtCursorEntry: begin
ImageViewer.Picture.Assign(R);
Notebook.PageIndex := 1; end;
rtString, rtMenu: begin
StringViewer.Lines.Assign(R);
StringViewer.SelStart := 0;
Notebook.PageIndex := 2; end else begin
HexDump.Address := R.RawData;
HexDump.DataSize := R.Size;
Notebook.PageIndex := 3; end; end; end;
UpdateStatusLine(R); end; end; end;
procedure TMainForm.UpdateListView(ResList: TResourceList); var
I: Integer; begin
ListView.Items.Clear; for I := 0 to ResList.Count-1 do with ResList[I], ListView.Items.Add do begin
Data := ResList[I];
Caption := Name;
SubItems.Add(Format('%.7x', [Offset]));
SubItems.Add(Format('%.5x', [Size]));
ImageIndex := ImageMap[ResType]; end;
Notebook.PageIndex := 0; end;
procedure TMainForm.UpdateStatusLine(ResItem: TResourceItem); begin if ResItem.IsList then begin
ListViewCaption.Caption := ' '+TreeView.Selected.Text;
StatusBar.Panels[0].Text := Format(' %d object(s)', [ListView.Items.Count]);
StatusBar.Panels[1].Text := Format(' Offset: %x', [ResItem.Offset]); endelse with ResItem do begin
ListViewCaption.Caption := Format(' %s: %s', [ResTypeStr, Name]);
StatusBar.Panels[0].Text := '';
StatusBar.Panels[1].Text := Format(' Offset: %x Size: %x', [Offset, Size]); end; end;
{ Form Initialization }
procedure TMainForm.FormCreate(Sender: TObject); begin
SplitControl := TSplitControl.Create(Self);
HexDump := CreateHexDump(TWinControl(NoteBook.Pages.Objects[3]));
FileOpenDialog.Filter := SOpenFilter;
FileSaveDialog.Filter := SSaveFilter;
Small.ResourceLoad(itBitmap, 'SmallImages', clOlive);
Large.ResourceLoad(itBitmap, 'LargeImages', clOlive);
Notebook.PageIndex := 0; if (ParamCount > 0) and FileExists(ParamStr(1)) then begin
Show;
FExeFile := TExeImage.CreateImage(Self, ParamStr(1));
DisplayResources; end; end;
{ Menu Event Handlers }
procedure TMainForm.FileOpen(Sender: TObject); var
TmpExeFile: TExeImage; begin with FileOpenDialog do begin ifnot Execute then Exit;
TmpExeFile := TExeImage.CreateImage(Self, FileName); if Assigned(FExeFile) then FExeFile.Destroy;
FExeFile := TmpExeFile;
DisplayResources; end; end;
procedure TMainForm.FileExit(Sender: TObject); begin
Close; end;
procedure TMainForm.ListViewEnter(Sender: TObject); begin with ListView do if (Items.Count > 1) and (Selected = nil) then begin
Selected := Items[0];
ItemFocused := Selected; end; end;
procedure TMainForm.SaveResource(Sender: TObject); var
ResItem: TResourceitem;
function TreeViewResourceSelected: Boolean; begin
Result := Assigned(TreeView.Selected) and
Assigned(TreeView.Selected.Data) and not TResourceItem(TreeView.Selected.Data).IsList; if Result then ResItem := TResourceItem(TreeView.Selected.Data); end;
function ListViewResourceSelected: Boolean; begin
Result := Assigned(ListView.Selected) and
Assigned(ListView.Selected.Data) and not TResourceItem(ListView.Selected.Data).IsList; if Result then ResItem := TResourceItem(ListView.Selected.Data); end;
begin if TreeViewResourceSelected or ListViewResourceSelected then with FileSaveDialog do begin
FilterIndex := ResFiltMap[ResItem.ResType]; if Execute then
ResItem.SaveToFile(FileName) end else
Error(SNoResSelected); end;
procedure TMainForm.SelectListViewType(Sender: TObject); begin
ListView.ViewStyle := TViewStyle(TComponent(Sender).Tag); end;
procedure TMainForm.ShowAboutBox(Sender: TObject); begin
About.ShowAboutBox; end;
procedure TMainForm.ToggleStatusBar(Sender: TObject); begin
StatusBar.Visible := not StatusBar.Visible; end;
procedure TMainForm.TreeViewChange(Sender: TObject; Node: TTreeNode); begin
UpdateViewPanel; end;
procedure TMainForm.ViewMenuDropDown(Sender: TObject); var
I: Integer; begin
miViewStatusBar.Checked := StatusBar.Visible; for I := 0 to miView.Count-1 do with miView.Items[I] do if GroupIndex = 1 then
Checked := (Tag = Ord(ListView.ViewStyle)); end;
procedure TMainForm.SplitterMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button = mbLeft) and (Shift = [ssLeft]) then
SplitControl.BeginSizing(Splitter, TreeViewPanel); end;
procedure TMainForm.SplitterMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer); begin with SplitControl doif Sizing then ChangeSizing(X, Y); end;
procedure TMainForm.SplitterMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin with SplitControl doif Sizing then EndSizing; end;
procedure TMainForm.NotebookEnter(Sender: TObject); var
Page: TWinControl; begin with NoteBook do begin
Page := TWinControl(Pages.Objects[PageIndex]); if (Page.ControlCount > 0) and (Page.Controls[0] is TWinControl) then
TWinControl(Page.Controls[0]).SetFocus; end; end;
procedure TMainForm.FormDestroy(Sender: TObject); begin
SplitControl.Free; end;
end.
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.