home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / pascal / o_gem / source / makefast / makefast.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-09-22  |  14.8 KB  |  427 lines

  1. {$IFDEF DEBUG}
  2.     {$B+,D+,G-,I-,L+,N-,P-,Q+,R+,S+,T-,V-,X+,Z+}
  3. {$ELSE}
  4.     {$B+,D-,G-,I-,L-,N-,P-,Q-,R-,S-,T-,V-,X+,Z+}
  5. {$ENDIF}
  6.  
  7. program MakeFast;
  8.   { Copyright (c)1994 by Softdesign Computer Software
  9.                                written by Thomas Much }
  10.   { wer sich eingehender mit den FastLoad-Flags beschäftigen
  11.     möchte, sollte sich einmal das ST-STE-TT-Profibuch ansehen! }
  12.  
  13. uses
  14.  
  15.     Tos,OTypes,OProcs,OWindows,ODialogs;
  16.  
  17. const
  18.  
  19.     {$I makefast.i}  { Konstanten für die Dialogbox }
  20.  
  21.     MVER         = '1.5';
  22.     MDATE        = '22.06.1994';
  23.  
  24.     PH_FASTLOAD  = 1;       { die Fastload-Flags... }
  25.     PH_LOADALT   = 2;
  26.     PH_MALLOCALT = 4;
  27.  
  28. type
  29.  
  30.     PH = record
  31.         ph_branch  : word;     { Programmheader }
  32.         ph_tlen,
  33.         ph_dlen,
  34.         ph_blen,
  35.         ph_slen,
  36.         ph_res1,
  37.         ph_prgflags: longint;
  38.         ph_absflag : word
  39.     end;
  40.  
  41.     TMFApplication = object(TApplication)
  42.         { der neue Anwendungs-Objekt-TYP }
  43.         procedure InitInstance; virtual;
  44.         procedure InitMainWindow; virtual;
  45.     end;
  46.  
  47.     PMFDialog  = ^TMFDialog;
  48.     TMFDialog = object(TDialog)
  49.         { der eigentliche Dialog }
  50.         ttmem          : integer;
  51.         datei,pfad,
  52.         ddfile         : string;
  53.         st1,st2,st3    : PStatic;
  54.         cb1,cb2,cb3    : PCheckBox;
  55.         pb1,pb2,pb3,pb4,
  56.         pb5,pb6,pb7,pb8: PButton;
  57.         phrec          : PH;
  58.         f              : file of PH;
  59.         procedure GetWindowClass(var AWndClass: TWndClass); virtual;
  60.         function GetIconTitle: string; virtual;
  61.         procedure SetupWindow; virtual;
  62.         function ExitDlg(AnIndx: integer): boolean; virtual;
  63.         function OK: boolean; virtual;
  64.         function Help: boolean; virtual;
  65.         function DDReadArgs(dSize: longint; PipeHnd,OrgID,mX,mY,KStat: integer): boolean; virtual;
  66.         procedure DDFinished(OrgID,mX,mY,KStat: integer); virtual;
  67.         { neue Routinen... }
  68.         procedure UpdateAmount;
  69.         procedure DisableAll;
  70.         procedure Load(fname:string);
  71.     end;
  72.  
  73. var
  74.  
  75.     MFApplication: TMFApplication;
  76.                                        { das Anwendungs-Objekt;
  77.                                          dies sollte das EINZIGE statische Objekt
  78.                                          sein, alle anderen werden normalerweise
  79.                                          dynamisch verwaltet! }
  80.  
  81.  
  82. procedure MFResource; external; {$L mfrsc.o}
  83.     { die Resource wird ins Programm eingebunden (wichtig für ACCs) }
  84.  
  85.  
  86. procedure TMFApplication.InitInstance;
  87.  
  88.     begin
  89.         { wird eine Anwendung das erste Mal in den Speicher geladen,
  90.           wird die Methode InitApplication aufgerufen, die u.a. die
  91.           boolean-Variable FirstInstance setzt; danach wird InitInstance
  92.           aufgerufen;
  93.           wird die Anwendung ein zweites Mal geladen (z.B. zuerst als ACC
  94.           und dann als Prg), wird NUR diese Methode InitInstance von
  95.           dem Konstruktor Init aufgerufen! }
  96.         InitResource(@MFResource,nil);
  97.         { die im Prg eingebundene Resource wird initialisiert;
  98.           soll das RSC-File nachgeladen werden, wird statt InitResource()
  99.           einfach LoadResource(datei) aufgerufen }
  100.         inherited InitInstance
  101.         { Standard-Initialisierungen, setzt Schnittstellenobjekt für
  102.           <Control>+<Q>-Tastenkombination und ruft InitMainWindow auf }
  103.     end;
  104.  
  105.  
  106. procedure TMFApplication.InitMainWindow;
  107.     var p: PMFDialog;
  108.  
  109.     begin
  110.         { InitMainWindow legt ein "ganz einfaches" GEM-Fenster an und wird
  111.           deshalb eigentlich immer überschrieben, um ein abgeleitetes Fenster-
  112.           objekt zu installieren;
  113.           dieser Aufruf ist insofern besonders, als daß wir kein FENSTER,
  114.           sondern einen DIALOG als "MainWindow" anmelden; dieser wird zwar
  115.           normalerweise in einem Fenster dargestellt, sollte allerdings kein
  116.           Fenster-Handle mehr verfügbar sein, macht ObjectGEM daraus auto-
  117.           matisch (zur Laufzeit) einen MODALEN Dialog! }
  118.         new(p,Init(nil,'ObjectGEM MakeFast',MFDLG));
  119.         { der Dialog trägt sich selbständig in die Fensterliste ein;
  120.           MainWindow zeigt immer auf das erste installierte TWindow-Objekt
  121.           (in diesem Fall auf einen Nachfahren);
  122.           dem Konstruktor wird das Parent-Objekt (in diesem Fall nil, es
  123.           existiert also kein Parent), der Fenstertitel und der Index des
  124.           Dialogbaums übergeben }
  125.         if (MainWindow=nil) or (ChkError<em_OK) then Status:=em_InvalidMainWindow
  126.             { irgendwas ist schiefgelaufen => nicht initialisieren;
  127.               ObjectGEM prüft dann, wie und ob (ACCs!) das Programm
  128.               verlassen wird }
  129.         else
  130.             begin
  131.                 { p zeigt auf den Dialog; nun werden die Schnittstellen-
  132.                   objekte initialisiert; diese tragen sich in die Liste
  133.                   der TControl-Objekte im Dialog-Objekt ein und werden
  134.                   dadurch beim freigeben des Dialogs automatisch mitge-
  135.                   löscht }
  136.                 { die Rückgabe-Pointer werden gespeichert, um später die
  137.                   Objekte mit ihren eigenen Methoden zu modifizieren! }
  138.                 p^.st1:=new(PStatic,Init(p,MFMINDT,0,false,'Gibt an, wieviel TT-RAM (Alternate RAM) dem Programm genügt, wenn mehr ST-RAM als TT-RAM vorhanden ist.'));
  139.                 p^.st2:=new(PStatic,Init(p,MFAMOUNT,8,false,'Gibt an, wieviel TT-RAM (Alternate RAM) dem Programm genügt, wenn mehr ST-RAM als TT-RAM vorhanden ist.'));
  140.                 p^.st2^.Style:=p^.st2^.Style and not(sts_Fill);
  141.                 { einfacher Text, übergeben wird u.a. die max. Länge des Textes+1
  142.                   (Nullbyte), einen boolean-Wert, der angibt, ob der Text unter-
  143.                   strichen wird, und der String für BubbleHelp (!);
  144.                   bringen Sie den Mauscursor doch mal über einen Button und
  145.                   drücken Sie dann <Help> ...!?!!! }
  146.                 p^.st3:=new(PStatic,Init(p,MFVER,39,false,'ObjectGEM MakeFast ist Freeware, d.h. Sie dürfen das Programm kostenlos kopieren und benutzen. Änderungen am Programm sind nicht erlaubt!'));
  147.                 p^.cb1:=new(PCheckBox,Init(p,MFFAST,true,'Bestimmt das FastLoad-Flag. Ist es gesetzt, wird beim Programmstart nur die BSS gelöscht. Das Flag sollte bei mindestens je einem Auto-Ordner-Programm und Accessory NICHT gesetzt sein!'));
  148.                 { ankreuzbare Box; der boolean-Wert gibt an, ob die CheckBox
  149.                   im "neuen" Stil gezeichnet wird; ist in der Resource das
  150.                   CROSSED-Attribut gesetzt, wird statt des Häkchens ein
  151.                   Kreuzchen verwendet }
  152.                 p^.cb2:=new(PCheckBox,Init(p,MFPROG,true,'Das Programm darf in das (schnelle) TT-RAM geladen werden. Vorsicht, wenn das Programm z.B. den Bildschirmspeicher verschiebt!'));
  153.                 p^.cb3:=new(PCheckBox,Init(p,MFMEM,true,'Malloc()-Anforderungen des Programms dürfen aus dem TT-RAM bedient werden. Vorsicht bei Programmen, die z.B. den Bildschirmspeicher verschieben!'));
  154.                 p^.pb1:=new(PButton,Init(p,MFDATEI,id_No,true,'Wählt ein neues Programm zum Bearbeiten aus.'));
  155.                 { ein PushButton }
  156.                 p^.pb2:=new(PButton,Init(p,MFMAKE,id_No,true,'Schreibt die neuen Werte in das ausgewählte Programm.'));
  157.                 p^.pb3:=new(PButton,Init(p,MFOK,id_OK,true,'Verläßt MakeFast.'));
  158.                 { id_OK bedeutet, daß dies der OK-Button ist;
  159.                   beim Anklicken wird dadurch die TDialog.OK-Methode aufgerufen }
  160.                 p^.pb4:=new(PButton,Init(p,MFLESS,id_No,false,'Vermindert den TT-RAM-Bedarf um 128 KB.'));
  161.                 p^.pb5:=new(PButton,Init(p,MFMORE,id_No,false,'Erhöht den TT-RAM-Bedarf um 128 KB.'));
  162.                 p^.pb6:=new(PButton,Init(p,MFHELP,id_Help,false,'Zeigt einen allg. Hilfstext an.'));
  163.                 p^.pb7:=new(PButton,Init(p,MFNAME,id_No,false,'Zeigt den Namen des Programms an. Durch Anklicken erhält man den vollen Namen incl. Pfad.'));
  164.                 p^.pb8:=new(PButton,Init(p,MFMINT,id_NoExit,true,'Ändert unter MiNT/MultiTOS die Memory-Protection-Flags. Z.Z. noch ohne Wirkung.'));
  165.                 {if not(Application^.MiNTActive) then...} p^.pb8^.Disable;
  166.                 p^.st3^.SetText('VERSION '+MVER+' VOM '+MDATE+' (FREEWARE!)');
  167.                 { Text setzen (TStatic-Methode) }
  168.                 p^.UpdateAmount;
  169.                 p^.DisableAll;
  170.                 if AppFlag then p^.MakeWindow
  171.                 { wenn wir kein ACC sind, wird das Fenster sofort
  172.                   geöffnet, sonst wartet ObjectGEM auf das Eintreffen
  173.                   einer AC_OPEN-Message }
  174.             end
  175.     end;
  176.  
  177.  
  178. procedure TMFDialog.GetWindowClass(var AWndClass: TWndClass);
  179.  
  180.     begin
  181.         inherited GetWindowClass(AWndClass);
  182.         { initialisiert die Dialog-Klasse;
  183.           wenn Sie dies vergessen, werden Sie die seltsamsten
  184.           Systemabstürze erleben (vertrauen Sie mir, ich weiß,
  185.           was ich erlebt habe...);
  186.           bei OOP kommt es oft vor, daß Vorfahren aufgerufen
  187.           werden; wann dies geschehen kann, muß oder unterbleiben
  188.           sollte, wird in der ObjectGEM-Dokumentation (bzw. in der
  189.           Online-Help) beschrieben sein }
  190.         with AWndClass do
  191.             Style:=Style or cs_CreateOnAccOpen
  192.         { da wir einen Dialog als "Hauptfenster" verwenden, müssen
  193.           wir ObjectGEM sagen, daß dieser Dialog bei einer AC_OPEN-
  194.           Message (also bei Anwahl des Accessory-Menüeintrags) ge-
  195.           öffnet werden soll; normalerweise werden in diesem Fall nur
  196.           Fenster geöffnet, da es recht störend ist, wenn alle irgend-
  197.           wann verwendeten Dialoge automatisch geöffnet werden;
  198.           andererseits können Sie natürlich auch Fenster vom auto-
  199.           matischen Öffnen ausnehmen, indem Sie das Flag in der Fenster-
  200.           Klasse löschen }
  201.     end;
  202.  
  203.  
  204. function TMFDialog.GetIconTitle: string;
  205.  
  206.     begin
  207.         GetIconTitle:='MAKEFAST'
  208.     end;
  209.  
  210.  
  211. procedure TMFDialog.SetupWindow;
  212.  
  213.     begin
  214.         { diese Methode wird vom Init-Konstruktor des Dialogs aufgerufen }
  215.         inherited SetupWindow;
  216.         { initialisiert Schnittstellenobjekte für <Control>+#<*>,
  217.           <Control>+<U>, <Control>+<W> etc. }
  218.         ttmem:=0;
  219.         { TT-RAM-Bedarf = minimal }
  220.         datei:='';
  221.         pfad:=''
  222.         { zu Anfang ist keine Datei geladen }
  223.     end;
  224.  
  225.  
  226. function TMFDialog.ExitDlg(AnIndx: integer): boolean;
  227.     var path,fname: string;
  228.  
  229.     begin
  230.         { beim Anklicken eines PushButtons wird die EndDlg-Methode
  231.           aufgerufen; diese versucht, den Button einem Schnittstellen-
  232.           objekt zuzuordnen (z.B. wird beim OK-Button [id_OK] auto-
  233.           matisch die OK-Methode [s.u.] aufgerufen);
  234.           konnte kein solches Schnittstellenobjekt gefunden werden,
  235.           wird diese ExitDlg-Methode aufgerufen;
  236.           liefert sie true zurück, wird der Dialog daraufhin verlassen }
  237.         case AnIndx of
  238.             MFNAME: Application^.Alert(@self,1,NO_ICON,'Datei:|"'+pfad+datei+'"','  &OK  ');
  239.             MFLESS: if ttmem>0 then
  240.                                 begin
  241.                                     dec(ttmem);
  242.                                     { TT-RAM-Bedarf um 128 KB verringern... }
  243.                                     UpdateAmount
  244.                                     { ... und Bedarf anzeigen }
  245.                                 end;
  246.             MFMORE: if ttmem<15 then
  247.                                 begin
  248.                                     inc(ttmem);
  249.                                     { TT-RAM-Bedarf erhöhen }
  250.                                     UpdateAmount
  251.                                 end;
  252.             MFDATEI: begin
  253.                        path:=pfad;
  254.                        fname:=datei;
  255.                        { neue Datei auswählen, laden und anzeigen... }
  256.                                if FileSelect(@self,'PRG,ACC,TOS ETC. AUSWÄHLEN','',path,fname,true) then Load(path+fname)
  257.                              end;
  258.             MFMAKE: begin
  259.                                 with phrec do
  260.                                     begin
  261.                                         ph_prgflags:=ph_prgflags and $0ffffff8;
  262.                                         { FastLoad-Flags zunächst ausmaskieren (löschen)... }
  263.                                         if cb1^.GetCheck=bf_Checked then
  264.                                             ph_prgflags:=ph_prgflags or PH_FASTLOAD;
  265.                                         if cb2^.GetCheck=bf_Checked then
  266.                                             ph_prgflags:=ph_prgflags or PH_LOADALT;
  267.                                         if cb3^.GetCheck=bf_Checked then
  268.                                             ph_prgflags:=ph_prgflags or PH_MALLOCALT;
  269.                                         PByte(@ph_prgflags)^:=PByte(@ph_prgflags)^ or (ttmem shl 4)
  270.                                         { ... und dann evtl. wieder setzen }
  271.                                     end;
  272.                                 reset(f);
  273.                                 write(f,phrec);
  274.                                 close(f);
  275.                                 { Datei aktualisieren }
  276.                                 DisableAll
  277.                                 { nun ist keine Datei mehr aktiv }
  278.                             end
  279.         end;
  280.         ExitDlg:=false
  281.         { Dialog NICHT verlassen }
  282.     end;
  283.  
  284.  
  285. function TMFDialog.OK: boolean;
  286.  
  287.     begin
  288.         Application^.Quit;
  289.         { Anwendung beenden (sobald der aktuelle Message-Loop
  290.           beendet ist)... }
  291.         OK:=true
  292.         { ... und vorher den Dialog verlassen }
  293.     end;
  294.  
  295.  
  296. function TMFDialog.Help: boolean;
  297.  
  298.     begin
  299.         Application^.Alert(@self,1,NOTE,'Bringen Sie den Mauscursor über das gewünschte Dialogelement und drücken Sie die <Help>-Taste (oder die rechte Maustaste...).','  &OK  ');
  300.         { dies ist die neue ObjectGEM-Alert-Routine! }
  301.         Help:=false
  302.         { Dialogbox nicht verlassen }
  303.     end;
  304.  
  305.  
  306. function TMFDialog.DDReadArgs(dSize: longint; PipeHnd,OrgID,mX,mY,KStat: integer): boolean;
  307.     var dummy: string;
  308.         zch  : char;
  309.  
  310.     begin
  311.         DDReadArgs:=false;
  312.         dummy:='';
  313.         while (dSize>0) and (length(dummy)<255) do
  314.             begin
  315.                 if fread(PipeHnd,1,@zch)<>1 then exit;
  316.                 dec(dSize);
  317.                 if zch=' ' then break
  318.                 else
  319.                     dummy:=dummy+zch
  320.             end;
  321.         inherited DDReadArgs(dSize,PipeHnd,OrgID,mX,mY,KStat);
  322.         { an dieser Stelle darf Load _nicht_ aufgerufen werden, da während des
  323.           Drag&Drop-Protokolls der Bildschirm nicht blockiert werden darf... }
  324.         ddfile:=dummy;
  325.         DDReadArgs:=true
  326.         { das erfolgt stattdessen in folgender Methode: }
  327.     end;
  328.  
  329.  
  330. procedure TMFDialog.DDFinished(OrgID,mX,mY,KStat: integer);
  331.     var dummy: string;
  332.  
  333.     begin
  334.         dummy:=ddfile; { sonst gibt es eine MEMORY VIOLATION (hardware) ?!? }
  335.         Load(dummy)
  336.     end;
  337.  
  338.  
  339. procedure TMFDialog.UpdateAmount;
  340.     const atxt : array [0..15] of string[7] =
  341.                             ('128 KB','256 KB','384 KB','512 KB','640 KB','768 KB',
  342.                              '896 KB','1 MB','1152 KB','1280 KB','1408 KB','1536 KB',
  343.                              '1664 KB','1792 KB','1920 KB','2 MB');
  344.  
  345.     begin
  346.         st2^.SetText(atxt[ttmem])
  347.         { TT-RAM-Bedarf anzeigen;
  348.           die TStatic-Methode SetText ruft automatisch die
  349.           von TControl geerbte Paint-Methode auf, die das Dialog-
  350.           element neu zeichnet, wenn der Dialog sichtbar ist }
  351.     end;
  352.  
  353.  
  354. procedure TMFDialog.DisableAll;
  355.  
  356.     begin
  357.         pb7^.SetText('');
  358.         pb7^.Disable;
  359.         { ... Dateinamen löschen }
  360.         st1^.Disable;
  361.         st2^.Disable;
  362.         cb1^.Disable;
  363.         cb2^.Disable;
  364.         cb3^.Disable;
  365.         pb2^.Disable;
  366.         pb4^.Disable;
  367.         pb5^.Disable
  368.         { ... und alle Buttons etc. nicht anwählbar machen }
  369.     end;
  370.  
  371.  
  372. procedure TMFDialog.Load(fname: string);
  373.     var cmp: string[4];
  374.  
  375.     begin
  376.         { nur bearbeiten, wenn die Datei existiert! }
  377.         cmp:=StrPRight(fname,4);
  378.         { falscher Dateityp? }
  379.         if (cmp<>'.PRG') and (cmp<>'.APP') and (cmp<>'.TOS') and (cmp<>'.TTP') and (cmp<>'.ACC') and (cmp<>'.GTP') and (cmp<>'.ACX') and (cmp<>'.PRX') then
  380.             if Application^.Alert(@self,WAIT,2,' Sind Sie sicher, daß| "'+fname+'"| ein ausführbares Programm ist?','&Ja| &Nein ')<>1 then exit;
  381.         BusyMouse;
  382.         pfad:=GetPath(fname);
  383.         datei:=StrPRight(fname,length(fname)-length(pfad));
  384.         pb7^.Enable;
  385.         pb7^.SetText('Date&i: '+datei);
  386.         { Datei öffnen und aktuelle Werte auslesen... }
  387.         assign(f,pfad+datei);
  388.         reset(f);
  389.         read(f,phrec);
  390.         close(f);
  391.         ttmem:=PByte(@phrec.ph_prgflags)^ shr 4;
  392.         st1^.Enable;
  393.         st2^.Enable;
  394.         { Texte aktivieren... }
  395.         UpdateAmount;
  396.         { ... und neue Werte anzeigen }
  397.         cb1^.Enable;
  398.         if bTst(phrec.ph_prgflags,PH_FASTLOAD) then cb1^.Check
  399.         else
  400.             cb1^.Uncheck;
  401.         { es gibt zwar auch eine SetCheck-Methode, aber so
  402.           ist es doch recht übersichtlich! }
  403.         cb2^.Enable;
  404.         if bTst(phrec.ph_prgflags,PH_LOADALT) then cb2^.Check
  405.         else
  406.             cb2^.Uncheck;
  407.         cb3^.Enable;
  408.         if bTst(phrec.ph_prgflags,PH_MALLOCALT) then cb3^.Check
  409.         else
  410.             cb3^.Uncheck;
  411.         pb2^.Enable;
  412.         pb4^.Enable;
  413.         pb5^.Enable;
  414.         ArrowMouse
  415.     end;
  416.  
  417.  
  418. begin
  419.   MFApplication.Init('MFST','MakeFast');
  420.   { Anwendung initialisieren;
  421.     übergeben wird eine Programm-Kennung und ein String, der bei
  422.     einem ACC als Menüeintrag verwendet wird }
  423.   MFApplication.Run;
  424.   { Programm ausführen... }
  425.   MFApplication.Done
  426.   { ... und korrekt verlassen! }
  427. end.