home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / tvision / hexview.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-12-15  |  20.1 KB  |  489 lines

  1. (* ---------------------------------------------------------------- *)
  2. (*                            HEXVIEW.PAS                           *)
  3. (*                                                                  *)
  4. (* Diese Unit stellt zwei Objekte, tHexMemWindow und tHexFileView-  *)
  5. (* Win bereit, die das Ansehen des Hauptspeichers oder einer Datei  *)
  6. (* hexadezimal und im Norton-Stil erlauben. Die eigentlichen Objekte*)
  7. (* dafür sind die von tScroller abstammenden tHexMemView und        *)
  8. (* tHexFileView, die von den Fensterobjekten eingefügt werden. Als  *)
  9. (* abstrakter Grundtyp dient tHexViewer. Die Funktion HexViewDialog *)
  10. (* kümmert sich um die Ausführung eines "FileOpen"-Dialoges und gibt*)
  11. (* einen Zeiger auf ein tHexFileWindow zurück.                      *)
  12. (* Die (Mini-)Hierarchie (Kommentare im Implementationsteil):       *)
  13. (*                                                                  *)
  14. (*  tView                                                           *)
  15. (*    tScroller                                                     *)
  16. (*       tHexViewer                                                 *)
  17. (*          tHexMemView                                             *)
  18. (*          tHexFileView                                            *)
  19. (*    tGroup                                                        *)
  20. (*       tWindow                                                    *)
  21. (*        tHexMemWindow                                             *)
  22. (*        tHexFileWindow                                            *)
  23. (*                                                                  *)
  24. (* (c) '91 by R.Reichert & DOS-toolbox                              *)
  25. (* ---------------------------------------------------------------- *)
  26. UNIT HexView;
  27.  
  28. INTERFACE
  29.  
  30. USES Objects, Views, Drivers, StdDlg, MsgBox, App;
  31.  
  32. CONST
  33.   thvMaxBufSize = MaxInt * 2 - 16;
  34.     { maximale Puffergrösse für tHexFileView }
  35.   MaxMemPerBuf  : WORD = 8;
  36.     { MaxMemPerBuf KB werden höchstens PRO tHexFileView-Objekt
  37.       benutzt }
  38.  
  39. TYPE
  40.   tViewBuffer = ARRAY [0..thvMaxBufSize] OF BYTE;
  41.  
  42.   pHexViewer = ^tHexViewer;
  43.   tHexViewer = OBJECT (tScroller)
  44.     FirstPos,
  45.     LastPos,
  46.     BufFirst,
  47.     BufLast,
  48.     MaxLength : LongInt;
  49.     Scroll    : BYTE;
  50.     Range     : INTEGER;
  51.     BufSize   : WORD;
  52.     Buffer    : ^tViewBuffer;
  53.  
  54.     CONSTRUCTOR Init
  55.       (VAR Bounds: tRect;
  56.        ahScrollBar, avScrollBar: pScrollBar);
  57.     PROCEDURE InitBuffer;                                     VIRTUAL;
  58.     PROCEDURE ScrollDraw;                                     VIRTUAL;
  59.     PROCEDURE Draw;                                           VIRTUAL;
  60.     PROCEDURE ScrollCalc (dy : LongInt);                      VIRTUAL;
  61.     PROCEDURE ReadBuffer (rPos : LongInt);                    VIRTUAL;
  62.   END;
  63.  
  64.   pHexMemView = ^tHexMemView;
  65.   tHexMemView = OBJECT (tHexViewer)
  66.     PROCEDURE InitBuffer;                                     VIRTUAL;
  67.     PROCEDURE ReadBuffer (rPos : LongInt);                    VIRTUAL;
  68.   END;
  69.  
  70.   pHexFileView = ^thexFileView;
  71.   tHexFileView = OBJECT (thexViewer)
  72.     f    : FILE;
  73.     CONSTRUCTOR Init
  74.       (VAR Bounds: tRect;
  75.        ahScrollBar, avScrollBar: pScrollBar;
  76.        FileName: STRING);
  77.     PROCEDURE InitBuffer;                                     VIRTUAL;
  78.     PROCEDURE ReadBuffer (rPos : LongInt);                    VIRTUAL;
  79.     DESTRUCTOR Done;                                          VIRTUAL;
  80.   END;
  81.  
  82.   pHexMemWindow = ^tHexMemWindow;
  83.   tHexMemWindow = OBJECT (tWindow)
  84.     CONSTRUCTOR Init (VAR Bounds: tRect; aNumber: INTEGER);
  85.   END;
  86.  
  87.   pHexFileWindow = ^tHexFileWindow;
  88.   tHexFileWindow = OBJECT (tWindow)
  89.     CONSTRUCTOR Init (VAR Bounds: tRect;
  90.                       aNumber: INTEGER; fName: STRING);
  91.   END;
  92.  
  93. FUNCTION ByteToHex (X: BYTE): STRING;
  94.  
  95. FUNCTION LongToHex (X: LongInt; Length: BYTE): STRING;
  96.  
  97. FUNCTION HexViewDialog (aNumber: INTEGER): pView;
  98.  
  99. IMPLEMENTATION
  100.  
  101. FUNCTION ByteToHex (X: BYTE): STRING;
  102.   CONST
  103.     HexTable : ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
  104.   VAR s: STRING;
  105. BEGIN
  106.   S := '';
  107.   s := HexTable [X DIV 16] + HexTable [X MOD 16];
  108.   ByteToHex := S;
  109. END;
  110.  
  111. FUNCTION LongToHex (X: LongInt; Length: BYTE): STRING;
  112.   TYPE
  113.     LongRec = RECORD  a, b, c, d: BYTE;  END;
  114.   VAR
  115.     S: STRING;
  116. BEGIN
  117.   S := ByteToHex (LongRec (X).D)+
  118.        ByteTohex (LongRec (X).C)+
  119.        ByteToHex (LongRec (X).B)+
  120.        ByteTohex (LongRec (X).A);
  121.   Delete (S, 1, 8-Length);
  122.   LongToHex := S;
  123. END;
  124.  
  125. (* ================================================================ *)
  126. (*                            tHexViewer                            *)
  127. (* ================================================================ *)
  128. (* tHexViewer ist der abstrakte Grundtyp für tHexMemView und tHex-  *)
  129. (* FileView. Die Felder im einzelnen: FirstPos gibt das erste darge-*)
  130. (* stellte Byte innerhalb des Fenster an; LastPos das letzte; Buf-  *)
  131. (* First und BufLast geben an, welcher Bereich sich im Speicher be- *)
  132. (* findet (für tHexMemView eigentlich überflüssig), wobei gilt:     *)
  133. (* BufLast >= FirstPos >= BufFirst; BufLast >= LastPos >= BufFirst; *)
  134. (* MaxLength gibt die Länge des Bereichs (der Datei) an; um Scroll  *)
  135. (* Zeilen wird jeweils gescrollt (siehe tHexMemView); Range gibt die*)
  136. (* Anzahl Zeilen an, die der vertikale Scrollbalken darstellt;      *)
  137. (* BufSize die Grösse des Puffers und Buffer schliesslich ist der   *)
  138. (* eigentliche Puffer.                                              *)
  139. (* ---------------------------------------------------------------- *)
  140. CONSTRUCTOR tHexViewer.Init
  141.   (VAR Bounds: tRect; ahScrollBar, avScrollBar: pScrollBar);
  142. BEGIN
  143.   tScroller.Init (Bounds, ahScrollBar, avScrollBar);
  144.   InitBuffer;
  145.   IF MaxLength <= 0 THEN Exit;   { MaxLength muss gesetzt werden ! }
  146.   FirstPos := 0;
  147.   LastPos := Size.Y*16;
  148.   ReadBuffer (0);
  149.   ScrollCalc (0);
  150.  
  151.   Range := MaxLength DIV (16 * Scroll);  
  152.   IF MaxLength MOD 16 > 0 THEN Inc (Range);
  153.   GrowMode := gfGrowHiX + gfGrowHiY;
  154.   SetLimit (78, Range);
  155.   IF Scroll > 1 THEN
  156.     vScrollBar^.SetRange (0, Range-Size.Y DIV 2);
  157. END;
  158.  
  159. (* ---------------------------------------------------------------- *)
  160. (* InitBuffer ist abstrakt und muss die Variablen BufFirst, BufLast,*)
  161. (* MaxLength, Scroll, BufSize und Buffer initialisieren.            *)
  162. (* ---------------------------------------------------------------- *)
  163. PROCEDURE tHexViewer.InitBuffer;
  164. BEGIN
  165. END;
  166.  
  167. (* ---------------------------------------------------------------- *)
  168. (* ScrollDraw ist in tScroller definiert. "Es stellt das Objekt     *)
  169. (* immer dann neu dar, wenn das Feld Value der verbundenen Roll-    *)
  170. (* balken sich infolge eines Maus- oder Tastatur-Ereignisses ändert.*)
  171. (* Solche Änderungen werden über den Vergleich von Delta.X mit      *)
  172. (* HScrollBar^.Value bzw. Delta.Y mit VScrollBar^.Value ermittelt.  *)
  173. (* Vor der Neuausgabe werden der Cursor neu positioniert und die neu*)
  174. (* ermittelten Werte in Delta gespeichert." (Soweit die Hilfe von   *)
  175. (* Turbo Pascal.) Anschliessend wird ScrollCalc aufgerufen, das die *)
  176. (* Berechnung von FirstPos und LastPos vornimmt. Dazu wird er-      *)
  177. (* mittelt, wieviele Zeilen gescrollt werden müssen. Das explizite  *)
  178. (* Typecasting ist notwendig, so die Variablen vom Typ Integer und  *)
  179. (* Byte sind.                                                       *)
  180. (* ---------------------------------------------------------------- *)
  181. PROCEDURE tHexViewer.ScrollDraw;
  182. BEGIN
  183.   IF Scroll > 1 THEN
  184.     vScrollBar^.SetRange (0, Range-Size.Y DIV 2);
  185.     { "Hochrechnung", falls mehr als 512KB dargestellt werden sollen }
  186.   ScrollCalc (LongInt ((vScrollBar^.Value-Delta.Y))*LongInt (Scroll));
  187.   tScroller.ScrollDraw;
  188. END;
  189.  
  190. (* ---------------------------------------------------------------- *)
  191. (* ScrollCalc berechnet FirstPos und LastPos neu und veranlasst das *)
  192. (* Lesen in den Puffer, wenn die neuen Werte nicht mehr im Puffer   *)
  193. (* liegen.                                                          *)
  194. (* ---------------------------------------------------------------- *)
  195. PROCEDURE tHexViewer.ScrollCalc (dy: LongInt);
  196. BEGIN
  197.   FirstPos := FirstPos + dy * 16;
  198.   IF FirstPos < 0 THEN FirstPos := 0;
  199.  
  200.   LastPos := FirstPos + Size.Y * 16;
  201.   IF LastPos > MaxLength THEN LastPos := MaxLength - 1;
  202.  
  203.   IF (FirstPos < BufFirst) OR (LastPos > BufLast) THEN
  204.     ReadBuffer (FirstPos);
  205. END;
  206.  
  207. (* ---------------------------------------------------------------- *)
  208. (* ReadBuffer ist abstrakt und hat ab der Position rPos BufSize     *)
  209. (* Bytes in den Puffer zu lesen.                                    *)
  210. (* ---------------------------------------------------------------- *)
  211. PROCEDURE tHexViewer.ReadBuffer (rPos: LongInt);
  212. BEGIN
  213. END;
  214.  
  215. (* ---------------------------------------------------------------- *)
  216. (* Draw übernimmt die Ausgabe, wobei die Methode des Vorgängers     *)
  217. (* nicht ausgerufen wird, da es selbst immer den ganzen Fensterraum *)
  218. (* ausfüllt. Zeile für Zeile wird Byte für Byte umgewandelt oder    *)
  219. (* durch Leerzeichen ersetzt, sollte LastPos überschritten worden   *)
  220. (* sein. Danach werden noch wie beim Norton Commander senkrechte    *)
  221. (* Trennstriche eingefügt, die ein besseres Abzählen der Byteposi-  *)
  222. (* tionen erlauben. Rechts aussen werden die Zeichen dargestellt.   *)
  223. (* ---------------------------------------------------------------- *)
  224. PROCEDURE tHexViewer.Draw;
  225.   VAR
  226.     y, i   : BYTE;
  227.     LineBeg: LongInt;
  228.     LineBuf: tDrawBuffer;
  229.     Line   : STRING;
  230. BEGIN
  231.   ScrollCalc (0); { nur zur Korrektur, falls nötig }
  232.   FOR y := 0 TO Size.Y-1 DO BEGIN
  233.     Line := '';
  234.     LineBeg := FirstPos + y * 16;
  235.     Line := LongToHex (LineBeg, 5)+ '  ';
  236.     FOR i := 0 TO 15 DO
  237.       IF LineBeg+i <= LastPos THEN
  238.         Line := Line + ByteToHex (Buffer ^[LineBeg-BufFirst+i])+ ' '
  239.       ELSE
  240.         Line := Line + '   ';
  241.     System.Insert ('│ ', Line, 20);
  242.     System.Insert ('│ ', Line, 34);
  243.     System.Insert ('│ ', Line, 48);
  244.     Line := Line + ' ';
  245.     FOR i := 0 TO 15 DO
  246.       IF LineBeg+i <= LastPos THEN
  247.         Line := Line + CHAR (Buffer ^[LineBeg-BufFirst+i])
  248.       ELSE
  249.         Line := Line + ' ';
  250.  
  251.     MoveBuf (LineBuf, Line [Delta.X+1],
  252.              GetColor (1), Length (Line)-Delta.X);
  253.     WriteLine (0, y, Size.X, 1, LineBuf);
  254.   END;
  255. END;
  256.  
  257. (* ================================================================ *)
  258. (*                         tHexMemView                              *)
  259. (* ================================================================ *)
  260. (* tHexMemView braucht nur InitBuffer und ReadBuffer, die beiden ab-*)
  261. (* strakten Methoden, zu überschreiben. InitBuffer setzt BufSize auf*)
  262. (* thvMaxBufSize. MemAvail braucht nicht überprüft zu werden, weil  *)
  263. (* kein Speicher reserviert, sondern nur Buffer umgebogen wird. Buf-*)
  264. (* First ist Null, BufLast BufSize. Es kann maximal 1MB dargestellt *)
  265. (* werden (MaxLength). Da die Scrollbalken nur mit Integer arbeiten *)
  266. (* und eine Zeile 16 Bytes darstellt, könnten eigentlich nur 512KB  *)
  267. (* (16*32767 DIV 1024) dargestellt werden. Durch den Faktor von     *)
  268. (* Scroll=2 ist ein MB möglich, allerdings wird auch immer um zwei  *)
  269. (* Zeilen gescrollt. Daher in tHexViewer.ScrollDraw auch die Multi- *)
  270. (* plikation mit Scroll (Anzahl Zeilen = ScrollBalken-Wert*2).      *)
  271. (* Dadurch entsteht das Problem, das man die letzten Zeilen vor der *)
  272. (* 1MB-Genze nicht anzeigen kann, da diese "Hochrechnung" bei Grenz-*)
  273. (* werten nicht funktioniert.                                       *)
  274. (* ---------------------------------------------------------------- *)
  275. PROCEDURE tHexMemView.InitBuffer;
  276. BEGIN
  277.   BufSize  := thvMaxBufSize;
  278.   BufFirst := 0;
  279.   BufLast  := BufSize;
  280.   MaxLength:= 1024 * 1024 - 32;
  281.   Scroll   := 2;
  282. END;
  283.  
  284. (* ---------------------------------------------------------------- *)
  285. (* ReadBuffer braucht nicht aus dem Speicher in den Speicher zu     *)
  286. (* lesen. Daher wird nur Buffer entsprechend rPos zurechtgebogen und*)
  287. (* BufFirst und BufLast neu gesetzt, da ein Zeiger auf eine Array-of*)
  288. (* Byte-Struktur nicht über die 64KB Grenze hinaus adressiert werden*)
  289. (* kann.                                                            *)
  290. (* ---------------------------------------------------------------- *)
  291. PROCEDURE tHexMemView.ReadBuffer (rPos: LongInt);
  292. BEGIN
  293.   BufFirst := rPos;
  294.   BufLast  := rPos + BufSize;
  295.   Buffer   := Ptr (rPos DIV 16, rPos MOD 16);
  296. END;
  297.  
  298. (* ================================================================ *)
  299. (*                            tHexFileView                          *)
  300. (* ================================================================ *)
  301. (* tHexFileView.Init hat ein Problem: Wird der übergebene Dateiname *)
  302. (* FileName in einer Variable abgelegt, die InitBuffer benutzen     *)
  303. (* soll, geht das nicht: tScroller.Init ruft tView.Init auf, das    *)
  304. (* alle Variablen auf Null (und somit den String leer) setzt. Aus   *)
  305. (* demselben Grund kann Init auch nicht vor dem Aufruf die Datei    *)
  306. (* öffnen und so f initialisieren, da auch diese Variable durch den *)
  307. (* Aufruf von tScroller.Init ungültig wird. Daher wird der Dateiname*)
  308. (* in der Konstanten fName zwischengespeichert.                     *)
  309. (* ---------------------------------------------------------------- *)
  310. CONST
  311.   fName : STRING = '';
  312.  
  313. CONSTRUCTOR tHexFileView.Init
  314.   (VAR Bounds: tRect; ahScrollBar, avScrollBar: pScrollBar;
  315.    FileName: STRING);
  316. BEGIN
  317.   fName := FileName;
  318.   tHexViewer.Init (Bounds, ahScrollBar, avScrollBar);
  319.   IF MaxLength = 0 THEN Fail;
  320. END;
  321.  
  322. (* ---------------------------------------------------------------- *)
  323. (* InitBuffer versucht die Datei fName zu öffnen. Schlägt der Ver-  *)
  324. (* such fehl, so wird in MaxLength -1 abgelegt, was Init bedeutet,  *)
  325. (* das das Objekt ungültig ist. Sonst werden die Variablen gesetzt. *)
  326. (* Dateien grösser als 1024KB sind aus den in tHexMemView.Init ge-  *)
  327. (* nannten Gründen der Einfachkeit halber nicht erlaubt. Bei der    *)
  328. (* Speicherbelegung für den Puffer wird dafür gesorgt, dass min-    *)
  329. (* destens LetFree KB Speicher freibleiben. Kann die Datei nicht ge-*)
  330. (* laden werden, so wird der Benutzer via MessageBox darüber infor- *)
  331. (* miert.                                                           *)
  332. (* ---------------------------------------------------------------- *)
  333. PROCEDURE tHexFileView.InitBuffer;
  334. BEGIN
  335.   {$I-}
  336.     Assign (f, fName);
  337.     ReSet (f, 1);
  338.   {$I+}
  339.   IF IoResult <> 0 THEN BEGIN
  340.     MaxLength := 0; 
  341.     MessageBox ('Die Datei konnte nicht geöffnet werden!',
  342.                 NIL, mfError+mfOkButton);
  343.     Exit;
  344.   END;
  345.  
  346.   MaxLength := FileSize (f);
  347.   Scroll := 1;
  348.   IF MaxLength > 1024*1024 THEN BEGIN
  349.     MaxLength := 0; 
  350.     MessageBox ('Die Datei ist zu gross (>512KB) !',
  351.                 NIL, mfError+mfOkButton);
  352.     Exit;
  353.   END ELSE
  354.     IF MaxLength > 512*1024 THEN
  355.       Scroll := 2;
  356.  
  357.   BufSize   := thvMaxBufSize;
  358.   IF BufSize > MaxLength THEN
  359.     BufSize := MaxLength;
  360.   IF BufSize > MaxMemPerBuf*1024 THEN
  361.     BufSize := MaxMemPerBuf*1024;
  362.   BufFirst  := 0;
  363.   BufLast   := BufSize;
  364.   GetMem (Buffer, BufSize);
  365. END;
  366.  
  367. (* ---------------------------------------------------------------- *)
  368. (* ReadBuffer liest den Puffer voll oder bis zum Ende der Datei, je *)
  369. (* nachdem, welche Position rPos bezeichnet.                        *)
  370. (* ---------------------------------------------------------------- *)
  371. PROCEDURE tHexFileView.ReadBuffer (rPos: LongInt);
  372. BEGIN
  373.   BufFirst := rPos;
  374.   Seek (f, rPos);
  375.   IF MaxLength-rPos > BufSize THEN BEGIN
  376.     BufLast := rPos+BufSize;
  377.     BlockRead (f, Buffer^, BufSize);
  378.   END ELSE BEGIN
  379.     BufLast := MaxLength;
  380.     BlockRead (f, Buffer^, MaxLength-rPos);
  381.   END;
  382. END;
  383.  
  384. (* ---------------------------------------------------------------- *)
  385. (* Done gibt den von Buffer belegten Speicher frei und schliesst    *)
  386. (* Datei.                                                           *)
  387. (*----------------------------------------------------------------- *)
  388. DESTRUCTOR tHexFileView.Done;
  389. BEGIN
  390.   tHexViewer.Done;
  391.   IF Buffer <> NIL THEN
  392.     FreeMem (Buffer, BufSize);
  393.   {$I-} Close (f); {$I+}
  394. END;
  395.  
  396. (* ================================================================ *)
  397. (*                             tHexMemWindow                        *)
  398. (* ================================================================ *)
  399. (* tHexMemWindow fügt ein tHexMemView-Objekt in die Gruppe ein, ver-*)
  400. (* sieht das Fenster mit einem Namen. Eine Nummer erhält es nicht.  *)
  401. (* ist das erzeugt Objekt gültig, so wird es in die Gruppe einge-   *)
  402. (* fügt, ansonsten wird Fail aufgerufen, und das Fenster dadurch    *)
  403. (* nicht in die Arbeitsfläche eingefügt.                            *)
  404. (* ---------------------------------------------------------------- *)
  405. CONSTRUCTOR tHexMemWindow.Init (VAR Bounds: tRect; aNumber: INTEGER);
  406.   VAR
  407.     R: tRect;
  408.     P: pView;
  409. BEGIN
  410.   tWindow.Init (Bounds, ' Memory Viewer ', aNumber);
  411.   R.Assign (1, 1, Size.X-1, Size.Y-1);
  412.   P := New (pHexMemView,
  413.             Init (R,
  414.                   StandardScrollBar (sbHorizontal+sbHandleKeyboard),
  415.                   StandardScrollBar (sbVertical+sbHandleKeyboard)));
  416.   IF Application^.ValidView (P) <> NIL THEN Insert (P)
  417.                                        ELSE Fail;
  418.   Options := Options OR ofTileable;
  419. END;
  420.  
  421. (* ================================================================ *)
  422. (*                          tHexFileView                            *)
  423. (* ================================================================ *)
  424. (* Init prüft nach dem Aufruf von tWindow.Init zunächst. Ist das er-*)
  425. (* zeugte tHexFileView-Objekt gültig, wird es in die Gruppe einge-  *)
  426. (* fügt, ansonsten ist das Fensterobjekt ungültig.                  *)
  427. (* ---------------------------------------------------------------- *)
  428. CONSTRUCTOR tHexFileWindow. Init (VAR Bounds: tRect;
  429.                                   aNumber: INTEGER; fName: STRING);
  430.   VAR
  431.     R: tRect;
  432.     P: pView;
  433. BEGIN
  434.   tWindow.Init (Bounds, ' FileViewer: '+FName, aNumber);
  435.   R.Assign (1, 1, Size.X-1, Size.Y-1);
  436.   P := New (pHexFileView,
  437.             Init (R,
  438.                   StandardScrollBar (sbHorizontal+sbHandleKeyboard),
  439.                   StandardScrollBar (sbVertical+sbHandleKeyboard),
  440.                   fName));
  441.   IF Application^.ValidView (P) <> NIL THEN Insert (P)
  442.                                        ELSE Fail;
  443.   Options := Options OR ofTileable;
  444. END;
  445.  
  446. (* ================================================================ *)
  447. (*                          DoHexViewDialog                         *)
  448. (* ================================================================ *)
  449. (* HexViewDialog führt einen "FileOpen"-Dialog durch. Wurde er nicht*)
  450. (* abgebrochen, so wird versucht, ein tHexFileWindow zu errichten,  *)
  451. (* unter Berücksichtigung der Sicherheitszone. Ist die Operation ge-*)
  452. (* lungen, so wird ein Zeiger auf das Objekt zurück gegeben, den der*)
  453. (* Aufrufer in die Arbeitsfläche oder auf Programmebene einfügen    *)
  454. (* kann. HexViewDialog tut dies nicht, damit der Aufrufer (meist das*)
  455. (* Programmobjekt) seine Fenster selber nummerieren kann; daher auch*)
  456. (* der Parameter aNumber.                                           *)
  457. (* ---------------------------------------------------------------- *)
  458. FUNCTION HexViewDialog (aNumber: INTEGER): pView;
  459.   VAR
  460.     fName : STRING;
  461.     Dialog: pFileDialog;
  462.     Win   : pHexFileWindow;
  463.     R     : tRect;
  464. BEGIN
  465.   HexViewDialog := NIL;
  466.   Dialog := New (pFileDialog, Init ('*.*', ' Datei auswählen ',
  467.                                     ' Dateiname ',
  468.                                     fdOkButton + fdOpenButton, 0));
  469.   IF Application^.ValidView (Dialog) <> NIL THEN BEGIN
  470.     IF Application^.ExecView (Dialog) <> cmCancel THEN BEGIN
  471.       Dialog^.GetFileName (FName);
  472.       R.Assign (0, 0, 60, 16);
  473.       Win := New (pHexFileWindow, Init (R, aNumber, fName));
  474.       IF Win <> NIL THEN BEGIN
  475.         Win^.Options := Win^.Options OR ofCentered;
  476.         HexViewDialog := Win;
  477.       END;
  478.     END;
  479.     Dispose (Dialog, Done);
  480.   END;
  481. END;
  482.  
  483. BEGIN
  484. END.
  485.  
  486. (* ---------------------------------------------------------------- *)
  487. (*                         Ende von HEXVIEW.PAS                     *)
  488. (* ---------------------------------------------------------------- *)
  489.