home *** CD-ROM | disk | FTP | other *** search
- (* **************************************************************** *)
- (* DIALOGBOX-BUILDER *)
- (* *)
- (* DlgBuild ist der "Slot", der sich um die Erstellung von Dialog- *)
- (* boxen kümmert. Ein neuer Dialog kann in die Arbeitsfläche einge- *)
- (* fügt werden, indem mit der rechten Maustaste der leere Desktop *)
- (* angeklickt wird oder über das Menü (siehe TOOL). Ein neues Ele- *)
- (* ment kann in den Dialog eingefügt werden, indem mit der rechten *)
- (* Maustaste die leere Dialogfläche angeklickt wird. Überarbeitet *)
- (* werden können Elemente und Dialog mit nochmaligem Klick der *)
- (* rechten Maustaste; das selektierte Element kann über Alt-B eben- *)
- (* falls bearbeitet werden; der selektierte Dialog über Alt-D. *)
- (* *)
- (* tWorkDialog ist das wichtigste Objekt dieser Unit. Es kümmert *)
- (* sich um das Speichern des Dialoges als Quellcode oder als Res- *)
- (* source und um das Einfügen von sogenannten "Templates", Gruppen, *)
- (* die entweder nur eine View (z.B. ein tStaticText) oder auch *)
- (* eine zusammengehörende Gruppe (z.B. ein tInputLine plus tHistory *)
- (* plus tLabel) enthalten. Damit ein modulares "Zusammenstecken" *)
- (* verschiedener Templates möglich ist, ohne dass tWorkDialog alle *)
- (* verschiedenen Elementarten (tStaticText, tInputLine etc) kennen *)
- (* muss, sind drei prozedurale Arrays nötig, die für jedes Element *)
- (* die zugehörigen drei Prozeduren aufnehmen müssen. Diese Pro- *)
- (* zeduren kümmern sich um das Speichern eines Elements, um den *)
- (* Dialog, in dem die Elementdaten eingegeben werden können, und um *)
- (* das Erstellen einer Kopie eines Elements. *)
- (* *)
- (* Die folgende Darstellung soll die interne Struktur dieser Units *)
- (* und die Abhängigkeiten der Objekte und Prozeduren untereinander *)
- (* zeigen, wobei Objekte mit einem doppelten Rahmen versehen sind *)
- (* und Prozeduren (bzw prozedurale Arrays) mit einem einfachen: *)
- (* *)
- (*┌────────────────────────────────────────────────────────────────┐*)
- (*│ H A U P T P R O G R A M M │*)
- (*└────────────────────────────────────────────────────────────────┘*)
- (* ⌡ │ *)
- (* ┌─────────────┐ │ *)
- (* │ Itemsmenu │ │ *)
- (* ┌ └─────────────┘ │ *)
- (* (2.) ⌡ ⌠ (1.) ⌡ *)
- (*┌──────────────────┐ │╔═══════════════╗ ┌─────────────────┐*)
- (*│ ItemsDialogArray │ «──┘║ tWorkDialog ║ ──» │ NewOrEditDialog │*)
- (*└──────────────────┘ ╚═══════════════╝ └─────────────────┘*)
- (* ⌠ ║ │ ^ ║ *)
- (* │ ║ │ ╚═════════════════════╣ *)
- (* │ ╚════════════» ╔═════════════╗ ║ *)
- (* └──────────────── ║ tTemplate ║ «══════════╝ *)
- (* ╚═════════════╝ *)
- (* *)
- (* ⌠⌡»«^ mussten als Pfeilspitzen herhalten. Doppelt gezeichnete *)
- (* Pfeil bedeuten, dass das Ziel manipuliert oder erstellt wird; *)
- (* einfache Pfeile bedeuten, dass die Prozedur aufgerufen wird; *)
- (* die einfach gezeichnete Verbindung zwischen tWorkDialog und *)
- (* tTemplate bedeutet, dass tWorkDialog diesen Objekttyp (und ihre *)
- (* Nachkommen sowie andere Objekte) enthält). Klar ersichtlich *)
- (* wird, dass tWorkDialog eine zentrale Rolle spielt, was sich in *)
- (* seiner HandleEvent-Methode niederschlägt: Sie muss unzählige *)
- (* Messages bearbeiten. Die Skizze vereinfacht die Struktur dieser *)
- (* Unit, zeigt aber doch die wichtigsten Grundrisse. So kann *)
- (* tWorkDialog ItemsMenu aufrufen (1.) oder ItemsMenu kann vom *)
- (* Systemmenü aus ausgeführt worden sein. Beide Male ist es tWork- *)
- (* Dialog, der sich um das Ausführen von ItemsDialogArray (2.) *)
- (* und um das Einfügen des erstellten Elementes kümmern muss. *)
- (* Auch wird ersichtlich, dass die Bindung zwischen Hauptprogramm *)
- (* und DLGBUILD bewusst locker gehalten wurde: Es wird fast nur *)
- (* über die zwei Prozeduren NewOrEditDialog und ItemsMenu ge- *)
- (* arbeitet und natürlich über Befehle. *)
- (* *)
- (* (c) 1992 by R.Reichert & DMV-Verlag *)
- (* **************************************************************** *)
- UNIT DlgBuild;
-
- {$F+}
-
- INTERFACE
-
- USES Objects, Drivers, Memory, HistList, Views,
- Dialogs, Menus, Fields, Editors, App, MsgBox, ToolCmds;
-
- TYPE
- pPoint = ^tPoint;
- pTextFile = ^Text;
-
- pStringColl = ^tStringColl;
- tStringColl = OBJECT (tStringCollection)
- FUNCTION Compare (Key1, Key2: POINTER): INTEGER; VIRTUAL;
- END;
-
- pSortedViewCollection = ^tSortedViewCollection;
- tSortedViewCollection = OBJECT (tSortedCollection)
- FUNCTION Compare (Key1, Key2: POINTER): INTEGER; VIRTUAL;
- END;
-
- pTemplate = ^tTemplate;
- tTemplate = OBJECT (tGroup)
- Client: pView; { die eigentliche View }
- MinSize, { minimale }
- MaxSize: tPoint; { und maximale Grösse }
- Name: pString; { der "Name" der Template }
- ID: INTEGER; { Erkennungsnummer (siehe Konstanten) }
- DelSelf: BOOLEAN; { wird nur bei Empfang von cmDeleteTempl
- auf TRUE gesetzt, damit der Destruktor
- entsprechend reagieren kann (siehe
- tExtendedTemplate.Done) }
-
- CONSTRUCTOR Init (aClient: pView;
- aMinSize,
- aMaxSize: tPoint;
- aName: STRING;
- aID: INTEGER);
- CONSTRUCTOR Load (VAR S: tStream);
- PROCEDURE Store (VAR S: tStream);
- PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
- PROCEDURE SetState (AState: Word; Enable: Boolean); virtual;
- PROCEDURE ChangeBounds (VAR Bounds: tRect); VIRTUAL;
- FUNCTION GetPalette: pPalette; VIRTUAL;
- FUNCTION Valid (Command: WORD): BOOLEAN; VIRTUAL;
- PROCEDURE Draw; VIRTUAL;
- DESTRUCTOR Done; VIRTUAL;
- END;
-
- pExtendedTemplate = ^tExtendedTemplate;
- tExtendedTemplate = OBJECT (tTemplate)
- ScrollBar: pScrollBar; { nur Referenzzeiger, werden bei der Ver- }
- History: pHistory; { schiebung benötigt }
- Lab: pLabel; { das Label wird in die Template eingefügt }
-
- CONSTRUCTOR Init (aClient: pView;
- aLabel: pLabel;
- aScrollBar: pScrollBar;
- aHistory: pHistory;
- aMinSize,
- aMaxSize: tPoint;
- aName: STRING;
- aID: INTEGER);
- CONSTRUCTOR Load (VAR S: tStream);
- PROCEDURE Store (VAR S: tStream);
- PROCEDURE Draw; VIRTUAL;
- PROCEDURE NewChangeBounds (R1, R2: tRect); VIRTUAL;
- PROCEDURE ChangeBounds (VAR Bounds: tRect); VIRTUAL;
- DESTRUCTOR Done; VIRTUAL;
- END;
-
- pWorkDialog = ^tWorkDialog;
- tWorkDialog = OBJECT (tDialog)
- Saved: BOOLEAN; { Dialog auf Stream/als Quelltext gespeichert ? }
-
- CONSTRUCTOR Init (VAR Bounds: tRect; aTitle: tTitleStr);
- CONSTRUCTOR Load (VAR S: tStream);
- PROCEDURE SetTitle (aTitle: STRING);
- PROCEDURE SaveAsResource (Where: POINTER; What: BYTE);
- PROCEDURE SaveAsSource (Where: POINTER;
- AsProcedure: BOOLEAN;
- What: BYTE);
- PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
- END;
-
- pWorkDialog_Dialog = ^tWorkDialog_Dialog;
- tWorkDialog_Dialog = OBJECT (tDialog)
- CONSTRUCTOR Init (Dlg: pDialog);
- PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
- FUNCTION Valid (Command: WORD): BOOLEAN; VIRTUAL;
- END;
-
- pTemplDialog = ^tTemplDialog;
- tTemplDialog = OBJECT (tDialog)
- PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
- FUNCTION Valid (Command: WORD): BOOLEAN; VIRTUAL;
- END;
-
- pClusterDialog = ^tClusterDialog;
- tClusterDialog = OBJECT (tTemplDialog)
- List: pStringCollection;
- ListBox: pListBox;
-
- CONSTRUCTOR Init (aTitle: tTitleStr;
- aList: pStringCollection;
- DelButton: BOOLEAN);
- PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
- END;
-
- ItemDialogProcedure = FUNCTION (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- InsertItemProcedure = PROCEDURE (Templ: pTemplate;
- Dialog: pDialog);
- SaveItemSourceProc = PROCEDURE (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
-
- PROCEDURE NewOrEditDialog (Dlg: pDialog);
-
- FUNCTION GetItemsMenu: pMenu;
-
- FUNCTION ItemsMenu (Where: tPoint): INTEGER;
-
- PROCEDURE OtherFieldsDialog (Dlg: pDialog);
-
-
- FUNCTION StaticTextDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION ButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION OkButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION CancelButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION YesButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION NoButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION HelpButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION InputLineDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION ListBoxDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION MemoDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION ClusterDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog;
- RadioButtons: BOOLEAN): STRING;
- FUNCTION CheckBoxesDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- FUNCTION RadioButtonsDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
-
-
- PROCEDURE InsertStaticText (Templ: pTemplate;
- Dialog: pDialog);
- PROCEDURE InsertButton (Templ: pTemplate;
- Dialog: pDialog);
- PROCEDURE InsertInputLine (Templ: pTemplate;
- Dialog: pDialog);
- PROCEDURE InsertListBox (Templ: pTemplate;
- Dialog: pDialog);
- PROCEDURE InsertMemo (Templ: pTemplate;
- Dialog: pDialog);
- PROCEDURE InsertCluster (Templ: pTemplate;
- Dialog: pDialog;
- RadioButtons: BOOLEAN);
- PROCEDURE InsertRadioButtons (Templ: pTemplate;
- Dialog: pDialog);
- PROCEDURE InsertCheckBoxes (Templ: pTemplate;
- Dialog: pDialog);
-
-
- PROCEDURE StaticTextSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- PROCEDURE ButtonSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- PROCEDURE InputLineSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- PROCEDURE ListBoxSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- PROCEDURE MemoSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- PROCEDURE ClusterSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl;
- TypeOfCluster: STRING);
- PROCEDURE RadioButtonsSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- PROCEDURE CheckBoxesSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
-
-
- PROCEDURE RegisterDlgBuild;
-
-
- CONST
- MinItemSize: tPoint = (X: 2; Y: 1); { min.Grösse für alle Items }
- MinButtonSize: tPoint = (X: 3; Y: 2); { für Buttons }
- MinLabelSize: tPoint = (X: 2; Y: 2); { für Items mit Labels }
- MaxItemSize: tPoint = (X: 80; Y: 25);{ max.Grösse für alle Items }
-
- { Item-Identifizierungsnummern: }
- idNoItem = -1; { kein Item; Menü abgebrochen }
- idStaticText = 0; { StaticText einfügen }
- idButton = 1; { Button einfügen }
- idOkButton = 2; { OK-Button einfügen }
- idCancelButton= 3; { Cancel-Button }
- idYesButton = 4; { Yes-BUtton }
- idNoButton = 5; { No-Button }
- idHelpButton = 6; { Help-Button }
- idInputLine = 7; { Eingabezeile plus Label einfügen }
- idListBox = 8; { Eine Listbox optional mit Scrollbalken }
- idMemo = 9; { Ein Memofeld optional mit Scrollbalken }
- idRadioButtons= 10; { RadioButtons plus Label }
- idCheckBoxes = 11; { CheckBoxes plus Label }
-
- cmStatictext = 5000; { Item-Menünummern: -> -5000 = Item-ID }
- cmButton = 5001;
- cmOkButton = 5002;
- cmCancelButton= 5003;
- cmYesButton = 5004;
- cmNoButton = 5005;
- cmHelpButton = 5006;
- cmInputLine = 5007;
- cmListBox = 5008;
- cmMemo = 5009;
- cmRadioButtons= 5010;
- cmCheckBoxes = 5011;
-
- { Befehle an tWorkDialog: }
- cmSaveDlgAsR = 7000; { cmSaveDialogAsResource }
- cmSaveInc = 1; { cmSaveIncFile, das das REZ-File benutzt }
- cmSaveRez = 2; { cmSaveRezFile, die eigentlichen Daten }
- cmSaveDlgAsP = 7003; { cmSaveDialogAsProcedure -> Source }
- cmSaveDlgAsO = 7004; { cmSaveDialogAsObject -> Source; Teile: }
- cmSaveDef = 1; { cmSave(Type)Definition }
- cmSaveCon = 2; { cmSaveConstructor }
- cmSavePrc = 3; { cmSaveProcedure, die das Objekt benutzt }
- cmSaveAll = 4; { cmSaveAll(these parts) }
- cmWhoIsDlg = 8000; { cmWhoIsDlgDialog with Name ... }
- cmDeleteDlg = 8001; { cmDeleteDialog }
- cmNewTempl = 8004; { cmNewTemplate in den Dialog einfügen }
- cmDeleteTempl= 8005; { cmDeleteTemplate bzw wieder entfernen }
-
- cmOtherF = 8010; { cmOtherFields (für tWorkDialog_Dialog) }
-
- { Befehle an tTemplate: }
- cmWhoIsTempl = 8002; { cmWhoIsTemplate with Name ... }
- cmEditTempl = 8006; { cmEditTemplate }
-
- { für tClusterDialog-Buttons: }
- cmNewItem = 9000; { neues Listenelement anfügen }
- cmEditItem = 9001; { Element bearbeiten }
- cmDeleteItem = 9002; { Element löschen }
-
- { für die SaveSourceArray-Prozeduren: }
- SaveTypeDef = 0; { Type-Definition speichern }
- SaveInsertDef= 1; { oder die Einfüge-Befehle }
-
- { Die prozeduralen Arrays für die Elemente: }
- ItemDialogArray : ARRAY [0..11] OF ItemDialogProcedure =
- (StaticTextDialog,
- ButtonDialog,
- OkButtonDialog,
- CancelButtonDialog,
- YesButtonDialog,
- NoButtonDialog,
- HelpButtonDialog,
- InputLineDialog,
- ListBoxDialog,
- MemoDialog,
- RadioButtonsDialog,
- CheckBoxesDialog);
- InsertItemArray : ARRAY [0..11] OF InsertItemProcedure =
- (InsertStaticText,
- InsertButton,
- InsertButton,
- InsertButton,
- InsertButton,
- InsertButton,
- InsertButton,
- InsertInputLine,
- InsertListBox,
- InsertMemo,
- InsertRadioButtons,
- InsertCheckBoxes);
- SaveSourceArray : ARRAY [0..11] OF SaveItemSourceProc =
- (StaticTextSource,
- ButtonSource,
- ButtonSource,
- ButtonSource,
- ButtonSource,
- ButtonSource,
- ButtonSource,
- InputLineSource,
- ListBoxSource,
- MemoSource,
- RadioButtonsSource,
- CheckBoxesSource);
-
- rTemplate: tStreamRec = (
- ObjType: 5000;
- VmtLink: Ofs (TypeOf (tTemplate)^);
- Load: @tTemplate.Load;
- Store: @tTemplate.Store);
- rExtendedTemplate: tStreamRec = (
- ObjType: 5001;
- VmtLink: Ofs (TypeOf (tExtendedTemplate)^);
- Load: @tExtendedTemplate.Load;
- Store: @tExtendedTemplate.Store);
- rWorkDialog: tStreamRec = (
- ObjType: 5002;
- VmtLink: Ofs (TypeOf (tWorkDialog)^);
- Load: @tWorkDialog.Load;
- Store: @tDialog.Store);
-
- IMPLEMENTATION
-
- CONST
- Lines : pStringColl = NIL; { Zur Speicherung des Quelltextes }
- InsertStr : STRING = ''; { entweder leer oder "Dialog^.",
- wird für tWorkDialog.SaveAs-
- Source benötigt }
- InputLineNo: INTEGER = 0; { für Nummerierung der TYPE-Felder bei }
- ListBoxNo : INTEGER = 0; { der Quelltexterzeugung durch tWork- }
- MemoNo : INTEGER = 0; { Dialog.SaveAsSource, damit keine iden- }
- ClusterNo : INTEGER = 0; { tischen Feldernamen entstehen }
-
- (* ---------------------------------------------------------------- *)
- (* Zahl in String umwandeln. Wird bei Quelltexterzeugung benötigt. *)
- (* ---------------------------------------------------------------- *)
- FUNCTION Int2Str (n: INTEGER): STRING;
- VAR S: string[5];
- BEGIN
- Str (n, s);
- Int2Str := s;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* KillInvalidChars entfernt alle nicht-Buchstaben und alle Zahlen, *)
- (* die vor dem ersten Buchstaben auftreten, aus s. Wird bei *)
- (* Quelltexterzeugung gebraucht, damit Prozedurnamen nicht *)
- (* ungültige Zeichen enthalten. *)
- (* ---------------------------------------------------------------- *)
- FUNCTION KillInvalidChars (s: STRING): STRING;
- VAR i: BYTE;
- BEGIN
- i := 0;
- WHILE i < Length (s) DO BEGIN
- Inc (i);
- IF s[i] = 'ü' THEN s[i] := 'u'; IF s[i] = 'Ü' THEN s[i] := 'U';
- IF s[i] = 'ö' THEN s[i] := 'o'; IF s[i] = 'Ö' THEN s[i] := 'O';
- IF s[i] = 'ä' THEN s[i] := 'a'; IF s[i] = 'Ä' THEN s[i] := 'A';
- IF NOT (((s[i] >= 'A') AND (s[i] <= 'Z')) OR
- ((s[i] >= 'a') AND (s[i] <= 'z')) OR
- ((s[i] >= '0') AND (s[i] <= '9') AND (i>1))) THEN BEGIN
- Delete (s, i, 1);
- Dec (i);
- END;
- END;
- KillInvalidChars := S;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* TypeDefinition wird sowohl von tWorkDialog.SaveAsSource als auch *)
- (* von tWorkDialog.SaveAsResource benötigt. Es speichert die Typen- *)
- (* definition, die in den vom Programm erzeugten Quelltext eingefügt*)
- (* werden soll. Title gibt den Namen des Dialoges an, ViewColl die *)
- (* Kollektion, die die Views des Dialoges enthält; in Data wird zu- *)
- (* rückgegeben, ob der Dialog überhaupt eine Typendefinition *)
- (* benötigt, und in DataName wird der Name des Datenrecords ge- *)
- (* liefert. Geschrieben wird in Lines, der unitprivaten String- *)
- (* kollektion, die vom Aufrufer initialisiert worden sein muss. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE TypeDefinition (Title: STRING;
- ViewColl: pSortedViewCollection;
- VAR Data: BOOLEAN;
- VAR DataName: STRING);
-
- PROCEDURE InsertTypeDef (P: pTemplate); FAR;
- BEGIN
- SaveSourceArray [P^.ID] (SaveTypeDef, P, Lines);
- END;
-
- VAR Delta: INTEGER;
-
- BEGIN
- DataName := KillInvalidChars (Title)+'Data';
- Lines^.Insert (NewStr (' TYPE'));
- Lines^.Insert (NewStr (' '+DataName+' = RECORD'));
- Delta := Lines^.Count;
- ViewColl^.ForEach (@InsertTypeDef);
- IF Lines^.Count = Delta THEN BEGIN
- Lines^.AtFree (Delta-1);
- Lines^.AtFree (Delta-2);
- Data := FALSE;
- END ELSE BEGIN
- Lines^.Insert (NewStr (' END;'));
- Lines^.Insert (NewStr (' '));
- Data := TRUE;
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Auch ExecuteDialog wird von den oben genannten Methoden benötigt.*)
- (* Es schreibt den Code zum Ausführen eines Dialoges, wobei Data *)
- (* wieder angibt, ob dieser Dialog Datenaustausch erledigt, und *)
- (* DataName für diesen Fall den Namen des Records enthält. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE ExecuteDialog (Data: BOOLEAN; DataName: STRING);
- BEGIN
- IF Data THEN BEGIN
- Lines^.Insert (NewStr (' { Datenrecord initialisieren ! }'));
- Lines^.Insert (NewStr (' FillChar (Data, SizeOf ('+DataName+'), 0);'));
- Lines^.Insert (NewStr (' Dialog^.SetData (Data); '));
- END;
- Lines^.Insert (NewStr (' Code := Desktop^.ExecView (Application^.ValidView (Dialog));'));
- Lines^.Insert (NewStr (' IF Code <> cmCancel THEN BEGIN'));
- Lines^.Insert (NewStr (' { cmCancel muss ev ersetzt werden }'));
- Lines^.Insert (NewStr (' { Code auswerten }'));
- IF Data THEN BEGIN
- Lines^.Insert (NewStr (' Dialog^.GetData (Data);'));
- Lines^.Insert (NewStr (' { Data muss ausgewertet werden ! }'));
- END;
- Lines^.Insert (NewStr (' END;'));
- Lines^.Insert (NewStr (' IF Dialog <> NIL THEN '));
- Lines^.Insert (NewStr (' Dispose (Dialog, Done);'));
- END;
-
- (* ---------------------------------------------------------------- *)
- (* GetItems erzeugt eine pSItem-Liste mit den Elementen aus der *)
- (* Stringkollektion Collection und wird bei der Erzeugung von *)
- (* tCluster-Nachkommen gebraucht, da im ClusterDialog die Elemente *)
- (* für den Cluster in eine Kollektion eingefügt werden. GetItems *)
- (* muss daher dieses "Type-Casting" vornehmen. *)
- (* ---------------------------------------------------------------- *)
- FUNCTION GetItems (Collection: pStringCollection): pSItem;
- VAR
- S, Root: pSItem;
- i: INTEGER;
- BEGIN
- IF Collection^.Count > 0 THEN BEGIN
- S := NewSItem (String (Collection^.Items^[0]^), NIL);
- Root := S;
- FOR i := 1 TO Collection^.Count-1 DO BEGIN
- S^.Next := NewSItem (String (Collection^.Items^[i]^), NIL);
- S := S^.Next;
- END;
- GetItems := Root;
- END ELSE
- GetItems := NIL;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* GetClientBounds errechnet die Begrenzungen des Client der *)
- (* Template Templ und gibt diese in Bounds zurück. Wird von einigen *)
- (* InsertItemArray-Prozeduren benötigt. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE GetClientBounds (Templ: pTemplate;
- VAR Bounds: tRect);
- VAR Client: pView;
- BEGIN
- Client := Templ^.Client;
- Bounds.A.X := Templ^.Origin.X + Client^.Origin.X;
- Bounds.B.X := Bounds.A.X + Client^.Size.X;
- Bounds.A.Y := Templ^.Origin.Y + Client^.Origin.Y;
- Bounds.B.Y := Bounds.A.Y + Client^.Size.Y;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* GetLabelBounds errechnet die Begrenzungen des Labels der *)
- (* Template Templ und gibt diese in Bounds zurück. Wird von einigen *)
- (* InsertItemArray-Prozeduren benötigt. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE GetLabelBounds (Templ: pTemplate;
- VAR Bounds: tRect);
- VAR Lab: pLabel;
- BEGIN
- Lab := pExtendedTemplate (Templ)^.Lab;
- Bounds.A.X := Templ^.Origin.X + Lab^.Origin.X;
- Bounds.B.X := Bounds.A.X + Lab^.Size.X;
- Bounds.A.Y := Templ^.Origin.Y + Lab^.Origin.Y;
- Bounds.B.Y := Succ (Bounds.A.Y);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* GetAssignString liefert die "R.Assign ( );"-Anweisung für die *)
- (* Begrenzungen, die in Bounds angegeben sind. Wird von den *)
- (* SaveSourceArray-Prozeduren benötigt. *)
- (* ---------------------------------------------------------------- *)
- FUNCTION GetAssignString (Bounds: tRect): STRING;
- BEGIN
- GetAssignString := ' R.Assign ('+Int2Str (Bounds.A.X)+', '+
- Int2Str (Bounds.A.Y)+', '+
- Int2Str (Bounds.B.X)+', '+
- Int2Str (Bounds.B.Y)+');';
- END;
-
- (* ================================================================ *)
- (* tStringColl *)
- (* ================================================================ *)
- (* Im Gegensatz zum Vorfahren, tStringCollection, fügt tStringColl *)
- (* die Strings unsortiert, dh in der Reihenfolge des Eintreffens, *)
- (* in die Kollektion ein. *)
- (* ---------------------------------------------------------------- *)
- FUNCTION tStringColl.Compare (Key1, Key2: POINTER): INTEGER;
- BEGIN
- Compare := -1;
- END;
-
- (* ================================================================ *)
- (* tSortedViewCollection *)
- (* ================================================================ *)
- (* tSortedViewCollection wird dazu benutzt, die Views eines Dialoges*)
- (* in die Reihenfolge zu bringen, in der sie (im Quellcode) in den *)
- (* Dialog eingefügt werden müssen, damit die Reihenfolge für die *)
- (* Selektierung per "TAB" stimmt. Anders ausgedrückt: Da die Dialog-*)
- (* elemente von tWorkDialog frei verschiebar sind, stimmt die *)
- (* Reihenfolge des Einfügens nicht mit der "sichtbaren" überein, dh *)
- (* nicht mit "von rechts nach links und von oben nach unten". Das *)
- (* muss aber gewährleistet sein, soll ein Dialog als Quellcode oder *)
- (* als Ressource gespeichert werden und per "TAB" eine Selektierung *)
- (* der Elemente möglich sein. *)
- (* ---------------------------------------------------------------- *)
- FUNCTION tSortedViewCollection.Compare (Key1, Key2: POINTER): INTEGER;
- VAR View1, View2: pView;
- BEGIN
- View1 := Key1; View2 := Key2;
- IF (View1^.Origin.Y < View2^.Origin.Y) THEN Compare := -1
- ELSE IF (View1^.Origin.Y > View2^.Origin.Y) THEN Compare := 1
- ELSE IF (View1^.Origin.X < View2^.Origin.X) THEN Compare := -1
- ELSE IF (View1^.Origin.X > View2^.Origin.X) THEN Compare := 1
- ELSE Compare := 0;
- END;
-
- (* ================================================================ *)
- (* tTemplate *)
- (* ================================================================ *)
- (* tTemplate ist eine Gruppe, die einen "Namen" und eine "Kenn- *)
- (* nummer" hat. Die Kennummer ist eine der "IDXXX"-Konstanten. *)
- (* aClient ist die View, die auf den Namen aName *)
- (* hören soll und die typmässig zu aID passen muss, damit die *)
- (* richtigen Prozeduren der Prozeduren-Arrays aufgerufen werden. *)
- (* Dass nicht direkt z.B. ein Button in den tWorkDialog eingefügt *)
- (* wird, sondern eine Template, die diesen Button enthält, liegt *)
- (* daran, dass die Template samt Client verschoben und vergrössert *)
- (* werden kann (über Ziehen mit beiden Maustasten gedrückt). Das *)
- (* laubt eine beliebige Positionierung und Grösseneinstellung. *)
- (* ---------------------------------------------------------------- *)
- CONSTRUCTOR tTemplate.Init (aClient: pView;
- aMinSize,
- aMaxSize: tPoint;
- aName: STRING;
- aID: INTEGER);
- VAR R: tRect;
- BEGIN
- aClient^.GetBounds (R);
- tGroup.Init (R);
- Client := aClient;
- ID := aID;
- MaxSize := aMaxSize;
- MinSize := aMinSize;
- Options := Client^.Options OR (ofTopSelect + ofFirstClick);
- (* --------------------------------------------------------------
- sie muss sich in den Vordergrund setzen, sobald sie selektiert
- wird. Dh, die Elemente werden mit TAB in der Reihenfolge se-
- lektiert, in der sie mit der Maus angeklickt wurden. So ist
- es schon vor dem Speichern möglich, die Selektierungs-Reihen-
- folge richtig einzustellen (was für das Speichern NICHT nötig
- ist, da es automatisch getan wird).
- -------------------------------------------------------------- *)
- State := Client^.State; { wird übernommen }
- DragMode:= dmDragGrow; { eine Template ist vergrösserbar }
- Client^.Origin.X := 0;
- Client^.Origin.Y := 0;
- Client^.Size := Size;
- Insert (Client);
- Name := NewStr (aName);
- DelSelf := FALSE;
- END;
-
- CONSTRUCTOR tTemplate.Load (VAR S: tStream);
- BEGIN
- tGroup.Load (S);
- GetSubViewPtr (S, Client);
- S.Read (MaxSize, SizeOf (MaxSize));
- S.Read (MinSize, SizeOf (MinSize));
- Name := S.ReadStr;
- S.Read (ID, SizeOf (ID));
- DelSelf := FALSE;
- SetState (sfSelected, FALSE);
- { die Objekte halten sich alle für selektiert, wenn sie geladen
- werden. Dem wird hier abgeholfen. }
- END;
-
- PROCEDURE tTemplate.Store (VAR S: tStream);
- BEGIN
- tGroup.Store (S);
- PutSubViewPtr (S, Client);
- S.Write (MaxSize, SizeOf (MaxSize));
- S.Write (MinSize, SizeOf (MinSize));
- S.WriteStr (Name);
- S.Write (ID, SizeOf (ID));
- END;
-
- PROCEDURE tTemplate.Draw;
- BEGIN
- tView.Draw; { damit der Hintergergrund gelöscht wird }
- tGroup.Draw;
- END;
-
- FUNCTION tTemplate.GetPalette: pPalette;
- BEGIN
- GetPalette := NIL; { Aufruf an den Owner weiterleiten }
- END;
-
- FUNCTION tTemplate.Valid (Command: WORD): BOOLEAN;
- BEGIN
- Valid := True;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* HandleEvent reagiert auf den Broadcast cmWhoIsTempl mit dem Auf- *)
- (* ruf von ClearEvent, sofern Event.InfoPtr^ mit Name^ überein- *)
- (* stimmt und auf cmEditTempl bzw das Anklicken mit der rechten *)
- (* Maustaste oder auf das Drücken von Alt-B mit dem Aufruf der *)
- (* ItemDialogArray-Prozedur. Wird das Objekt mit beiden Maustasten *)
- (* angeklickt, so kann es verschoben oder vergrössert werden. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tTemplate.HandleEvent (VAR Event: tEvent);
- CONST
- Templ: pTemplate = NIL;
- VAR
- MouseInTemplate,
- PointInDeskTop: tPoint;
- R, Limits: tRect;
- ResizeMode: BOOLEAN;
- S: STRING;
- BEGIN
- IF (Event.What = evBroadCast) THEN
- IF (Event.Command = cmWhoIsTempl) AND
- (String (Event.InfoPtr^) = Name^) THEN
- ClearEvent (Event);
-
- IF ((Event.What = evMouseDown) AND
- (Event.Buttons = mbRightButton)) OR
- ((Event.What = evBroadCast) AND
- (Event.Command = cmEditTempl) AND
- (String (Event.InfoPtr^) = Name^)) OR
- ((Event.What = evKeyDown) AND
- (Event.KeyCode = kbAltB)) THEN BEGIN
- Select;
- Templ := @Self;
-
- S := ItemDialogArray [ID] (NIL, Templ, pWorkDialog (Owner));
-
- ClearEvent (Event);
- IF (S <> '') AND (S <> Name^) THEN BEGIN
- DisposeStr (Name);
- Name := NewStr (S); { den neuen Namen übernehmen }
- END;
- IF S = '' THEN BEGIN
- DelSelf := TRUE;
- { der Dekonstruktor von tExtendedTemplate muss wissen, ob der
- Dialog aufgelöst wird und somit z.B. ein History-Objekt
- von dem Dekonstruktor des Dialoges entfernt wird, oder
- aber, ob nur die Template gelöscht wird. Dann muss das
- History-Objekt selbst entfernt werden. }
- Message (Owner, evCommand, cmDeleteTempl, @Self);
- Exit;
- END;
- END;
-
- GetBounds (R);
- Owner^.MakeLocal (Event.Where, PointInDeskTop);
- IF (Event.What = evMouseDown) AND
- (Event.Buttons = mbLeftButton+mbRightButton) AND
- (R.Contains (PointInDeskTop)) THEN BEGIN
- Select;
- MakeLocal (Event.Where, MouseInTemplate);
- ResizeMode := (MouseInTemplate.X+1 = Size.X) AND
- (MouseInTemplate.Y+1 = Size.Y);
- Owner^.GetExtent (Limits);
- Limits.Grow (-1, -1);
- IF ResizeMode THEN
- DragView (Event, dmDragGrow, Limits, MinSize, MaxSize)
- ELSE
- DragView (Event, dmDragMove, Limits, MinSize, MaxSize);
- DrawView;
- ClearEvent (Event);
- END;
-
- tGroup.HandleEvent (Event);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Nicht ganz einsichtig, aber Tatsache: Nach einem Aufruf von *)
- (* "tTemplate.SetState (sfFocused, FALSE);" wird der nächste, *)
- (* "tTemplate.SetState (sfSelected, FALSE);" nicht mehr an den *)
- (* Client weitergeleitet, weshalb das hier von Hand erledigt wird. *)
- (* Diese beiden Aufrufe erfolgen automatisch, sobald ein Objekt den *)
- (* Fokus abgegeben soll. Damit nun der Client nicht selektiert und *)
- (* somit hervorgehoben bleibt, wird sein SetState explizit auf- *)
- (* gerufen. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tTemplate.SetState (aState: WORD; Enable: BOOLEAN);
- BEGIN
- Client^.SetState (aState, Enable);
- tGroup.SetState (aState, Enable);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Der Client ist nur von einer Grössenänderung betroffen, weshalb *)
- (* seine Grösse mit der der Template gleichgesetzt wird. Der Client *)
- (* von tTemplate füllt also immer die ganze Template aus! (Im Gegen-*)
- (* satz zu dem Client einer tExtendedTemplate.) *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tTemplate.ChangeBounds (VAR Bounds: tRect);
- BEGIN
- tGroup.ChangeBounds (Bounds);
- Client^.Size := Size;
- END;
-
- DESTRUCTOR tTemplate.Done;
- BEGIN
- DisposeStr (Name);
- tGroup.Done;
- END;
-
- (* ================================================================ *)
- (* tExtendedTemplate *)
- (* ================================================================ *)
- (* tExtendedTemplate ist eine Template, die zusätzlich zum Client *)
- (* noch ein tLabel-Objekt aufnehmen und mit einem tHistory- sowie *)
- (* tScrollBar-Objekt kommunizieren kann. tExtendedTemplate wird *)
- (* für zusammengesetzte Dialogelemente wie Eingabezeilen, Listen *)
- (* etc verwendet. Damit das Label beim Client bleibt, muss "New- *)
- (* ChangeBounds" die Begrenzungen etwas aufwendig errechnen und *)
- (* ausserdem den Scrollbalken und das History-Objekt von einer Ver- *)
- (* schiebung oder Grössenänderung informieren. *)
- (* Init wurde vollständig überschrieben, dh es wird nicht der *)
- (* Konstruktor des Vorgängers aufgerufen, sondern tGroup.Init, da *)
- (* tTemplate.Init die Client-Werte falsch setzen würde. *)
- (* ---------------------------------------------------------------- *)
- CONSTRUCTOR tExtendedTemplate.Init (aClient: pView;
- aLabel: pLabel;
- aScrollBar: pScrollBar;
- aHistory: pHistory;
- aMinSize,
- aMaxSize: tPoint;
- aName: STRING;
- aID: INTEGER);
- VAR R1, R2: tRect;
- BEGIN
- R1.Assign (0, 0, 10, 1);
- tGroup.Init (R1); { diese Misseinstellung wird durch }
- Client := aClient; { den Aufruf von NewChangeBounds }
- Lab := aLabel; { (unten) korrigiert }
- ScrollBar:= aScrollBar;
- History := aHistory;
- MaxSize := aMaxSize;
- MinSize := aMinSize;
- ID := aID;
- Options := aClient^.Options OR (ofTopSelect + ofFirstClick);
- State := aClient^.State;
- DragMode := dmDragGrow;
- aClient^.GetBounds (R1);
- aLabel^.GetBounds (R2);
- Insert (Lab);
- Insert (Client);
- NewChangeBounds (R1, R2);
- NewChangeBounds (R1, R2);
- Name := NewStr (aName);
- END;
-
- CONSTRUCTOR tExtendedTemplate.Load (VAR S: tStream);
- BEGIN
- tTemplate.Load (S);
- GetPeerViewPtr (S, ScrollBar);
- GetPeerViewPtr (S, History);
- GetSubViewPtr (S, Lab);
- END;
-
- PROCEDURE tExtendedTemplate.Store (VAR S: tStream);
- BEGIN
- tTemplate.Store (S);
- PutPeerViewPtr (S, ScrollBar);
- PutPeerViewPtr (S, History);
- PutSubViewPtr (S, Lab);
- END;
-
- PROCEDURE tExtendedTemplate.Draw;
- BEGIN
- tTemplate.Draw;
- IF History <> NIL THEN BEGIN
- IF History^.Link = NIL THEN
- History^.Link := pInputLine (Client);
- History^.DrawView;
- END;
- IF ScrollBar <> NIL THEN
- ScrollBar^.DrawView;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* NewChangeBounds "weiss" nicht, ob das Label oder der Client *)
- (* weiter links oder oben stehen, weshalb die Gesamtausdehnung der *)
- (* beiden Objekte zusammen ermittelt werden muss. Anschliessend *)
- (* werden für den Client und das Label und die neuen Werte gesetzt, *)
- (* die relativ zum Origin von tExtendedTemplate angegeben werden *)
- (* müssen. Die zugehörige ItemsDialogArray-Prozedur muss das bei *)
- (* der Ausgabe der Werte berücksichtigen ! (Beispiel InputLine) *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tExtendedTemplate.NewChangeBounds (R1, R2: tRect);
- VAR R: tRect;
- BEGIN
- IF R1.A.Y < R2.A.Y THEN R.A.Y := R1.A.Y
- ELSE R.A.Y := R2.A.Y;
- IF R1.A.X < R2.A.X THEN R.A.X := R1.A.X
- ELSE R.A.X := R2.A.X;
- IF R1.B.Y > R2.B.Y THEN R.B.Y := R1.B.Y
- ELSE R.B.Y := R2.B.Y;
- IF R1.B.X > R2.B.X THEN R.B.X := R1.B.X
- ELSE R.B.X := R2.B.X;
- Dec (R1.A.X, R.A.X); Dec (R1.A.Y, R.A.Y);
- Dec (R1.B.X, R.A.X); Dec (R1.B.Y, R.A.Y);
- Dec (R2.A.X, R.A.X); Dec (R2.A.Y, R.A.Y);
- Dec (R2.B.X, R.A.X); Dec (R2.B.Y, R.A.Y);
- Client^.ChangeBounds (R1);
- Lab^.ChangeBounds (R2);
- ChangeBounds (R);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* ChangeBounds muss nun auch das History-Objekt und den Scroll- *)
- (* balken berücksichtigen und entsprechend ihre Position und Aus- *)
- (* dehnung verändern. Dabei wird angenommen, dass Label-Objekte *)
- (* sowie Scrollbalken immer rechts vom Client stehen, weshalb nicht *)
- (* beide gleichzeitig verwendet werden können ! Bei einer Ver- *)
- (* grösserung wird nur der Client vergrössert, nicht aber das Label,*)
- (* da z.B. ja nur das Memofeld vergrössert werden soll. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tExtendedTemplate.ChangeBounds (VAR Bounds: tRect);
- VAR R: tRect;
- p: tPoint;
- dx, dy: INTEGER;
- BEGIN
- IF (Origin.X = Bounds.A.X) AND (Origin.Y = Bounds.A.Y) THEN BEGIN
- dx := Origin.X + Client^.Origin.X + Client^.Size.X - Bounds.B.X;
- dy := Origin.Y + Client^.Origin.Y + Client^.Size.Y - Bounds.B.Y;
- Client^.GetBounds (R);
- Dec (R.B.X, dx);
- Dec (R.B.Y, dy);
- Client^.ChangeBounds (R);
- END;
-
- tGroup.ChangeBounds (Bounds);
-
- IF History <> NIL THEN BEGIN
- p.X := Origin.X + Client^.Origin.X + Client^.Size.X;
- p.Y := Origin.Y + Client^.Origin.Y;
- R.Assign (P.X, P.Y,
- P.X+3, P.Y+1);
- History^.Hide;
- History^.ChangeBounds (R);
- History^.Show;
- END;
- IF ScrollBar <> NIL THEN BEGIN
- R.A.X := Origin.X + Client^.Origin.X + Client^.Size.X;
- R.B.X := Succ (R.A.X);
- R.A.Y := Origin.Y + Client^.Origin.Y;
- R.B.Y := R.A.Y + Client^.Size.Y;
- ScrollBar^.Hide;
- ScrollBar^.ChangeBounds (R);
- ScrollBar^.Show;
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* DelSelf ist TRUE, wenn die Template den Befehl cmDeleteTempl er- *)
- (* halten hat. In diesem Fall wird nicht der Dialog aufgelöst, *)
- (* sondern es soll nur die Template entfernt werden. Mit ihr müssen *)
- (* aber auch History und ScrollBar aus dem Dialog entfernt werden! *)
- (* ---------------------------------------------------------------- *)
- DESTRUCTOR tExtendedTemplate.Done;
- BEGIN
- IF DelSelf THEN BEGIN
- IF History <> NIL THEN BEGIN
- Owner^.Delete (History);
- Dispose (History, Done);
- END;
- IF ScrollBar <> NIL THEN BEGIN
- Owner^.Delete (ScrollBar);
- Dispose (ScrollBar, Done);
- END;
- END;
- tTemplate.Done;
- END;
-
- (* ================================================================ *)
- (* tWorkDialog *)
- (* ================================================================ *)
- (* tWorkDialog ist ein Dialog, der vergrössert werden kann und der *)
- (* sich und seine Templates als Quellcode oder auf Ressource *)
- (* speichern kann. Sein Titel, seine Position und Ausdehnung sowie *)
- (* weitere Felder können in dem "tWorkDialog_Dialog" eingestellt *)
- (* werden. Wie aus der Strukturabbildung am Anfang des Quelltextes *)
- (* hervorgeht, ist tWorkDialog die Drehscheibe dieser Unit, die *)
- (* fast alles andere direkt oder indirekt steuert. Der Hauptteil *)
- (* der Arbeit fällt HandleEvent zu; SaveAsSource und SaveAsRessource*)
- (* sind für das Speichern zuständig. *)
- (* ---------------------------------------------------------------- *)
- CONSTRUCTOR tWorkDialog.Init (VAR Bounds: tRect; aTitle: tTitleStr);
- BEGIN
- tDialog.Init (Bounds, aTitle);
- Flags := Flags OR wfGrow;
- Saved := FALSE;
- END;
-
- CONSTRUCTOR tWorkDialog.Load (VAR S: tStream);
- BEGIN
- tDialog.Load (S);
- Saved := FALSE;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Ist What gleich cmSaveRez, so wird Where als Zeiger auf ein *)
- (* tResourceFile-Objekt interpretiert, und das Objekt wird unter *)
- (* dem Namen Title^ als normaler Dialog gespeichert. Falls What *)
- (* cmSaveInc ist, so wird Where als Zeiger auf eine Text-Datei ver- *)
- (* standen, und es werden die Befehle gespeichert, die nötig sind, *)
- (* um den Dialog aus der Ressourcendatei zu laden und ihn auszu- *)
- (* führen. Diese beiden getrennt gespeicherten "Teile" gehören fest *)
- (* zusammen! *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tWorkDialog.SaveAsResource (Where: POINTER;
- What: BYTE);
- CONST
- t : pTextFile = NIL;
- VAR
- RezFile: pResourceFile;
- ViewColl: pSortedViewCollection;
- Dialog: pDialog;
- R: tRect;
-
- PROCEDURE WriteLineToFile (Line: pString); FAR;
- BEGIN
- Writeln (t^, Line^);
- END;
-
- (* -------------------------------------------------------------- *)
- (* SaveIncFile schreibt in t^ (Where^) die Befehle zum Laden und *)
- (* Ausführen des in die Ressourcendatei gespeicherten Dialoges. *)
- (* Die Prozedur erhält den Namen "(Title^)+Dialog", wobei un- *)
- (* gültige Zeichen von KillInvalidChars entfernt werden. *)
- (* Es wird angenommen, dass in dem Programm, in das die Dialog- *)
- (* prozedur eingebunden wird, ein Objekt namens RezFile vom Typ *)
- (* tResourceFile existiert. Aus dieser Ressourcendatei wird das *)
- (* Dialogobjekt geladen. *)
- (* -------------------------------------------------------------- *)
- PROCEDURE SaveIncFile;
- VAR
- Data: BOOLEAN;
- DataName: STRING;
- BEGIN
- InputLineNo := 0;
- ListBoxNo := 0;
- MemoNo := 0;
- ClusterNo := 0;
-
- Lines := New (pStringColl, Init (200, 10));
- Lines^.Duplicates := TRUE;
-
- Lines^.Insert (NewStr ('PROCEDURE '+KillInvalidChars (Title^)+'Dialog; '));
- TypeDefinition (Title^, ViewColl, Data, DataName);
- Lines^.Insert (NewStr (' VAR '));
- Lines^.Insert (NewStr (' Dialog: pDialog; '));
- IF Data THEN
- Lines^.Insert (NewStr (' Data: '+DataName+';'));
- Lines^.Insert (NewStr (' Code: INTEGER;'));
- Lines^.Insert (NewStr (' R: tRect; '));
- Lines^.Insert (NewStr ('BEGIN '));
- Lines^.Insert (NewStr (' Dialog := pDialog (RezFile.Get ('''+Title^+''')); '));
- Lines^.Insert (NewStr (' '));
- ExecuteDialog (Data, DataName);
- Lines^.Insert (NewStr ('END; '));
-
- Lines^.ForEach (@WriteLineToFile);
- Dispose (Lines, Done);
- END;
-
- (* -------------------------------------------------------------- *)
- (* Fügt der ViewColl (tSortedViewCollection) die Template P hinzu,*)
- (* sofern P eine Template ist. *)
- (* -------------------------------------------------------------- *)
- PROCEDURE AddViewToColl (P: pTemplate); FAR;
- BEGIN
- IF (TypeOf (p^) = TypeOf (tTemplate)) OR
- (TypeOf (p^) = TypeOf (tExtendedTemplate)) THEN
- ViewColl^.Insert (P);
- END;
-
- (* -------------------------------------------------------------- *)
- (* AddToDialog fügt die Template P (P muss jetzt eine Template *)
- (* sein, was durch AddViewToColl sichergestellt wird) in den neu *)
- (* erstellten Dialog "Dialog" ein. Das übernehmem die Prozeduren *)
- (* des InsertItemArrays, die den Client der Template P in den *)
- (* Dialog "Dialog" einfügen. Dass nicht einfach der Client der *)
- (* Template eingefügt werden kann, liegt daran, dass seine Pos. *)
- (* nur relativ zum Origin der Template, nicht aber zum Origin des *)
- (* Dialoges ist. Ausserdem muss für pExtendedTemplate-Objekt das *)
- (* History- oder ScrollBar-Objekt "von Hand" mit in dem Dialog *)
- (* eingefügt werden. *)
- (* -------------------------------------------------------------- *)
- PROCEDURE AddToDialog (P: pTemplate); FAR;
- BEGIN
- InsertItemArray [P^.ID] (P, Dialog);
- END;
-
- BEGIN
- ViewColl := New (pSortedViewCollection, Init (20, 10));
- ForEach (@AddViewToColl);
-
- GetBounds (R);
- Dialog := New (pDialog, Init (R, Title^));
- Dialog^.State := State+sfModal; { Jeder erzeugte Dialog ist modal }
- Dialog^.Flags := Flags-wfGrow; { und darf nicht "wachsen" }
- Dialog^.Options := Options; { Options kann übernommen werden }
- ViewColl^.ForEach (@AddToDialog);
-
- IF What = cmSaveRez THEN BEGIN
- Dialog^.SelectNext (FALSE);
- RezFile := pResourceFile (Where);
- RezFile^.Put (Dialog, Title^);
- IF (RezFile^.Stream^.Status <> 0) THEN BEGIN
- MessageBox (^C'Fehler beim Speichern des Objekts !',
- NIL, mfError+mfOkButton);
- END;
- END ELSE IF What = cmSaveInc THEN BEGIN
- t := pTextFile (Where);
- SaveIncFile;
- END;
-
- Dispose (Dialog, Done);
- FreeMem (ViewColl^.Items, ViewColl^.Limit * SizeOf (Pointer));
- Dispose (ViewColl); { Done wird NICHT aufgerufen, da sonst die
- Templates freigegeben würden ! Daher muss
- der Zeigerarray Items "von Hand" freigege-
- ben werden. }
- ShowCursor;
- { der Cursor verschwindet (warum auch immer) beim Speichern }
- END;
-
- (* ---------------------------------------------------------------- *)
- (* SaveAsSource speichert den Dialog als Quellcode. Ist AsProcedure *)
- (* TRUE, so wird in Where, das als Zeiger auf eine Textdatei inter- *)
- (* pretiert wird, der Code für eine Prozedur geschrieben, die einen *)
- (* Dialog anlegt, alle Elemente einfügt und den Dialog ausführt. *)
- (* Ist AsProcedure hingegen FALSE, so wird in Abhängigkeit von What *)
- (* - die Objekt- und Datenrecord-Definition, *)
- (* - der Konstruktor des Dialogobjekts oder *)
- (* - die Prozedur, die dieses Objekt benutzt, geschrieben. *)
- (* Dass diese Teile getrennt geschrieben werden können, liegt daran,*)
- (* dass bei der Erzeugung eines vollständigen Programms diese Teile *)
- (* an verschiedenen Stellen geschrieben werden müssen. Soll nur ein *)
- (* Dialog gespeichert werden, so können auch alle drei Teile anein- *)
- (* ander gespeichert werden, und die so erzeugte Datei könnte über *)
- (* {$I NAME.PAS} ins Programm eingebunden werden. *)
- (* Da sich die Speicherung von als Objekt oder als Prozedur zum Teil*)
- (* überschneidet, wurden kleine "Blocks" (Prozeduren) gebildet, die *)
- (* einen Teil des Quellcodes schreiben. So braucht SaveAsSource nur *)
- (* noch, in Abhängigkeit von AsProcedure, diese Blocks in der *)
- (* jeweiligen Reihenfolge schreiben zu lassen. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tWorkDialog.SaveAsSource (Where: POINTER;
- AsProcedure: BOOLEAN;
- What: BYTE);
- CONST
- VarConstructor = 0;
- VarProcedure = 1;
- VarMixed = 2;
-
- VAR
- DialogName: STRING; { Name des Dialogs }
- DataName: STRING; { Name des Datenrecords }
- ViewColl: pSortedViewCollection; { die sortierten Templates }
- Data: BOOLEAN; { ob überhaupt ein Datenrecord
- gebraucht wird }
- t: pTextFile; { die Datei, in die
- geschrieben wird }
-
- PROCEDURE AddViewToColl (P: pTemplate); FAR;
- BEGIN
- IF (TypeOf (p^) = TypeOf (tTemplate)) OR
- (TypeOf (p^) = TypeOf (tExtendedTemplate)) THEN
- ViewColl^.Insert (P);
- END;
-
- PROCEDURE ProcedureDefinition;
- BEGIN
- Lines^.Insert (NewStr ('PROCEDURE '+KillInvalidChars (Title^)+'Dialog;'));
- END;
-
-
- PROCEDURE VarDefinition (Kind: INTEGER);
- BEGIN
- Lines^.Insert (NewStr (' VAR'));
- Lines^.Insert (NewStr (' R: tRect;'));
- IF Kind <> VarMixed THEN
- Lines^.Insert (NewStr (' View: pView;'));
- IF Kind <> VarConstructor THEN BEGIN
- IF Data THEN
- Lines^.Insert (NewStr (' Data: '+DataName+';'));
- Lines^.Insert (NewStr (' Code: INTEGER;'));
- Lines^.Insert (NewStr (' Dialog: pDialog;'));
- END;
- END;
-
- PROCEDURE WriteBegin;
- BEGIN
- Lines^.Insert (NewStr ('BEGIN'));
- END;
-
- PROCEDURE DialogDefinition (DialogType: STRING);
- BEGIN
- Lines^.Insert (NewStr (' R.Assign ('+Int2Str (Origin.X)+', '+
- Int2Str (Origin.Y)+', '+
- Int2Str (Origin.X+Size.X)+', '+
- Int2Str (Origin.Y+Size.Y)+');'));
- Lines^.Insert (NewStr (' Dialog := New ('+DialogType+', '+
- 'Init (R, '''+Title^+'''));'));
- END;
-
- PROCEDURE FieldManipulations (InConstructor: BOOLEAN);
- VAR s: STRING;
- BEGIN
- IF InConstructor THEN s := ' '
- ELSE s := ' Dialog^.';
- { Falls die Felder von den Standardwerten eines Dialoges
- abweichen, werden sie direkt gesetzt. }
- IF Flags <> 7 THEN
- Lines^.Insert (NewStr (s+'Flags := '+Int2Str (Flags)+';'));
- IF Options <> 67 THEN
- Lines^.Insert (NewStr (s+'Options := '+Int2Str (Options)+';'));
- IF State <> $879 THEN { sfmodal nicht dabei }
- Lines^.Insert (NewStr (s+'State := '+Int2Str (State)+';'));
- END;
-
- PROCEDURE InsertItemDef (P: pTemplate); FAR;
- BEGIN
- SaveSourceArray [P^.ID] (SaveInsertDef, P, Lines);
- Lines^.Insert (NewStr (' '));
- END;
-
- PROCEDURE InsertItems (InConstructor: BOOLEAN);
- BEGIN
- IF NOT InConstructor THEN
- InsertStr := 'Dialog^.'
- ELSE
- InsertStr := '';
- ViewColl^.ForEach (@InsertItemDef);
- Lines^.Insert (NewStr (' '+InsertStr+'SelectNext (FALSE);'));
- END;
-
- PROCEDURE WriteEnd;
- BEGIN
- Lines^.Insert (NewStr ('END;'));
- END;
-
- PROCEDURE EmptyLine;
- BEGIN
- Lines^.Insert (NewStr (' '));
- END;
-
- PROCEDURE ObjectDefinition;
- BEGIN
- DialogName := KillInvalidChars (Title^)+'Dialog';
- IF NOT Data THEN
- Lines^.Insert (NewStr ('TYPE'));
- Lines^.Insert (NewStr (' p'+DialogName+' = ^t'+DialogName+';'));
- Lines^.Insert (NewStr (' t'+DialogName+' = OBJECT (tDialog)'));
- Lines^.Insert (NewStr (' CONSTRUCTOR Init (VAR Bounds: tRect; aTitle: tTitleStr);'));
- Lines^.Insert (NewStr (' END;'));
- END;
-
- PROCEDURE ConstructorDefinition;
- BEGIN
- Lines^.Insert (NewStr ('CONSTRUCTOR t'+DialogName+'.Init (VAR Bounds: tRect; aTitle: tTitleStr);'));
- END;
-
- PROCEDURE ParentInit;
- BEGIN
- Lines^.Insert (NewStr (' tDialog.Init (Bounds, aTitle);'));
- END;
-
- PROCEDURE WriteLineToFile (Line: pString); FAR;
- BEGIN
- Writeln (t^, Line^);
- END;
-
- BEGIN
- t := pTextFile (Where);
- InputLineNo := 0;
- ListBoxNo := 0;
- MemoNo := 0;
- ClusterNo := 0;
-
- Lines := New (pStringColl, Init (200, 10));
- Lines^.Duplicates := TRUE;
-
- ViewColl := New (pSortedViewCollection, Init (20, 10));
- ViewColl^.Duplicates := TRUE;
- ForEach (@AddViewToColl);
-
- IF AsProcedure THEN BEGIN
- ProcedureDefinition;
- TypeDefinition (Title^, ViewColl, Data, DataName);
- VarDefinition (VarProcedure);
- WriteBegin;
- DialogDefinition ('pDialog');
- FieldManipulations (FALSE);
- EmptyLine;
- InsertItems (FALSE);
- EmptyLine;
- ExecuteDialog (Data, DataName);
- WriteEnd;
- END ELSE BEGIN
- IF (What = cmSaveDef) OR (What = cmSaveAll) THEN BEGIN
- TypeDefinition (Title^, ViewColl, Data, DataName);
- ObjectDefinition;
- EmptyLine;
- END;
-
- IF (What = cmSaveCon) OR (What = cmSaveAll) THEN BEGIN
- ConstructorDefinition;
- VarDefinition (VarConstructor);
- WriteBegin;
- ParentInit;
- FieldManipulations (TRUE);
- InsertItems (TRUE);
- WriteEnd;
- EmptyLine;
- END;
-
- IF (What = cmSavePrc) OR (What = cmSaveAll) THEN BEGIN
- ProcedureDefinition;
- VarDefinition (VarMixed);
- WriteBegin;
- DialogDefinition ('p'+DialogName);
- EmptyLine;
- ExecuteDialog (Data, DataName);
- WriteEnd;
- END;
- END;
-
- Lines^.ForEach (@WriteLineToFile);
- Dispose (Lines, Done);
- FreeMem (ViewColl^.Items, ViewColl^.Limit * SizeOf (Pointer));
- Dispose (ViewColl);
- END;
-
- PROCEDURE tWorkDialog.SetTitle (aTitle: STRING);
- BEGIN
- IF Title <> NIL THEN
- DisposeStr (Title);
- Title := NewStr (aTitle);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* HandleEvent ist ziemlich komplex und muss auf einige Ereignisse *)
- (* reagieren: *)
- (* ■ Befehle: *)
- (* - cmEditGroup *)
- (* - cmGetItemsMenu *)
- (* - cmNewTempl *)
- (* - cmStaticText, cmButton, cmInputLine etc *)
- (* - cmDeleteTempl *)
- (* - cmClose *)
- (* - cmSaveDlgAsXXX *)
- (* ■ Broadcast: *)
- (* - cmWhoIsDlg *)
- (* ■ Rechte Maustaste *)
- (* - auf oberen Rahmenrand *)
- (* - auf leere Dialogfläche *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tWorkDialog.HandleEvent (VAR Event: tEvent);
- CONST
- Where: tPoint = (X: 0; Y: 0);
- VAR
- MousePos: tPoint;
- ID: INTEGER;
- Item: pView;
- Templ: pTemplate;
- Min, Max: tPoint;
- Name: STRING;
- Code: INTEGER;
- BEGIN
- (* --------------------------------------------------------------
- Zusätzlich zu dem Shotcut Alt-G aus dem Systemmenü soll ein
- Dialog (und nur ein Dialog; nicht irgendeine andere Gruppe)
- auch über Alt-D bearbeitet werden können.
- -------------------------------------------------------------- *)
- IF (Event.What = evKeyDown) AND
- (Event.KeyCode = kbAltD) THEN BEGIN
- Message (@Self, evCommand, cmEditGroup, NIL);
- ClearEvent (Event);
- END;
- (* --------------------------------------------------------------
- Falls mit der rechten Maustaste der oberen Rahmenrand ange-
- klickt wurde oder der Befehl cmEditGroup eintrifft, wird
- NewOrEditDialog zum Editieren der Dialogdaten aufgerufen.
- -------------------------------------------------------------- *)
- MakeLocal (Event.Where, MousePos);
- IF ((Event.What = evMouseDown) AND
- (Event.Buttons = mbRightButton) AND
- (MousePos.Y = 0)) OR
- ((Event.What = evCommand) AND
- (Event.Command = cmEditGroup)) THEN BEGIN
- Select;
- NewOrEditDialog (@Self);
- ClearEvent (Event);
- END;
-
- IF (Event.What = evCommand) THEN
- CASE Event.Command OF
- (* ----------------------------------------------------------
- Auf cmGetItemsMenu hin wird über GetItemsMenu ein Menü mit
- den einzufügenden Elementen erzeugt, das vom Hauptprogramm
- in das Systemmenü eingefügt wird. Siehe auch
- TOOL.tCaseToolApp.GetItemsMenu.
- ---------------------------------------------------------- *)
- cmGetItemsMenu:
- BEGIN
- pMenu (Event.InfoPtr^) := GetItemsMenu;
- ClearEvent (Event);
- END;
- (* ----------------------------------------------------------
- cmNewTempl wird von tWorkDialog_Dialog abgesetzt. Handle-
- Event führt das ItemsMenu im linken oberen Ecken des
- Dialoges aus und schickt dann den Befehl ID (also cm-
- StaticText, cmButton etc) an sich selbst, damit der zuge-
- hörige Dialog ausgeführt wird (siehe unten).
- ---------------------------------------------------------- *)
- cmNewTempl:
- BEGIN
- Where.X := Origin.X+1; Where.Y := Origin.Y+2;
- Item := NIL;
- ID := ItemsMenu (Where);
- IF ID <> idNoItem THEN
- Message (@Self, evCommand, ID, NIL);
- { "ID" ist eigentlich falsch, denn ItemsMenu liefert
- nur den zugehörigen cmXXX-Wert. Erst der folgende
- Teil der HandleEvent-Methode wandelt diesen Wert
- in den IDXXX-Wert um. }
- ClearEvent (Event);
- END;
- (* ----------------------------------------------------------
- cmStaticText, cmButton etc werden entweder direkt vom
- Systemmenü oder aber durch das Drücken der rechten Maus-
- taste im leeren Dialogbereich (siehe weiter unten) aus-
- gelöst. Ist letzteres der Fall, so muss Event.InfoPtr auf
- die Konstante Where zeigen, sonst wird angenommen, dass
- der Befehl aus dem Menü stammt, und Where wird mit
- Standardwerten belegt, Event.InfoPtr mit @Where. Die Pro-
- zeduren von *ItemDialogArray* erwarten einen Positionsvor-
- schlag, weshalb ein Zeiger auf Event.InfoPtr übergeben
- wird. Wurde von der ID entsprechenden Prozedur eine
- Template erstellt, so wird sie in den Dialog eingefügt.
- ---------------------------------------------------------- *)
- cmStaticText,
- cmButton,
- cmOkButton,
- cmCancelButton,
- cmYesButton,
- cmNoButton,
- cmHelpButton,
- cmInputLine,
- cmListBox,
- cmMemo,
- cmRadioButtons,
- cmCheckBoxes:
- BEGIN
- Item := NIL;
- Templ:= NIL;
- ID := Event.Command - cmStaticText;
- { Menübefehl - 5000 = ID des Objekts }
- IF Event.InfoPtr <> @Where THEN BEGIN
- Where.X := 1; Where.Y := 1;
- END;
- Name := ItemDialogArray [ID] (@Where, Templ, @Self);
- IF Templ <> NIL THEN BEGIN
- Insert (Templ);
- (* ----------------------------------------------------
- es wird davon ausgegangen, dass das Objekt Templ
- einer Sicherheitsprüfung durch ValidView schon
- unterzogen wurde. Es wird hier nicht erledigt, da
- nur die ItemDialogArray-Prozeduren wissen, ob noch
- weitere Objekte wie Historys zur Template gehören
- ---------------------------------------------------- *)
- Templ^.SetState (sfActive, TRUE);
- (* ----------------------------------------------------
- Ein weiteres Kuriosum (siehe auch tTemplate.SetState):
- NUR tButtons-Template halten sich auch nach dem
- Einfügen in den Dialog für nicht der aktiven Gruppe
- zugehörig, dh ihr sfActive-Bit ist nicht gesetzt.
- Daher reagieren die Buttons nicht mit der Veränderung
- der Farbe auf eine Selektierung. Damit das ermöglicht
- wird, muss sfActive einmal mehr "von Hand" gesetzt
- werden.
- ---------------------------------------------------- *)
- Saved := FALSE;
- END;
- ClearEvent (Event);
- END;
- (* ----------------------------------------------------------
- Die Template, auf die Event.InfoPtr zeigt, wird freige-
- geben und somit aus der Gruppe entfernt.
- ---------------------------------------------------------- *)
- cmDeleteTempl :
- BEGIN
- Dispose (pTemplate (Event.InfoPtr), Done);
- ClearEvent (Event);
- END;
- (* ----------------------------------------------------------
- Bei cmClose wird rückgefragt, ob das Schliessen wirklich
- gewünscht wird, falls der Dialog noch nicht gespeichert
- wurde, sei es auf Stream (in TOOL.DSK) oder als Quellcode/
- Ressource.
- ---------------------------------------------------------- *)
- cmClose :
- IF NOT Saved THEN BEGIN
- ClearEvent (Event); { sonst wird cmClose zum zweiten Mal
- in der MessageBox verwendet, und der
- Benutzer sieht nur ein Aufflackern
- einer Dialogbox }
- Code := MessageBox (^C'Dialog "'+Title^+
- '" noch nicht gespeichert -'+
- #13^C' trotzdem schliessen ? ', NIL,
- mfConfirmation + mfYesNoCancel);
- IF Code = cmYes THEN BEGIN
- Event.What := evCommand; { der hier eingesetzte Befehl }
- Event.Command := cmClose; { wird weiter unten an tDialog.}
- Event.InfoPtr := @Self; { HandleEvent weitergeleitet }
- END;
- END;
- (* ----------------------------------------------------------
- cmSaveDlgAsR+cmSaveInc/cmSaveRez bewirkt den Aufruf von
- SaveAsResource, wobei Event.InfoPtr angeben muss, "wohin"
- der Dialog gespeichert werden muss. Es liegt in der Ver-
- antwortung des Absenders des Befehls, sicherzustellen,
- dass Event.InfoPtr auf eine Textdatei (+cmSaveInc) oder
- auf eine Ressourcendatei (+cmSaveRez) zeigt !
- ---------------------------------------------------------- *)
- cmSaveDlgAsR+cmSaveInc,
- cmSaveDlgAsR+cmSaveRez:
- BEGIN
- SaveAsResource (Event.InfoPtr,
- Event.Command-cmSaveDlgAsR);
- ClearEvent (Event);
- END;
- (* ----------------------------------------------------------
- Damit der Dialog als Prozedur gespeichert werden kann,
- muss Event.InfoPtr auf eine Textdatei zeigen.
- ---------------------------------------------------------- *)
- cmSaveDlgAsP:
- BEGIN
- SaveAsSource (Event.InfoPtr, TRUE, 0);
- ClearEvent (Event);
- END;
- (* ----------------------------------------------------------
- cmSaveDlgAsO(bject)+cmSaveXXX wird an SaveAsSource weiter-
- gegeben, das dann genauer unterscheidet, welche Teile
- gespeichert werden sollen.
- ---------------------------------------------------------- *)
- cmSaveDlgAsO+cmSaveAll,
- cmSaveDlgAsO+cmSaveDef,
- cmSaveDlgAsO+cmSaveCon,
- cmSaveDlgAsO+cmSavePrc:
- BEGIN
- SaveAsSource (Event.InfoPtr, FALSE,
- Event.Command-cmSaveDlgAsO);
- ClearEvent (Event);
- END;
- END;
-
- IF (Event.What = evBroadCast) THEN
- CASE Event.Command OF
- (* ----------------------------------------------------------
- Falls der In Event.InfoPtr^ übergebene String mit Title^
- identisch ist, gibt sich das Objekt über ClearEvent
- zu erkennen.
- ---------------------------------------------------------- *)
- cmWhoIsDlg : IF pString (Event.InfoPtr)^ = Title^ THEN
- ClearEvent (Event);
- END;
-
- tDialog.HandleEvent (Event);
-
- (* --------------------------------------------------------------
- Falls mit der rechten Maustaste in das Dialogfenster geklickt
- wurde, ohne dass eine Template darauf reagiert hat, wird
- das Menu ItemsMenu ausgeführt, das die ID des einzufügenden
- Elements liefert. Dann wird es dem obigen Teil der Methode über-
- lassen, sich um den Dialog aus ItemsDialogArray, zu kümmern.
- -------------------------------------------------------------- *)
- IF (Event.What = evMouseDown) AND
- (Event.Buttons = mbRightButton) THEN BEGIN
- MakeLocal (Event.Where, MousePos);
- IF (MousePos.X >= 1) AND (MousePos.X < Size.X-1) AND
- (MousePos.Y < Size.Y-1) THEN BEGIN
- Item := NIL;
- Where:= Event.Where;
- ID := ItemsMenu (Where);
- IF ID <> idNoItem THEN BEGIN
- MakeLocal (Event.Where, Where);
- Message (@Self, evCommand, ID, @Where);
- END;
- END;
- ClearEvent (Event);
- END;
- END;
-
- (* ================================================================ *)
- (* tWorkDialog_Dialog *)
- (* ================================================================ *)
- (* tWorkDialog_Dialog lässt sämtliche Einstellungen eines tWork- *)
- (* Dialog editieren. Auch ist es möglich, Elemente einzufügen, zu *)
- (* löschen oder zu bearbeiten; ebenso können "Weitere Felder" wie *)
- (* Options, State und Flags direkt manipuliert werden (über den *)
- (* Dialog OtherFieldsDialog). tWorkDialog_Dialog.HandleEvent *)
- (* beendet bei folgenden Befehlen die Modalität: *)
- (* - cmDeleteDlg, cmDeleteTempl, cmNewTempl, cmEditTempl, cmOtherF *)
- (* Bei cmDeleteDlg und cmDeleteTempl wird noch gefragt, ob wirklich *)
- (* gelöscht werden soll. *)
- (* Init fügt unter Berücksichtigung von Dlg die Dialogelemente ein. *)
- (* Ist Dlg NIL, so werden die Liste und die zugehörigen Buttons *)
- (* nicht eingefügt. *)
- (* ---------------------------------------------------------------- *)
- CONSTRUCTOR tWorkDialog_Dialog.Init (Dlg: pDialog);
- VAR
- ScrollBar: pScrollBar;
- ListBox: pListBox;
- View: pView;
- Box: pDialog;
- R: tRect;
- BEGIN
- IF Dlg = NIL THEN BEGIN
- R.Assign (10, 5, 70, 16);
- tDialog.Init (R, ' Neue Dialogbox erstellen ');
- END ELSE BEGIN
- R.Assign (10, 2, 70, 23);
- tDialog.Init (R, ' Dialog bearbeiten ');
- END;
-
- R.Assign (10, 1, 40, 2);
- View := New (pKeyInputLine, Init (R, 80));
- Insert (View);
- R.Assign (2, 1, 10, 2);
- Insert (New (pLabel, Init (R, 'Titel: ', View)));
-
- R.Assign (14, 3, 19, 4);
- View := New (pNumInputLine, Init (R, 5, 0, ScreenWidth));
- Insert (View);
- R.Assign (2, 3, 14, 4);
- Insert (New (pLabel, Init (R, 'Ursprung X: ', View)));
- R.Assign (14, 4, 19, 5);
- View := New (pNumInputLine, Init (R, 5, 0, ScreenHeight));
- Insert (View);
- R.Assign (2, 4, 14, 5);
- Insert (New (pLabel, Init (R, 'Ursprung Y: ', View)));
-
- R.Assign (41, 3, 46, 4);
- View := New (pNumInputLine, Init (R, 5, 0, ScreenWidth));
- Insert (View);
- R.Assign (29, 3, 40, 4);
- Insert (New (pLabel, Init (R, 'Grösse X: ', View)));
- R.Assign (41, 4, 46, 5);
- View := New (pNumInputLine, Init (R, 5, 0, ScreenHeight));
- Insert (View);
- R.Assign (29, 4, 40, 5);
- Insert (New (pLabel, Init (R, 'Grösse Y: ', View)));
-
- IF Dlg <> NIL THEN BEGIN
- R.Assign (30, 7, 31, 15);
- ScrollBar := New (pScrollBar, Init (R));
- Insert (ScrollBar);
- R.Assign (3, 7, 30, 15);
- ListBox := New (pListBox, Init (R, 1, ScrollBar));
- Insert (ListBox);
- R.Assign (2, 6, 20, 7);
- Insert (New (pLabel, Init (R, 'Dialogelemente:', ListBox)));
-
- R.Assign (38, 8, 52, 10);
- Insert (New (pButton, Init (R, 'Element ~n~eu', cmNewTempl, bfNormal)));
- R.Assign (38, 10, 52, 12);
- Insert (New (pButton, Init (R, '~L~öschen', cmDeleteTempl, bfNormal)));
- R.Assign (38, 12, 52, 14);
- Insert (New (pButton, Init (R, '~B~earbeiten', cmEditTempl, bfNormal)));
- END;
-
- R.Assign (35, Size.Y-5, 55, Size.Y-3);
- Insert (New (pButton, Init (R, '~W~eitere Felder', cmOtherF, bfNormal)));
-
- R.Assign (5, Size.Y-3, 15, Size.Y-1);
- Insert (New (pButton, Init (R, '~O~K', cmOk, bfDefault)));
- IF Dlg <> NIL THEN BEGIN
- R.Assign (20, Size.Y-3, 40, Size.Y-1);
- Insert (New (pButton, Init (R, '~D~ialog löschen', cmDeleteDlg, bfNormal)));
- END;
- R.Assign (45, Size.Y-3, 55, Size.Y-1);
- Insert (New (pButton, Init (R, '~C~ancel', cmCancel, bfNormal)));
-
- SelectNext (FALSE);
- END;
-
- PROCEDURE tWorkDialog_Dialog.HandleEvent (VAR Event: tEvent);
- BEGIN
- IF (Event.What = evCommand) AND
- ((Event.Command = cmDeleteDlg) OR
- (Event.Command = cmDeletetempl) OR
- (Event.Command = cmNewTempl) OR
- (Event.Command = cmEditTempl) OR
- (Event.Command = cmOtherF)) THEN BEGIN
- EndModal (Event.Command);
- ClearEvent (Event);
- END;
-
- tDialog.HandleEvent (Event);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Valid fragt den Benutzer, ob er das Objekt, also entweder den *)
- (* Dialog oder nur ein Element, wirklich löschen wolle. *)
- (* ---------------------------------------------------------------- *)
- FUNCTION tWorkDialog_Dialog.Valid (Command: WORD): BOOLEAN;
- BEGIN
- Valid := tDialog.Valid (Command);
- IF (Command = cmDeleteDlg) OR
- (Command = cmDeleteTempl) THEN
- IF MessageBox ('Das Objekt wirklich löschen ?',
- NIL,
- mfConfirmation + mfYesNoCancel) = cmYes THEN
- Valid := TRUE
- ELSE
- Valid := FALSE;
- END;
-
- (* ================================================================ *)
- (* tTemplDialog *)
- (* ================================================================ *)
- (* tTemplDialog wird von den ItemsDialogArray-Prozeduren benutzt. *)
- (* Bei cmDeleteTempl wird rückgefragt, ob das Element wirklich ge- *)
- (* löscht werden soll. HandleEvent beendet (oder versucht zu *)
- (* beenden) die Modalität bei Eintreffen von cmDeleteTempl. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tTemplDialog.HandleEvent (VAR Event: tEvent);
- BEGIN
- IF (Event.What = evCommand) AND
- (Event.Command = cmDeleteTempl) THEN BEGIN
- EndModal (cmDeleteTempl);
- ClearEvent (Event);
- END;
- tDialog.HandleEvent (Event);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* Dass auch tTemplDialog.Valid nachfragt, ob das Objekt gelöscht *)
- (* werden soll, liegt daran, dass tWorkDialog_Dialog die Modalität *)
- (* bei einer Bestätigung obiger Rückfrage beenden soll. Ein Template*)
- (* dialog aber soll seine Modalität auch nur nach einer Bestätigung *)
- (* beenden, weshalb die Rückfrage doppelt vorkommt. *)
- (* ---------------------------------------------------------------- *)
- FUNCTION tTemplDialog.Valid (Command: WORD): BOOLEAN;
- VAR OK: BOOLEAN;
- BEGIN
- OK := FALSE;
- IF Command = cmDeleteTempl THEN
- IF MessageBox ('Das Objekt wirklich löschen ?',
- NIL, mfConfirmation + mfYesNoCancel) = cmYes THEN
- OK := TRUE;
- IF NOT OK THEN
- OK := tDialog.Valid (Command);
- Valid := OK;
- END;
-
- (* ================================================================ *)
- (* tClusterDialog *)
- (* ================================================================ *)
- (* tClusterDialog ist der Dialog für Radiobuttons und CheckBoxes. *)
- (* aTitle gibt seine Überschrift an, aList zeigt auf die Kollektion,*)
- (* die verwendet werden soll, DelButton muss TRUE sein, wenn ein *)
- (* "Löschen"-Button eingefügt werden soll, also das Dialogelement *)
- (* schon existiert. *)
- (* ---------------------------------------------------------------- *)
- CONSTRUCTOR tClusterDialog.Init (aTitle: tTitleStr;
- aList: pStringCollection;
- DelButton: BOOLEAN);
- VAR
- View: pView;
- R: tRect;
- BEGIN
- R.Assign (10, 1, 67, 21);
- tDialog.Init (R, aTitle);
-
- R.Assign (5, 1, 18, 2);
- Insert (New (pStaticText, Init (R, 'Beschriftung:')));
-
- R.Assign (14, 2, 44, 3);
- View := New (pKeyInputLine, Init (R, 80));
- Insert (View);
- R.Assign (7, 2, 14, 3);
- Insert (New (pLabel, Init (R, 'Text: ', View)));
-
- R.Assign (11, 4, 17, 5);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (7, 4, 10, 5);
- Insert (New (pLabel, Init (R, 'X:', View)));
-
- R.Assign (26, 4, 32, 5);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (22, 4, 26, 5);
- Insert (New (pLabel, Init (R, 'Y: ', View)));
-
- R.Assign (5, 6, 24, 7);
- Insert (New (pStaticText, Init (R, 'tCheckBoxes-Daten: ')));
-
- R.Assign (30, 8, 31, 16);
- View := New (pScrollBar, Init (R));
- Insert (View);
- R.Assign (8, 8, 30, 16);
- ListBox := New (pListBox, Init (R, 1, pScrollBar (View)));
- Insert (ListBox);
- R.Assign (8, 7, 23, 8);
- Insert (New (pLabel, Init (R, 'Elementliste: ', ListBox)));
- List := aList;
-
- R.Assign (39, 8, 53, 10);
- Insert (New (pButton, Init (R, '~N~eu', cmNewItem, 0)));
-
- R.Assign (39, 11, 53, 13);
- Insert (New (pButton, Init (R, '~L~öschen', cmDeleteItem, 0)));
-
- R.Assign (39, 14, 53, 16);
- Insert (New (pButton, Init (R, '~B~earbeiten', cmEditItem, 0)));
-
- R.Assign (3, 17, 11, 19);
- Insert (New (pButton, Init (R, ' ~O~K ', cmOk, 1)));
-
- IF DelButton THEN BEGIN
- R.Assign (18, 17, 31, 19);
- Insert (New (pButton, Init (R, '~L~öschen', cmDeleteTempl, 0)));
- END;
-
- R.Assign (39, 17, 52, 19);
- Insert (New (pButton, Init (R, '~A~bbruch', cmCancel, 0)));
-
- SelectNext (FALSE);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* tClusterDialog.HandleEvent muss auf die Befehle cmNewItem, *)
- (* cmEdit- und cmDeleteItem reagieren, die von den in Init einge- *)
- (* fügten Buttons ausgeschickt werden. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE tClusterDialog.HandleEvent (VAR Event: tEvent);
- VAR
- s: STRING;
- i: INTEGER;
- p: pString;
- BEGIN
- IF (Event.What = evCommand) THEN
- CASE Event.Command OF
- (* ----------------------------------------------------------
- Bei cmNewItem kann der Anwender in einer InputBox ein
- neues Listenelement eingeben. Gibt er einen nicht-leeren
- String ein, wird dieser in die Liste "List" eingefügt
- und anschliessend die Listbox aktualisiert. Das geschieht
- "von Hand", da tListBox keine Methode zum Einfügen eines
- neuen Strings nach dem Erzeugen des Objekts kennt.
- ---------------------------------------------------------- *)
- cmNewItem:
- BEGIN
- s := '';
- IF (InputBox ('Neues Listenelement', 'Beschriftung: ',
- S, 80) = cmOk) AND (S <> '') THEN BEGIN
- IF ListBox^.Range = 0 THEN
- i := 0
- ELSE
- i := ListBox^.Focused+1;
- List^.AtInsert (i, NewStr (s));
- ListBox^.SetRange (Succ (ListBox^.Range));
- ListBox^.FocusItem (i);
- ListBox^.DrawView;
- END;
- ClearEvent (Event);
- END;
- (* ----------------------------------------------------------
- Falls in der Listbox schon ein Element eingefügt ist,
- kann es der Benutzer in einer InputBox bearbeiten. Gibt er
- einen nicht-leeren String ein, so wird der alte wiederum
- "von Hand" ersetzt; gibt er einen leeren String ein, so
- wird der Befehl cmDeleteItem an Self abgeschickt.
- ---------------------------------------------------------- *)
- cmEditItem:
- BEGIN
- IF ListBox^.Range <> 0 THEN BEGIN
- i := ListBox^.Focused;
- s := String (List^.At (i)^);
- IF (InputBox ('Listenelement bearbeiten', 'Beschriftung: ',
- S, 80) = cmOk) AND (S <> '') THEN BEGIN
- p := List^.At (i);
- List^.AtFree (i);
- List^.AtInsert (i, NewStr (s));
- ListBox^.DrawView;
- END ELSE
- IF S = '' THEN
- Message (@Self, evCommand, cmDeleteItem, NIL);
- END;
- ClearEvent (Event);
- END;
- (* ----------------------------------------------------------
- Das selektierte Element wird gelöscht, sofern die Liste
- überhaupt Elemente enthält.
- ---------------------------------------------------------- *)
- cmDeleteItem:
- BEGIN
- IF ListBox^.Range <> 0 THEN BEGIN
- List^.AtFree (ListBox^.Focused);
- ListBox^.SetRange (Pred (ListBox^.Range));
- ListBox^.DrawView;
- END;
- ClearEvent (Event);
- END;
- END;
-
- tTemplDialog.HandleEvent (Event);
- END;
-
- (* ================================================================ *)
- (* OtherFieldsDialog *)
- (* ================================================================ *)
- (* OtherFieldsDialog lässt die Felder Flags, Options und State des *)
- (* Dialoges Dlg manipulieren. Aber ACHTUNG: Was eingegeben wird, *)
- (* wird auch gesetzt! sfVisible zu löschen hat zur Folge, dass der *)
- (* Dialog nicht mehr auf den Bildschirm geholt werden kann! *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE OtherFieldsDialog (Dlg: pDialog);
- TYPE
- Data = RECORD
- Flags: WORD;
- Options: WORD;
- State: WORD;
- END;
- VAR
- Code: INTEGER;
- DD: Data;
- Box: pDialog;
- R: tRect;
- View: pView;
- BEGIN
- R.Assign (10, 0, 70, 23);
- Box := New (pDialog, Init (R, 'Weitere Felder ...'));
-
- R.Assign (2, 2, 20, 6);
- View := New (pCheckBoxes, Init (R, NewSItem ('wfMove',
- NewSItem ('wfGrow',
- NewSItem ('wfClose',
- NewSItem ('wfZoom',
- NIL))))));
- Box^.Insert (View);
- R.Assign (2, 1, 21, 2);
- Box^.Insert (New (pLabel, Init (R, 'Flags: ', View)));
-
- R.Assign (2, 8, 21, 19);
- View := New (pCheckBoxes, Init (R, NewSItem ('ofSelectable',
- NewSItem ('ofTopSelect',
- NewSItem ('ofFirstClick',
- NewSItem ('ofFramed',
- NewSItem ('ofPreProcess',
- NewSItem ('ofPostProcess',
- NewSItem ('ofBuffered',
- NewSItem ('ofTileable',
- NewSItem ('ofCenterX',
- NewSItem ('ofCenterY',
- NewSItem ('ofCentered',
- NIL)))))))))))));
- Box^.Insert (View);
- R.Assign (2, 7, 21, 8);
- Box^.Insert (New (pLabel, Init (R, 'Options: ', View)));
-
- R.Assign (25, 8, 44, 19);
- View := New (pCheckBoxes, Init (R, NewSItem ('sfVisible',
- NewSItem ('sfCursorVis',
- NewSItem ('sfCursorIns',
- NewSItem ('sfShadow',
- NewSItem ('sfActive',
- NewSItem ('sfSelected',
- NewSItem ('sfFocused',
- NewSItem ('sfDragging',
- NewSItem ('sfDisabled',
- NewSItem ('sfModal',
- NewSItem ('sfExposed',
- NIL)))))))))))));
- Box^.Insert (View);
- R.Assign (25, 7, 44, 8);
- Box^.Insert (New (pLabel, Init (R, 'State:', View)));
-
- R.Assign (10, Box^.Size.Y-3, 20, Box^.Size.Y-1);
- Box^.Insert (New (pButton, Init (R, '~O~K', cmOK, bfDefault)));
- R.Assign (30, Box^.Size.Y-3, 40, Box^.Size.Y-1);
- Box^.Insert (New (pButton, Init (R, '~C~ancel', cmCancel, bfNormal)));
-
- DD.Flags := Dlg^.Flags;
- DD.Options:= Dlg^.Options;
- DD.State := Dlg^.State;
- Box^.SetData (DD);
- Box^.SelectNext (FALSE);
-
- Code := Desktop^.ExecView (Application^.ValidView (Box));
-
- IF Code <> cmCancel THEN BEGIN
- Box^.GetData (DD);
- Dlg^.Flags := DD.Flags;
- Dlg^.Options:= DD.Options;
- Dlg^.State := DD.State;
- END;
- IF Box <> NIL THEN
- Dispose (Box);
- END;
-
- (* ================================================================ *)
- (* NewOrEditDialog *)
- (* ================================================================ *)
- (* Der zentrale Dialog für tWorkDialog-Objekte; benutzt tWorkDialog_*)
- (* Dialog und muss auf diverse Befehle reagieren, mit denen der *)
- (* Dialog beendet werden kann. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE NewOrEditDialog (Dlg: pDialog);
-
- CONST
- Name : STRING = '';
-
- TYPE
- DialogData = RECORD
- Title: STRING [80];
- x1, y1, x2, y2 : LONGINT;
- ListPtr: pCollection;
- Focused: INTEGER;
- END;
-
- VAR
- Box: pDialog;
- R: tRect;
- DD: DialogData;
- StrList: pStringCollection;
- Code: INTEGER;
- Quit: BOOLEAN;
-
- PROCEDURE AddToList (Templ: pView); FAR;
- VAR Name: STRING;
- BEGIN
- IF (TypeOf (Templ^) = TypeOf (tTemplate)) OR
- (TypeOf (Templ^) = TypeOf (tExtendedTemplate)) THEN BEGIN
- Name := pTemplate (Templ)^.Name^;
- StrList^.Insert (NewStr (Name));
- END;
- END;
-
- PROCEDURE SetNewDlgData;
- BEGIN
- IF Dlg <> NIL THEN BEGIN
- pWorkDialog (Dlg)^.SetTitle (DD.Title);
- R.Assign (DD.X1, DD.Y1, DD.X1+DD.X2, DD.Y1+DD.Y2);
- Dlg^.ChangeBounds (R);
- Desktop^.ReDraw;
- END;
- END;
-
- PROCEDURE MakeDialog;
- BEGIN
- R.Assign (DD.X1, DD.Y1, DD.X1+DD.X2, DD.Y1+DD.Y2);
- Dlg := New (pWorkDialog, Init (R, DD.Title));
- Desktop^.Insert (Application^.ValidView (Dlg));
- IF Dlg = NIL THEN Quit := TRUE;
- END;
-
- BEGIN
- Box := New (pWorkDialog_Dialog, Init (Dlg));
-
- StrList := NIL;
- IF Dlg <> NIL THEN BEGIN
- StrList := New (pStringCollection, Init (20, 10));
- StrList^.Duplicates := TRUE;
- Dlg^.ForEach (@AddToList);
- DD.ListPtr := StrList;
- DD.Focused := 0;
- END;
-
- DD.Title := '';
- IF Dlg=NIL THEN BEGIN
- DD.X1 := 20; DD.Y1 := 5;
- DD.X2 := 40; DD.Y2 := 10;
- END ELSE BEGIN
- IF Dlg^.Title <> NIL THEN DD.Title := Dlg^.Title^;
- DD.X1 := Dlg^.Origin.X; DD.Y1 := Dlg^.Origin.Y;
- DD.X2 := Dlg^.Size.X; DD.Y2 := Dlg^.Size.Y;
- END;
-
- Box^.SetData (DD);
-
- REPEAT
- Quit := TRUE;
- Code := Desktop^.ExecView (Application^.ValidView (Box));
- Box^.GetData (DD);
- CASE Code OF
- cmOtherF:
- BEGIN
- IF Dlg = NIL THEN
- MakeDialog;
- IF Dlg <> NIL THEN BEGIN
- OtherFieldsDialog (Dlg);
- Quit := FALSE;
- END;
- END;
- cmOk:
- IF Dlg = NIL THEN MakeDialog
- ELSE SetNewDlgData;
- cmDeleteDlg:
- Dispose (Dlg, Done);
- cmNewTempl:
- BEGIN
- Message (Dlg, evCommand, cmNewTempl, NIL);
- SetNewDlgData;
- END;
- cmEditTempl:
- IF DD.ListPtr^.Count > 0 THEN BEGIN
- Name := String (DD.ListPtr^.At (DD.Focused)^);
- SetNewDlgData;
- Message (Dlg, evBroadCast, cmEditTempl, @Name);
- END ELSE
- Quit := FALSE;
- cmDeleteTempl:
- IF DD.ListPtr^.Count > 0 THEN BEGIN
- Message (Dlg,
- evCommand, cmDeleteTempl,
- Message (Dlg, evBroadCast,
- cmWhoIsTempl,
- DD.ListPtr^.At (DD.Focused)));
- SetNewDlgData;
- END ELSE
- Quit := FALSE;
- END;
- UNTIL (Quit) OR (Code = cmCancel);
- IF Dlg <> NIL THEN
- Dlg^.Redraw;
- IF Box <> NIL THEN
- Dispose (Box, Done);
- IF StrList <> NIL THEN
- Dispose (StrList, Done);
- END;
-
- (* ================================================================ *)
- (* ItemsMenu *)
- (* ================================================================ *)
- FUNCTION GetItemsMenu: pMenu;
- BEGIN
- GetItemsMenu := NewMenu (
- NewItem ('t~S~taticText', '', 0, cmStaticText, hcNoContext,
- NewItem ('t~B~utton', '', 0, cmButton, hcNoContext,
- NewItem ('t~I~nputLine', '', 0, cmInputLine, hcNoContext,
- NewItem ('t~L~istBox', '', 0, cmListBox, hcNoContext,
- NewItem ('t~M~emo', '', 0, cmMemo, hcNoContext,
- NewItem ('t~R~adioButtons', '', 0, cmRadioButtons, hcNoContext,
- NewItem ('t~C~heckBoxes', '', 0, cmCheckBoxes, hcNoContext,
- NewLine (
- NewSubMenu ('S~t~andardbuttons', hcNoContext, NewMenu (
- NewItem ('~O~K-Button', '', 0, cmOkButton, hcNoContext,
- NewItem ('~A~bbruch-Button', '', 0, cmCancelButton, hcNoContext,
- NewItem ('~J~a-Button', '', 0, cmYesButton, hcNoContext,
- NewItem ('~N~ein-Button', '', 0, cmNoButton, hcNoContext,
- NewItem ('~H~ilfe-Button', '', 0, cmHelpButton, hcNoContext,
- NIL)))))),
- NIL))))))))));
- END;
-
- (* ================================================================ *)
- (* ItemsMenu *)
- (* ================================================================ *)
- FUNCTION ItemsMenu (Where: tPoint): INTEGER;
- CONST
- ItemsMenuOpen : BOOLEAN = FALSE;
- VAR
- Menu: pMenu;
- Code : WORD;
- Box: pMenuBox;
- R: tRect;
- BEGIN
- IF NOT ItemsMenuOpen THEN BEGIN
- ItemsMenuOpen := TRUE;
- IF (Where.X > 53) THEN Where.X := 53;
- IF (Where.Y > ScreenHeight-12) THEN
- Where.Y := ScreenHeight-12;
-
- R.Assign (Where.X, Where.Y,
- Where.X+25, Where.Y+11);
- Menu := GetItemsMenu;
- Box := New (pMenuBox, Init (R, Menu, NIL));
- Code := Application^.ExecView (Box);
- Dispose (Box, Done);
- DisposeMenu (Menu);
-
- IF Code <> 0 THEN ItemsMenu := Code
- ELSE ItemsMenu := idNoItem;
- ItemsMenuOpen := FALSE;
- END;
- END;
-
- (* ================================================================ *)
- (* I T E M S D I A L O G A R R A Y - P R O Z E D U R E N *)
- (* ================================================================ *)
- (* Die ItemsDialogArray-Prozeduren führen die Dialoge für die *)
- (* einzelnen Dialogelement-Arten aus. Sie werden aufgerufen, wenn *)
- (* der Benutzer ein Element einfügen oder überarbeiten will, und *)
- (* daher auch für beide Fälle gerüstet sein, was die Prozeduren ein *)
- (* wenig aufbläst. Optimieren wäre hier möglich; es wurde jedoch *)
- (* bewusst darauf verzichtet, damit eigene Ideen leichter einge- *)
- (* bracht werden können. - Diese Prozeduren nehmen über über 1000 *)
- (* Zeilen dieser Unit ein! *)
- (* ---------------------------------------------------------------- *)
- (* StaticTextDialog *)
- (* ---------------------------------------------------------------- *)
- (* StaticTextDialog ist der einfachste Dialog aus dem ItemsDialog- *)
- (* Array, da für einen StaticText nur Position und Text benötigt *)
- (* werden. Doch alle Prozeduren folgen dem Schema, das StaticText- *)
- (* Dialog verwendet und das durch die Trennstriche ersichtlich wird.*)
- (* ---------------------------------------------------------------- *)
- FUNCTION StaticTextDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
-
- TYPE
- DialogData = RECORD
- Title: STRING [80];
- x, y : LONGINT;
- END;
-
- VAR
- StaticText: pStaticText;
- View: pView;
- Box: pDialog;
- DD: DialogData;
- Code: INTEGER;
- R: tRect;
-
- BEGIN
- (* -------------------------------------------------------------- *)
- IF Templ <> NIL THEN
- StaticText := pStaticText (Templ^.Client)
- ELSE
- StaticText := NIL;
- (* -------------------------------------------------------------- *)
- R.Assign (10, 5, 70, 15);
- Box := New (pTemplDialog, Init (R, ' tStaticText-Dialog '));
- WITH Box^ DO BEGIN
- R.Assign (21, 1, 50, 2);
- View := New (pKeyInputLine, Init (R, 80));
- Insert (View);
- R.Assign (2, 1, 21, 2);
- Insert (New (pLabel, Init (R, 'Text: ', View)));
-
- R.Assign (16, 3, 21, 4);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (2, 3, 15, 4);
- Insert (New (pLabel, Init (R, 'Ursprung X: ', View)));
- R.Assign (16, 5, 21, 6);
- View := New (pNumInputLine, Init (R, 5, 0, 25));
- Insert (View);
- R.Assign (2, 5, 15, 6);
- Insert (New (pLabel, Init (R, 'Ursprung Y: ', View)));
-
- R.Assign (5, Size.Y-3, 15, Size.Y-1);
- Insert (New (pButton, Init (R, '~O~K', cmOk, bfDefault)));
- IF StaticText <> NIL THEN BEGIN
- R.Assign (20, Size.Y-3, 40, Size.Y-1);
- Insert (New (pButton, Init (R, 'Objekt ~l~öschen ',
- cmDeleteTempl, bfNormal)));
- END;
- R.Assign (45, Size.Y-3, 55, Size.Y-1);
- Insert (New (pButton, Init (R, '~C~ancel', cmCancel, bfNormal)));
- SelectNext (FALSE);
- END;
- (* -------------------------------------------------------------- *)
- DD.Title := '';
- IF StaticText=NIL THEN BEGIN
- DD.X := Where^.X;
- DD.Y := Where^.Y;
- END ELSE BEGIN
- IF StaticText^.Text <> NIL THEN
- DD.Title := StaticText^.Text^;
- DD.X := Templ^.Origin.X;
- DD.Y := Templ^.Origin.Y;
- END;
- (* -------------------------------------------------------------- *)
- Box^.SetData (DD);
- Code := Desktop^.ExecView (Application^.ValidView (Box));
- StaticTextDialog := DD.Title;
- (* -------------------------------------------------------------- *)
- IF Code = cmOk THEN BEGIN
- Box^.GetData (DD);
- R.Assign (DD.X, DD.Y, DD.X+Length (DD.Title), Succ (DD.Y));
- IF Templ = NIL THEN BEGIN
- StaticText := New (pStaticText, Init (R, DD.Title));
- Templ := New (pTemplate,
- Init (StaticText, MinItemSize, MaxItemSize,
- DD.Title, idStaticText));
- Templ := pTemplate (Application^.ValidView (Templ));
- END ELSE BEGIN
- IF StaticText^.Text <> NIL THEN
- DisposeStr (StaticText^.Text);
- StaticText^.Text := NewStr (DD.Title);
- Templ^.ChangeBounds (R);
- Dlg^.ReDraw;
- END;
- END ELSE IF (Code = cmDeleteTempl) THEN
- StaticTextDialog := '';
-
- IF Box <> NIL THEN
- Dispose (Box, Done);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* ButtonDialog *)
- (* ---------------------------------------------------------------- *)
- FUNCTION ButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- TYPE
- DialogData = RECORD
- Title: STRING [80];
- x, y : LONGINT;
- Command: LONGINT;
- Default: WORD;
- LeftJust: WORD;
- END;
-
- VAR
- Button: pButton;
- View: pView;
- KeyInputLine: pKeyInputLine;
- Box: pDialog;
- DD: DialogData;
- Code: INTEGER;
- R: tRect;
-
- BEGIN
- (* -------------------------------------------------------------- *)
- IF Templ <> NIL THEN
- Button := pButton (Templ^.Client)
- ELSE
- Button := NIL;
- (* -------------------------------------------------------------- *)
- R.Assign (10, 3, 70, 18);
- Box := New (pTemplDialog, Init (R, ' tButton-Dialog '));
- WITH Box^ DO BEGIN
- R.Assign (23, 1, 50, 2);
- KeyInputLine := New (pKeyInputLine, Init (R, 80));
- Insert (KeyInputLine);
- R.Assign (2, 1, 21, 2);
- Insert (New (pLabel, Init (R, 'Beschriftung: ', KeyInputLine)));
-
- R.Assign (11, 2, 16, 3);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (6, 2, 9, 3);
- Insert (New (pLabel, Init (R, 'X: ', View)));
-
- R.Assign (25, 2, 30, 3);
- View := New (pNumInputLine, Init (R, 5, 0, 25));
- Insert (View);
- R.Assign (20, 2, 23, 3);
- Insert (New (pLabel, Init (R, 'Y: ', View)));
-
- R.Assign (24, 4, 30, 5);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (2, 4, 24, 5);
- Insert (New (pLabel, Init (R, 'Abzusetzender Befehl: ', View)));
-
- R.Assign (2, 7, 30, 9);
- View := New (pRadioButtons, Init (R, NewSItem ('bfNormal',
- NewSItem ('bfDefault',
- NIL))));
- Insert (View);
- R.Assign (2, 6, 30, 7);
- Insert (New (pLabel, Init (R, 'Erscheinungsbild: ', View)));
-
- R.Assign (2, 9, 30, 10);
- View := New (pCheckBoxes, Init (R, NewSItem ('bfLeftJust',
- NIL)));
- Insert (View);
-
- R.Assign (5, Size.Y-3, 15, Size.Y-1);
- Insert (New (pButton, Init (R, '~O~K', cmOk, bfDefault)));
- IF Button <> NIL THEN BEGIN
- R.Assign (20, Size.Y-3, 40, Size.Y-1);
- Insert (New (pButton, Init (R, 'Objekt ~l~öschen ',
- cmDeleteTempl, bfNormal)));
- END;
- R.Assign (45, Size.Y-3, 55, Size.Y-1);
- Insert (New (pButton, Init (R, '~C~ancel', cmCancel, bfNormal)));
- SelectNext (FALSE);
- END;
- (* -------------------------------------------------------------- *)
- DD.Title := '';
- IF Button=NIL THEN BEGIN
- DD.X := Where^.X;
- DD.Y := Where^.Y;
- DD.Command := 0;
- DD.Default := 0;
- DD.LeftJust := 0;
- END ELSE BEGIN
- IF Button^.Title <> NIL THEN
- DD.Title := Button^.Title^;
- DD.X := Button^.Owner^.Origin.X;
- DD.Y := Button^.Owner^.Origin.Y;
- DD.Command := Button^.Command;
- DD.Default := (Button^.Flags AND bfDefault);
- DD.LeftJust:= WORD ((Button^.Flags AND bfLeftJust) > 0);
- END;
- (* -------------------------------------------------------------- *)
- Box^.SetData (DD);
- Code := Desktop^.ExecView (Application^.ValidView (Box));
- ButtonDialog := DD.Title;
- (* -------------------------------------------------------------- *)
- IF Code = cmOk THEN BEGIN
- Box^.GetData (DD);
- R.Assign (DD.X, DD.Y, DD.X+Length (DD.Title)+4, DD.Y+2);
- IF (DD.LeftJust AND $01) > 0 THEN
- DD.LeftJust := bfLeftJust;
- IF Templ = NIL THEN BEGIN
- Button := New (pButton, Init (R, DD.Title,
- DD.Command,
- DD.Default+DD.LeftJust));
- Button^.Options := Button^.Options AND NOT ofPreProcess;
- Templ := New (pTemplate,
- Init (Button, MinButtonSize, MaxItemSize,
- DD.Title, idButton));
- Templ := pTemplate (Application^.ValidView (Templ));
- END ELSE BEGIN
- IF Button^.Title <> NIL THEN
- DisposeStr (Button^.Title);
- Button^.Title := NewStr (DD.Title);
- Button^.Flags := (DD.Default+DD.LeftJust);
- Button^.Command := DD.Command;
- Templ^.ChangeBounds (R);
- Dlg^.ReDraw;
- END
- END ELSE IF (Code = cmDeleteTempl) THEN
- ButtonDialog := '';
-
- IF Box <> NIL THEN
- Dispose (Box, Done);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* InputLineDialog *)
- (* ---------------------------------------------------------------- *)
- FUNCTION InputLineDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
-
- TYPE
- DialogData = RECORD
- Title: STRING [80];
- TX,TY: LONGINT;
- X, Y: LONGINT;
- Length: LONGINT;
- MaxLen: LONGINT;
- History: WORD;
- ID : LONGINT;
- END;
-
- VAR
- InputLine: pInputLine;
- History: pHistory;
- Lab: pLabel;
- View: pView;
- Box: pDialog;
- Code: INTEGER;
- DD: DialogData;
- R, RL, RH: tRect;
- BEGIN
- (* -------------------------------------------------------------- *)
- IF Templ <> NIL THEN BEGIN
- InputLine:= pInputLine (Templ^.Client);
- Lab := pExtendedTemplate (Templ)^.Lab;
- History := pExtendedTemplate (Templ)^.History;
- END ELSE BEGIN
- InputLine:= NIL;
- Lab := NIL;
- History := NIL;
- END;
- (* -------------------------------------------------------------- *)
- R.Assign (10, 3, 70, 18);
- Box := New (pTemplDialog, Init (R, ' tInputLine-Dialog '));
- WITH Box^ DO BEGIN
- R.Assign (5, 2, 18, 3);
- Insert (New (pStaticText, Init (R, 'Beschriftung: ')));
-
- R.Assign (15, 3, 50, 4);
- View := New (pKeyInputLine, Init (R, 80));
- Insert (View);
- R.Assign (8, 3, 14, 4);
- Insert (New (pLabel, Init (R, 'Text: ', View)));
-
- R.Assign (12, 4, 17, 5);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (8, 4, 11, 5);
- Insert (New (pLabel, Init (R, 'X: ', View)));
-
- R.Assign (23, 4, 28, 5);
- View := New (pNumInputLine, Init (R, 5, 0, 25));
- Insert (View);
- R.Assign (19, 4, 22, 5);
- Insert (New (pLabel, Init (R, 'Y: ', View)));
-
- R.Assign (4, 6, 17, 7);
- Insert (New (pStaticText, Init (R, 'Eingabezeile:')));
-
- R.Assign (12, 7, 17, 8);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (8, 7, 11, 8);
- Insert (New (pLabel, Init (R, 'X: ', View)));
-
- R.Assign (23, 7, 28, 8);
- View := New (pNumInputLine, Init (R, 5, 0, 25));
- Insert (View);
- R.Assign (19, 7, 22, 8);
- Insert (New (pLabel, Init (R, 'Y: ', View)));
-
- R.Assign (39, 7, 45, 8);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (31, 7, 38, 8);
- Insert (New (pStaticText, Init (R, 'Länge: ')));
-
- R.Assign (28, 8, 35, 9);
- View := New (pNumInputLine, Init (R, 5, 0, 255));
- Insert (View);
- R.Assign (8, 8, 27, 9);
- Insert (New (pStaticText, Init (R, 'max. Eingabenlänge: ')));
-
- R.Assign (4, 10, 19, 11);
- Insert (New (pCheckBoxes, Init (R, NewSItem ('tHistory', NIL))));
- R.Assign (35, 10, 42, 11);
- View := New (pNumInputLine, Init (R, 6, 0, 32000));
- Insert (View);
- R.Assign (22, 10, 35, 11);
- Insert (New (pLabel, Init (R, 'History-ID:', View)));
-
- R.Assign (5, Size.Y-3, 15, Size.Y-1);
- Insert (New (pButton, Init (R, '~O~K', cmOk, bfDefault)));
- IF InputLine <> NIL THEN BEGIN
- R.Assign (20, Size.Y-3, 40, Size.Y-1);
- Insert (New (pButton, Init (R, 'Objekt ~l~öschen ',
- cmDeleteTempl, bfNormal)));
- END;
- R.Assign (45, Size.Y-3, 55, Size.Y-1);
- Insert (New (pButton, Init (R, '~C~ancel', cmCancel, bfNormal)));
- SelectNext (FALSE);
- END;
- (* -------------------------------------------------------------- *)
- IF Templ=NIL THEN BEGIN
- DD.Title := '';
- DD.TX := Where^.X; DD.TY := Where^.Y;
- DD.X := DD.TX; DD.Y := DD.TY + 1;
- DD.Length := 10;
- DD.MaxLen := 80;
- DD.History:= 1;
- DD.ID := 0;
- END ELSE BEGIN
- IF Lab^.Text <> NIL THEN
- DD.Title := Lab^.Text^;
- DD.TX := Templ^.Origin.X + Lab^.Origin.X;
- DD.TY := Templ^.Origin.Y + Lab^.Origin.Y;
- DD.X := Templ^.Origin.X + InputLine^.Origin.X;
- DD.Y := Templ^.Origin.Y + InputLine^.Origin.Y;
- DD.Length := InputLine^.Size.X;
- DD.MaxLen := InputLine^.MaxLen;
- DD.History:= WORD (History <> NIL);
- IF History <> NIL THEN
- DD.ID := History^.HistoryID
- ELSE
- DD.ID := 0;
- END;
- (* -------------------------------------------------------------- *)
- Box^.SetData (DD);
- Code := Desktop^.ExecView (Application^.ValidView (Box));
- InputLineDialog := DD.Title;
- (* -------------------------------------------------------------- *)
- IF Code = cmOk THEN BEGIN
- Box^.GetData (DD);
- RL.Assign (DD.TX, DD.TY,
- Succ (DD.TX + Length (DD.Title)), Succ (DD.TY));
- R.Assign (DD.X, DD.Y, DD.X + DD.Length, Succ (DD.Y));
- RH.Assign (DD.X+DD.Length, DD.Y, DD.X+DD.Length+3, DD.Y+1);
- IF (Templ = NIL) THEN BEGIN
- (* ---------------------------------------------------------- *)
- InputLine := New (pInputLine, Init (R, DD.MaxLen));
- Lab := New (pLabel, Init (Rl, DD.Title, InputLine));
- IF DD.History = 1 THEN BEGIN
- History := New (pHistory, Init (RH, InputLine, DD.ID));
- Dlg^.Insert (History);
- END;
- Templ := New (pExtendedTemplate,
- Init (InputLine, Lab, NIL, History,
- MinItemSize, MaxItemSize,
- DD.Title, idInputLine));
- IF LowMemory THEN BEGIN
- Application^.OutOfMemory;
- Dispose (Templ, Done);
- Dispose (History, Done);
- END;
- END ELSE BEGIN
- (* ---------------------------------------------------------- *)
- InputLine^.MaxLen := DD.MaxLen;
-
- IF Lab^.Text <> NIL THEN
- DisposeStr (Lab^.Text);
- Lab^.Text := NewStr (DD.Title);
-
- IF (History <> NIL) AND (DD.History = 1) THEN
- History^.HistoryID := DD.ID;
-
- IF (DD.History = 0) AND (History <> NIL) THEN BEGIN
- Dlg^.Delete (History);
- Dispose (History, Done);
- History := NIL;
- pExtendedTemplate (Templ)^.History := NIL;
- END;
- IF (DD.History = 1) AND (History = NIL) THEN BEGIN
- History := New (pHistory, Init (RH, InputLine, DD.ID));
- pExtendedTemplate (Templ)^.History := History;
- Dlg^.Insert (History);
- END;
-
- pExtendedTemplate (Templ)^.NewChangeBounds (R, RL);
- Dlg^.ReDraw;
- END;
- END ELSE IF (Code = cmDeleteTempl) THEN
- InputLineDialog := '';
-
- IF Box <> NIL THEN
- Dispose (Box, Done);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* ListBoxDialog *)
- (* ---------------------------------------------------------------- *)
- FUNCTION ListBoxDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
-
- TYPE
- DialogData = RECORD
- Title: STRING [80];
- TX,TY: LONGINT;
- X, Y: LONGINT;
- XL, YL: LONGINT;
- ColNum: LONGINT;
- ScrollBar:WORD;
- END;
-
- VAR
- ListBox: pListBox;
- Scrollbar: pScrollBar;
- Lab: pLabel;
- View: pView;
- Box: pDialog;
- Code: INTEGER;
- DD: DialogData;
- R, RL, RS: tRect;
- BEGIN
- (* -------------------------------------------------------------- *)
- IF Templ <> NIL THEN BEGIN
- ListBox := pListBox (Templ^.Client);
- Lab := pExtendedTemplate (Templ)^.Lab;
- ScrollBar:= pExtendedTemplate (Templ)^.ScrollBar;
- END ELSE BEGIN
- ListBox := NIL;
- Lab := NIL;
- ScrollBar:= NIL;
- END;
- (* -------------------------------------------------------------- *)
- R.Assign (10, 3, 70, 18);
- Box := New (pTemplDialog, Init (R, ' tListBox-Dialog '));
- WITH Box^ DO BEGIN
- R.Assign (5, 2, 18, 3);
- Insert (New (pStaticText, Init (R, 'Beschriftung: ')));
-
- R.Assign (15, 3, 50, 4);
- View := New (pKeyInputLine, Init (R, 80));
- Insert (View);
- R.Assign (8, 3, 14, 4);
- Insert (New (pLabel, Init (R, 'Text: ', View)));
-
- R.Assign (12, 4, 17, 5);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (8, 4, 11, 5);
- Insert (New (pLabel, Init (R, 'X: ', View)));
-
- R.Assign (23, 4, 28, 5);
- View := New (pNumInputLine, Init (R, 5, 0, 25));
- Insert (View);
- R.Assign (19, 4, 22, 5);
- Insert (New (pLabel, Init (R, 'Y: ', View)));
-
- R.Assign (4, 6, 17, 7);
- Insert (New (pStaticText, Init (R, 'Listbox:')));
-
- R.Assign (12, 7, 17, 8);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (8, 7, 11, 8);
- Insert (New (pLabel, Init (R, 'X: ', View)));
-
- R.Assign (23, 7, 28, 8);
- View := New (pNumInputLine, Init (R, 5, 0, 25));
- Insert (View);
- R.Assign (19, 7, 22, 8);
- Insert (New (pLabel, Init (R, 'Y: ', View)));
-
- R.Assign (18, 8, 25, 9);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (8, 8, 17, 9);
- Insert (New (plabel, Init (R, 'Länge X: ', View)));
-
- R.Assign (38, 8, 45, 9);
- View := New (pNumInputLine, Init (R, 5, 0, 255));
- Insert (View);
- R.Assign (28, 8, 37, 9);
- Insert (New (pLabel, Init (R, 'Länge Y: ', View)));
-
- R.Assign (25, 9, 32, 10);
- View := New (pNumInputLine, Init (R, 5, 0, 20));
- Insert (View);
- R.Assign (8, 9, 25, 10);
- Insert (New (pLabel, Init (R, 'Anzahl Spalten: ', View)));
-
- R.Assign (4, 10, 22, 11);
- Insert (New (pCheckBoxes, Init (R, NewSItem ('Scrollbalken', NIL))));
-
- R.Assign (5, Size.Y-3, 15, Size.Y-1);
- Insert (New (pButton, Init (R, '~O~K', cmOk, bfDefault)));
- IF ListBox <> NIL THEN BEGIN
- R.Assign (20, Size.Y-3, 40, Size.Y-1);
- Insert (New (pButton, Init (R, 'Objekt ~l~öschen ',
- cmDeleteTempl, bfNormal)));
- END;
- R.Assign (45, Size.Y-3, 55, Size.Y-1);
- Insert (New (pButton, Init (R, '~C~ancel', cmCancel, bfNormal)));
- SelectNext (FALSE);
- END;
- (* -------------------------------------------------------------- *)
- IF Templ=NIL THEN BEGIN
- DD.Title := '';
- DD.TX := Where^.X; DD.TY := Where^.Y;
- DD.X := DD.TX; DD.Y := DD.TY + 1;
- DD.XL := 10; DD.YL := 5;
- DD.ColNum := 1;
- DD.ScrollBar := 1;
- END ELSE BEGIN
- IF Lab^.Text <> NIL THEN
- DD.Title := Lab^.Text^;
- DD.TX := Templ^.Origin.X + Lab^.Origin.X;
- DD.TY := Templ^.Origin.Y + Lab^.Origin.Y;
- DD.X := Templ^.Origin.X + ListBox^.Origin.X;
- DD.Y := Templ^.Origin.Y + ListBox^.Origin.Y;
- DD.XL := ListBox^.Size.X;
- DD.YL := ListBox^.Size.Y;
- DD.ColNum := ListBox^.NumCols;
- DD.ScrollBar := WORD (ScrollBar <> NIL);
- END;
- (* -------------------------------------------------------------- *)
- Box^.SetData (DD);
- Code := Desktop^.ExecView (Application^.ValidView (Box));
- ListBoxDialog := DD.Title;
- (* -------------------------------------------------------------- *)
- IF Code = cmOk THEN BEGIN
- Box^.GetData (DD);
- RL.Assign (DD.TX, DD.TY,
- Succ (DD.TX + Length (DD.Title)), Succ (DD.TY));
- R.Assign (DD.X, DD.Y, DD.X + DD.XL, DD.Y + DD.YL);
- RS.Assign (DD.X+DD.XL, DD.Y, DD.X+DD.XL+1, DD.Y+DD.YL);
- IF (Templ = NIL) THEN BEGIN
- (* ---------------------------------------------------------- *)
- IF DD.ScrollBar = 1 THEN BEGIN
- ScrollBar := New (pScrollBar, Init (RS));
- ScrollBar^.SetRange (0, 1);
- ScrollBar^.GrowMode := 0;
- Dlg^.Insert (ScrollBar);
- END;
- ListBox := New (pListBox, Init (R, DD.ColNum, ScrollBar));
- Lab := New (pLabel, Init (Rl, DD.Title, ListBox));
- Templ := New (pExtendedTemplate,
- Init (ListBox, Lab, ScrollBar, NIL,
- MinItemSize, MaxItemSize,
- DD.Title, idListBox));
- pExtendedTemplate (Templ)^.NewChangeBounds (R, RL);
- IF LowMemory THEN BEGIN
- Application^.OutOfMemory;
- Dispose (Templ, Done);
- IF ScrollBar <> NIL THEN
- Dispose (ScrollBar, Done);
- END;
- END ELSE BEGIN
- (* ---------------------------------------------------------- *)
- ListBox^.NumCols := DD.ColNum;
-
- IF Lab^.Text <> NIL THEN
- DisposeStr (Lab^.Text);
- Lab^.Text := NewStr (DD.Title);
-
- IF (DD.ScrollBar = 0) AND (ScrollBar <> NIL) THEN BEGIN
- Dlg^.Delete (ScrollBar);
- Dispose (ScrollBar, Done);
- ScrollBar := NIL;
- pExtendedTemplate (Templ)^.ScrollBar := NIL;
- END;
- IF (DD.ScrollBar = 1) AND (ScrollBar = NIL) THEN BEGIN
- ScrollBar := New (pScrollBar, Init (RS));
- pExtendedTemplate (Templ)^.ScrollBar := ScrollBar;
- Dlg^.Insert (ScrollBar);
- END;
-
- pExtendedTemplate (Templ)^.NewChangeBounds (R, RL);
- Dlg^.ReDraw;
- END;
- END ELSE IF (Code = cmDeleteTempl) THEN
- ListBoxDialog := '';
-
- IF Box <> NIL THEN
- Dispose (Box, Done);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* MemoDialog *)
- (* ---------------------------------------------------------------- *)
- FUNCTION MemoDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
-
- TYPE
- DialogData = RECORD
- Title: STRING [80];
- TX,TY: LONGINT;
- X, Y: LONGINT;
- XL, YL: LONGINT;
- MaxLen: LONGINT;
- ScrollBar:WORD;
- END;
-
- VAR
- Memo: pMemo;
- Scrollbar: pScrollBar;
- Lab: pLabel;
- View: pView;
- Box: pDialog;
- Code: INTEGER;
- DD: DialogData;
- R, RL, RS: tRect;
- BEGIN
- (* -------------------------------------------------------------- *)
- IF Templ <> NIL THEN BEGIN
- Memo := pMemo (Templ^.Client);
- Lab := pExtendedTemplate (Templ)^.Lab;
- ScrollBar:= pExtendedTemplate (Templ)^.ScrollBar;
- END ELSE BEGIN
- Memo := NIL;
- Lab := NIL;
- ScrollBar:= NIL;
- END;
- (* -------------------------------------------------------------- *)
- R.Assign (10, 3, 70, 19);
- Box := New (pTemplDialog, Init (R, ' tMemo-Dialog '));
- WITH Box^ DO BEGIN
- R.Assign (5, 2, 18, 3);
- Insert (New (pStaticText, Init (R, 'Beschriftung: ')));
-
- R.Assign (15, 3, 50, 4);
- View := New (pKeyInputLine, Init (R, 80));
- Insert (View);
- R.Assign (8, 3, 14, 4);
- Insert (New (pLabel, Init (R, 'Text: ', View)));
-
- R.Assign (12, 4, 17, 5);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (8, 4, 11, 5);
- Insert (New (pLabel, Init (R, 'X: ', View)));
-
- R.Assign (23, 4, 28, 5);
- View := New (pNumInputLine, Init (R, 5, 0, 25));
- Insert (View);
- R.Assign (19, 4, 22, 5);
- Insert (New (pLabel, Init (R, 'Y: ', View)));
-
- R.Assign (4, 6, 17, 7);
- Insert (New (pStaticText, Init (R, 'Listbox:')));
-
- R.Assign (12, 7, 17, 8);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (8, 7, 11, 8);
- Insert (New (pLabel, Init (R, 'X: ', View)));
-
- R.Assign (23, 7, 28, 8);
- View := New (pNumInputLine, Init (R, 5, 0, 25));
- Insert (View);
- R.Assign (19, 7, 22, 8);
- Insert (New (pLabel, Init (R, 'Y: ', View)));
-
- R.Assign (18, 8, 26, 9);
- View := New (pNumInputLine, Init (R, 5, 0, 80));
- Insert (View);
- R.Assign (8, 8, 17, 9);
- Insert (New (plabel, Init (R, 'Länge X: ', View)));
-
- R.Assign (38, 8, 45, 9);
- View := New (pNumInputLine, Init (R, 5, 0, 255));
- Insert (View);
- R.Assign (28, 8, 37, 9);
- Insert (New (pLabel, Init (R, 'Länge Y: ', View)));
-
- R.Assign (29, 9, 36, 10);
- View := New (pNumInputLine, Init (R, 5, 0, MaxLongInt));
- Insert (View);
- R.Assign (8, 9, 29, 10);
- Insert (New (pLabel, Init (R, 'Max. Zeichenanzahl: ', View)));
-
- R.Assign (4, 11, 21, 12);
- Insert (New (pCheckBoxes, Init (R, NewSItem (' ScrollBar ', NIL))));
-
- R.Assign (5, Size.Y-3, 15, Size.Y-1);
- Insert (New (pButton, Init (R, '~O~K', cmOk, bfDefault)));
- IF Memo <> NIL THEN BEGIN
- R.Assign (20, Size.Y-3, 40, Size.Y-1);
- Insert (New (pButton, Init (R, 'Objekt ~l~öschen ',
- cmDeleteTempl, bfNormal)));
- END;
- R.Assign (45, Size.Y-3, 55, Size.Y-1);
- Insert (New (pButton, Init (R, '~C~ancel', cmCancel, bfNormal)));
- SelectNext (FALSE);
- END;
- (* -------------------------------------------------------------- *)
- IF Templ=NIL THEN BEGIN
- DD.Title := '';
- DD.TX := Where^.X; DD.TY := Where^.Y;
- DD.X := DD.TX; DD.Y := DD.TY + 1;
- DD.XL := 10; DD.YL := 5;
- DD.MaxLen := 512;
- DD.ScrollBar := 1;
- END ELSE BEGIN
- IF Lab^.Text <> NIL THEN
- DD.Title := Lab^.Text^;
- DD.TX := Templ^.Origin.X + Lab^.Origin.X;
- DD.TY := Templ^.Origin.Y + Lab^.Origin.Y;
- DD.X := Templ^.Origin.X + Memo^.Origin.X;
- DD.Y := Templ^.Origin.Y + Memo^.Origin.Y;
- DD.XL := Memo^.Size.X;
- DD.YL := Memo^.Size.Y;
- DD.MaxLen := Memo^.BufSize;
- DD.ScrollBar := WORD (ScrollBar <> NIL);
- END;
- (* -------------------------------------------------------------- *)
- Box^.SetData (DD);
- Code := Desktop^.ExecView (Application^.ValidView (Box));
- MemoDialog := DD.Title;
- (* -------------------------------------------------------------- *)
- IF Code = cmOk THEN BEGIN
- Box^.GetData (DD);
- RL.Assign (DD.TX, DD.TY,
- Succ (DD.TX + Length (DD.Title)), Succ (DD.TY));
- R.Assign (DD.X, DD.Y, DD.X + DD.XL, DD.Y + DD.YL);
- RS.Assign (DD.X+DD.XL, DD.Y, DD.X+DD.XL+1, DD.Y+DD.YL);
- IF (Templ = NIL) THEN BEGIN
- (* ---------------------------------------------------------- *)
- IF DD.ScrollBar = 1 THEN BEGIN
- ScrollBar := New (pScrollBar, Init (RS));
- ScrollBar^.SetRange (0, 1);
- ScrollBar^.GrowMode := 0;
- Dlg^.Insert (ScrollBar);
- END;
- Memo := New (pMemo, Init (R, NIL, ScrollBar, NIL, DD.MaxLen));
- Memo^.GrowMode := 0;
- Lab := New (pLabel, Init (RL, DD.Title, Memo));
- Templ:= New (pExtendedTemplate,
- Init (Memo, Lab, ScrollBar, NIL,
- MinItemSize, MaxItemSize,
- DD.Title, idMemo));
- pExtendedTemplate (Templ)^.NewChangeBounds (R, RL);
- IF LowMemory THEN BEGIN
- Application^.OutOfMemory;
- Dispose (Templ, Done);
- IF ScrollBar <> NIL THEN
- Dispose (ScrollBar, Done);
- END;
- END ELSE BEGIN
- (* ---------------------------------------------------------- *)
- Memo^.SetBufSize (DD.MaxLen);
-
- IF Lab^.Text <> NIL THEN
- DisposeStr (Lab^.Text);
- Lab^.Text := NewStr (DD.Title);
-
- IF (DD.ScrollBar = 0) AND (ScrollBar <> NIL) THEN BEGIN
- Dlg^.Delete (ScrollBar);
- Dispose (ScrollBar, Done);
- ScrollBar := NIL;
- pExtendedTemplate (Templ)^.ScrollBar := NIL;
- END;
- IF (DD.ScrollBar = 1) AND (ScrollBar = NIL) THEN BEGIN
- ScrollBar := New (pScrollBar, Init (RS));
- pExtendedTemplate (Templ)^.ScrollBar := ScrollBar;
- Dlg^.Insert (ScrollBar);
- END;
-
- pExtendedTemplate (Templ)^.NewChangeBounds (R, RL);
- Dlg^.ReDraw;
- END;
- END ELSE IF (Code = cmDeleteTempl) THEN
- MemoDialog := '';
-
- IF Box <> NIL THEN
- Dispose (Box, Done);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* ClusterDialog *)
- (* ---------------------------------------------------------------- *)
- (* ClusterDialog dient als Grundlage für RadioButtonsDialog und *)
- (* CheckBoxesDialog; der zusätzliche Parameter RadioButtons gibt an,*)
- (* welches Dialogelement erzeugt werden soll. *)
- (* ---------------------------------------------------------------- *)
- FUNCTION ClusterDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog;
- RadioButtons: BOOLEAN): STRING;
-
- TYPE
- DialogData = RECORD
- Title: STRING [80];
- TX: LONGINT;
- TY: LONGINT;
- ItemsList: pStringCollection;
- Focused: INTEGER;
- END;
-
- VAR
- Cluster: pCluster;
- Lab: pLabel;
- View: pView;
- Box: pDialog;
- Code: INTEGER;
- DD: DialogData;
- R, RL: tRect;
- ID: INTEGER;
-
- FUNCTION GetMaxWidth: INTEGER;
- VAR
- j, i, Max: INTEGER;
- BEGIN
- Max := 0;
- FOR i := 0 TO DD.ItemsList^.Count-1 DO BEGIN
- j := Length (String (DD.ItemsList^.Items^[i]^));
- IF j > Max THEN
- Max := j;
- END;
- GetMaxWidth := Max + 6;
- END;
-
- PROCEDURE Cluster2DD;
- VAR i: INTEGER;
- BEGIN
- DD.ItemsList := New (pStringColl, Init (20, 10));
- FOR i := 0 TO Cluster^.Strings.Count-1 DO
- DD.ItemsList^.Insert (NewStr (String (Cluster^.Strings.At (i)^)));
- END;
-
- PROCEDURE DD2Cluster;
- VAR i: INTEGER;
- BEGIN
- Cluster^.Strings.FreeAll;
- Cluster^.Strings.SetLimit (DD.ItemsList^.Count);
- FOR i := 0 TO DD.ItemsList^.Count-1 DO
- Cluster^.Strings.AtInsert (i, NewStr (String (DD.ItemsList^.At (i)^)));
- END;
-
- BEGIN
- (* -------------------------------------------------------------- *)
- IF Templ <> NIL THEN BEGIN
- Cluster := pCluster (Templ^.Client);
- Lab := pExtendedTemplate (Templ)^.Lab;
- Cluster2DD;
- END ELSE BEGIN
- Cluster := NIL;
- Lab := NIL;
- DD.ItemsList := New (pStringColl, Init (20, 10));
- END;
- (* -------------------------------------------------------------- *)
- IF RadioButtons THEN
- Box := New (pClusterDialog, Init (' tRadioButtons-Dialog ',
- DD.ItemsList,
- Templ <> NIL))
- ELSE
- Box := New (pClusterDialog, Init (' tCheckBoxes-Dialog ',
- DD.ItemsList,
- Templ <> NIL));
- (* -------------------------------------------------------------- *)
- IF Templ=NIL THEN BEGIN
- DD.Title := '';
- DD.TX := Where^.X; DD.TY := Where^.Y;
- DD.Focused := 0;
- END ELSE BEGIN
- IF Lab^.Text <> NIL THEN
- DD.Title := Lab^.Text^;
- DD.TX := Templ^.Origin.X + Lab^.Origin.X;
- DD.TY := Templ^.Origin.Y + Lab^.Origin.Y;
- DD.Focused := 0;
- END;
- (* -------------------------------------------------------------- *)
- Box^.SetData (DD);
- Code := Desktop^.ExecView (Application^.ValidView (Box));
- ClusterDialog := DD.Title;
- (* -------------------------------------------------------------- *)
- IF Code = cmOk THEN BEGIN
- Box^.GetData (DD);
- RL.Assign (DD.TX, DD.TY,
- Succ (DD.TX + Length (DD.Title)), Succ (DD.TY));
-
- R.Assign (DD.TX, DD.TY+1,
- DD.TX + GetMaxWidth, DD.TY + 1 + DD.ItemsList^.Count);
- IF (Templ = NIL) THEN BEGIN
- (* ---------------------------------------------------------- *)
- IF RadioButtons THEN BEGIN
- Cluster := New (pRadioButtons, Init (R, GetItems (DD.ItemsList)));
- ID := idRadioButtons;
- END ELSE BEGIN
- Cluster := New (pCheckBoxes, Init (R, GetItems (DD.ItemsList)));
- ID := idCheckBoxes;
- END;
-
- Lab := New (pLabel, Init (RL, DD.Title, Cluster));
- Templ:= New (pExtendedTemplate,
- Init (Cluster, Lab, NIL, NIL,
- MinItemSize, MaxItemSize,
- DD.Title, ID));
- Templ := pExtendedTemplate (Application^.ValidView (Templ));
- END ELSE BEGIN
- (* ---------------------------------------------------------- *)
- DD2Cluster;
-
- IF Lab^.Text <> NIL THEN
- DisposeStr (Lab^.Text);
- Lab^.Text := NewStr (DD.Title);
-
- pExtendedTemplate (Templ)^.NewChangeBounds (R, RL);
- Dlg^.ReDraw;
- END;
- END ELSE IF (Code = cmDeleteTempl) THEN
- ClusterDialog := '';
-
- IF Box <> NIL THEN
- Dispose (Box, Done);
- IF DD.ItemsList <> NIL THEN
- Dispose (DD.ItemsList, Done);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* RadioButtonsDialog *)
- (* ---------------------------------------------------------------- *)
- FUNCTION RadioButtonsDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- BEGIN
- RadioButtonsDialog := ClusterDialog (Where, Templ, Dlg, TRUE);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* CheckBoxesDialog *)
- (* ---------------------------------------------------------------- *)
- FUNCTION CheckBoxesDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- BEGIN
- CheckBoxesDialog := ClusterDialog (Where, Templ, Dlg, FALSE);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* StandardButtons - Dialoge *)
- (* ---------------------------------------------------------------- *)
- FUNCTION StandardButton (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog;
- ID: WORD;
- Title: STRING;
- Command: WORD;
- Flags: WORD): STRING;
- VAR
- Button: pButton;
- R: tRect;
- BEGIN
- IF Templ <> NIL THEN
- StandardButton := ButtonDialog (Where, Templ, Dlg)
- ELSE BEGIN
- R.Assign (Where^.X, Where^.Y,
- Where^.X+Length (Title)+4, Where^.Y+2);
- Button := New (pButton,
- Init (R, Title, Command, Flags));
- Button^.Options := Button^.Options AND NOT ofPreProcess;
- Templ := New (pTemplate,
- Init (Button, MinButtonSize, MaxItemSize, Title, ID));
- IF Application^.ValidView (Templ) <> NIL THEN
- StandardButton := Title
- ELSE
- StandardButton := '';
- END;
- END;
-
- FUNCTION OkButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- BEGIN
- OKButtonDialog := StandardButton (Where, Templ, Dlg, idOkButton,
- '~O~K', cmOk, bfDefault);
- END;
-
- FUNCTION CancelButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- BEGIN
- CancelButtonDialog := StandardButton (Where, Templ, Dlg, idCancelButton,
- '~A~bbruch', cmCancel, bfNormal);
- END;
-
- FUNCTION YesButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- BEGIN
- YesButtonDialog := StandardButton (Where, Templ, Dlg, idYesButton,
- '~J~a', cmYes, bfNormal);
- END;
-
- FUNCTION NoButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- BEGIN
- NoButtonDialog := StandardButton (Where, Templ, Dlg, idNoButton,
- '~N~ein', cmNo, bfNormal);
- END;
-
- FUNCTION HelpButtonDialog (Where: pPoint;
- VAR Templ: pTemplate;
- Dlg: pWorkDialog): STRING;
- BEGIN
- HelpButtonDialog := StandardButton (Where, Templ, Dlg, idHelpButton,
- '~H~ilfe', cmHelp, bfNormal);
- END;
-
- (* ================================================================ *)
- (* I N S E R T I T E M A R R A Y - P R O Z E D U R E N *)
- (* ================================================================ *)
- (* Die InsertItemArray-Prozeduren müssen die Template Templ als *)
- (* Dialogelement in den Dialog "Dialog" einfügen und werden aufge- *)
- (* rufen, wenn ein tWorkDialog auf Ressource gespeichert werden *)
- (* soll. Es kann nicht einfach der Client der Template eingefügt *)
- (* werden,da sein Origin relativ zu dem der Template angegeben wird.*)
- (* Ausserdem müssen bei den tExtendedTemplate-Objekten auch noch *)
- (* die zugehörigen Objekte wie Labels, Historys und Scrollbalken *)
- (* in den Dialog eingefügt werden (z.B. bei InsertMemo). *)
- (* ---------------------------------------------------------------- *)
- (* InsertStaticText *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE InsertStaticText (Templ: pTemplate;
- Dialog: pDialog);
- VAR R: tRect;
- BEGIN
- Templ^.GetBounds (R);
- Dialog^.Insert (New (pStaticText, Init (R, Templ^.Name^)));
- END;
-
- (* ---------------------------------------------------------------- *)
- (* InsertButton *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE InsertButton (Templ: pTemplate;
- Dialog: pDialog);
- VAR
- R: tRect;
- Button: pButton;
- BEGIN
- Button := pButton (Templ^.Client);
- Templ^.GetBounds (R);
- Dialog^.Insert (New (pButton, Init (R, Button^.Title^,
- Button^.Command,
- Button^.Flags)));
- END;
-
- (* ---------------------------------------------------------------- *)
- (* InsertInputLine *)
- (* ---------------------------------------------------------------- *)
- (* Erstellt ein InputLine-Objekt und fügt es samt dem Label in den *)
- (* Dialog ein. Verfügt die Eingabezeile über eine Aufzeichnungs- *)
- (* liste, so wird das History-Objekt auch eingefügt, wobei es sowie *)
- (* das Label mit der Eingabezeile verbunden werden. Es wird ange- *)
- (* nommen, dass Templ den Typ pExtendedTemplate hat!, was sicherge- *)
- (* stellt ist, da nur InputLineDialog eine Eingabezeile erstellt *)
- (* und durch die Prozeduren-Arrays immer nur die zugehörigen Pro- *)
- (* zeduren aufgerufen werden. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE InsertInputLine (Templ: pTemplate;
- Dialog: pDialog);
- VAR
- InputLine: pInputLine;
- Lab: pLabel;
- History: pHistory;
- R: tRect;
- BEGIN
- InputLine := pInputLine (Templ^.Client);
- GetClientBounds (Templ, R);
- InputLine := New (pInputLine, Init (R, InputLine^.MaxLen));
- Dialog^.Insert (InputLine);
-
- Lab := pExtendedTemplate (Templ)^.Lab;
- GetLabelBounds (Templ, R);
- Dialog^.Insert (New (pLabel, Init (R, Lab^.Text^, InputLine)));
-
- History := pExtendedTemplate (Templ)^.History;
- IF History <> NIL THEN BEGIN
- History^.GetBounds (R);
- Dialog^.Insert (New (pHistory, Init (R, InputLine, History^.HistoryID)));
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* InsertListBox *)
- (* ---------------------------------------------------------------- *)
- (* InsertListBox fügt zunächst den Scrollbalken ein, sofern die *)
- (* Template mit einem solchen verknüpft ist. Anschliessend werden *)
- (* der Client und das Label eingefügt. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE InsertListBox (Templ: pTemplate;
- Dialog: pDialog);
- VAR
- ListBox: pListBox;
- Lab: pLabel;
- ScrollBar: pScrollBar;
- R: tRect;
- BEGIN
- ScrollBar := pExtendedTemplate (Templ)^.ScrollBar;
- IF ScrollBar <> NIL THEN BEGIN
- ScrollBar^.GetBounds (R);
- ScrollBar := New (pScrollBar, Init (R));
- Dialog^.Insert (ScrollBar);
- END;
-
- ListBox := pListBox (Templ^.Client);
- GetClientBounds (Templ, R);
- ListBox := New (pListBox, Init (R, ListBox^.NumCols, ScrollBar));
- Dialog^.Insert (ListBox);
-
- Lab := pExtendedTemplate (Templ)^.Lab;
- GetLabelBounds (Templ, R);
- Dialog^.Insert (New (pLabel, Init (R, Lab^.Text^, ListBox)));
- END;
-
- (* ---------------------------------------------------------------- *)
- (* InsertMemo *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE InsertMemo (Templ: pTemplate;
- Dialog: pDialog);
- VAR
- Memo: pMemo;
- Lab: pLabel;
- ScrollBar: pScrollBar;
- R: tRect;
- BEGIN
- ScrollBar := pExtendedTemplate (Templ)^.ScrollBar;
- IF ScrollBar <> NIL THEN BEGIN
- ScrollBar^.GetBounds (R);
- ScrollBar := New (pScrollBar, Init (R));
- Dialog^.Insert (ScrollBar);
- END;
-
- Memo := pMemo (Templ^.Client);
- GetClientBounds (Templ, R);
- Memo := New (pMemo, Init (R, NIL, ScrollBar, NIL, Memo^.BufSize));
- Dialog^.Insert (Memo);
-
- Lab := pExtendedTemplate (Templ)^.Lab;
- GetLabelBounds (Templ, R);
- Dialog^.Insert (New (pLabel, Init (R, Lab^.Text^, Memo)));
- END;
-
- (* ---------------------------------------------------------------- *)
- (* InsertCluster *)
- (* ---------------------------------------------------------------- *)
- (* InsertCluster wird nicht direkt aufgerufen, sondern nur von *)
- (* InsertRadioButtons und InsertCheckboxes. Ist der zusätzliche *)
- (* Parameter RadioButtons TRUE, so wird ein RadioButtons-Objekt er- *)
- (* zeugt, sonst ein CheckBoxes. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE InsertCluster (Templ: pTemplate;
- Dialog: pDialog;
- RadioButtons: BOOLEAN);
- VAR
- Cluster: pCluster;
- Lab: pLabel;
- R: tRect;
- BEGIN
- Cluster := pCluster (Templ^.Client);
- GetClientBounds (Templ, R);
- IF RadioButtons THEN
- Cluster := New (pRadioButtons,
- Init (R, GetItems (@Cluster^.Strings)))
- ELSE
- Cluster := New (pCheckBoxes,
- Init (R, GetItems (@Cluster^.Strings)));
- Dialog^.Insert (Cluster);
-
- Lab := pExtendedTemplate (Templ)^.Lab;
- GetLabelBounds (Templ, R);
- Dialog^.Insert (New (pLabel, Init (R, Lab^.Text^, Cluster)));
- END;
-
- (* ---------------------------------------------------------------- *)
- (* InsertRadioButtons *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE InsertRadioButtons (Templ: pTemplate;
- Dialog: pDialog);
- BEGIN
- InsertCluster (Templ, Dialog, TRUE);
- END;
-
- (* ---------------------------------------------------------------- *)
- (* InsertCheckBoxes *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE InsertCheckBoxes (Templ: pTemplate;
- Dialog: pDialog);
- BEGIN
- InsertCluster (Templ, Dialog, FALSE);
- END;
-
- (* ================================================================ *)
- (* S A V E S O U R C E A R R A Y - P R O Z E D U R E N *)
- (* ================================================================ *)
- (* Die SaveSourceArray-Prozeduren speichern in die übergebene *)
- (* Stringkollektion Lines den Quelltext, den es zur Erzeugung der *)
- (* Template Templ bzw ihres Clients benötigt. Ist What gleich *)
- (* SaveInsertDef, so werden die zum Einfügen in einen Dialog *)
- (* benötigten Befehle wie R.Assign etc gespeichert; ist What gleich *)
- (* SaveTypeDef, so wird gespeichert, welchen Typ der Client für *)
- (* den Datenaustausch mit dem künftigen Dialog braucht (z.B. *)
- (* "String0: STRING [80];"; siehe auch InputLineSource). *)
- (* ---------------------------------------------------------------- *)
- (* StaticTextSource *)
- (* ---------------------------------------------------------------- *)
- (* Ein tStaticText-Objekt braucht kein Feld für den Datenaustausch, *)
- (* weshalb nur bei What=SaveInsertDef die Befehle zum Einfügen ge- *)
- (* schrieben werden. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE StaticTextSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- VAR R: tRect;
- BEGIN
- IF What = SaveInsertDef THEN BEGIN
- Templ^.GetBounds (R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (New (pStaticText, '+
- 'Init (R, '''+Templ^.Name^+''')));'));
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* ButtonSource *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE ButtonSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- VAR
- Button: pButton;
- R: tRect;
- BEGIN
- Button := pButton (Templ^.Client);
- IF What = SaveInsertDef THEN BEGIN
- Templ^.GetBounds (R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (New (pButton, '+
- 'Init (R, '''+Button^.Title^+''', '+
- Int2Str (Button^.Command)+', '+
- Int2Str (Button^.Flags)+')));'));
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* InputLineSource *)
- (* ---------------------------------------------------------------- *)
- (* Für ein tInputLine-Objekt sind die Befehle zum Einfügen schon *)
- (* einiges aufwendiger, weil berücksichtigt werden muss, ob die *)
- (* Template mit einem History-Objekt verknüpft ist. Auch muss das *)
- (* Label-Objekt eingefügt werden. Ist What=SaveTypeDef, so wird *)
- (* "StringX: STRING [MaxLänge];" geschrieben, wobei X InputLineNo *)
- (* ist, ein Zähler, der von tWorkDialog.SaveAsSource auf Null *)
- (* gesetzt und von InputLineSource erhöht wird, damit bei mehereren *)
- (* Eingabezeilen in einem Dialog keine Probleme mit der Namens- *)
- (* gebung auftreten. Als MaxLänge wird das Feld MaxLen der Eingabe- *)
- (* zeile (also des Clients) verwendet. - Analog hierzu funktio- *)
- (* nieren auch die weiteren ItemSource-Prozeduren. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE InputLineSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- VAR
- InputLine: pInputLine;
- History: pHistory;
- Lab: pLabel;
- R: tRect;
- BEGIN
- InputLine := pInputLine (Templ^.Client);
- History := pExtendedTemplate (Templ)^.History;
- Lab := pExtendedTemplate (Templ)^.Lab;
- IF What = SaveInsertDef THEN BEGIN
- GetClientBounds (Templ, R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' View := New (pInputLine, '+
- 'Init (R, '+Int2Str (InputLine^.MaxLen)+'));'));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (View);'));
- IF Lab^.Text^ <> '' THEN BEGIN
- GetLabelBounds (Templ, R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (New (pLabel, '+
- 'Init (R, '''+Lab^.Text^+''', View)));'));
- END;
- IF History <> NIL THEN BEGIN
- History^.GetBounds (R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (New (pHistory, '+
- 'Init (R, pInputLine (View), '+
- Int2Str (History^.HistoryID)+')));'));
- END;
- END ELSE BEGIN
- Lines^.Insert (NewStr (' String'+Int2Str (InputLineNo)+': STRING ['+Int2Str (InputLine^.MaxLen)+'];'));
- Inc (InputLineNo);
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* ListBoxSource *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE ListBoxSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- VAR
- ScrollBarStr: STRING;
- ScrollBar: pScrollBar;
- ListBox: pListBox;
- Lab: pLabel;
- R: tRect;
- BEGIN
- ListBox := pListBox (Templ^.Client);
- ScrollBar := pExtendedTemplate (Templ)^.ScrollBar;
- Lab := pExtendedTemplate (Templ)^.Lab;
- IF What = SaveInsertDef THEN BEGIN
- IF ScrollBar <> NIL THEN BEGIN
- ScrollBar^.GetBounds (R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' View := New (pScrollBar, '+
- 'Init (R)); '));
- Lines^.Insert (NewStr (' pScrollBar (View)^.SetRange (0, 0); '));
- ScrollBarStr := 'pScrollBar (View)';
- END ELSE
- ScrollBarStr := 'NIL';
-
- GetClientBounds (Templ, R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' View := New (pListBox, '+
- 'Init (R, '+Int2Str (ListBox^.NumCols)+', '+
- ScrollBarStr+'));'));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (View);'));
-
- IF Lab^.Text^ <> '' THEN BEGIN
- GetLabelBounds (Templ, R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (New (pLabel, '+
- 'Init (R, '''+Lab^.Text^+''', View)));'));
- END;
- END ELSE BEGIN
- Lines^.Insert (NewStr (' ListPtr'+Int2Str (ListBoxNo)+': pCollection;'));
- Lines^.Insert (NewStr (' Focused'+Int2Str (ListBoxNo)+': INTEGER;'));
- Inc (ListBoxNo);
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* MemoSource *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE MemoSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- VAR
- ScrollBarStr: STRING;
- ScrollBar: pScrollBar;
- Memo: pMemo;
- Lab: pLabel;
- R: tRect;
- BEGIN
- Memo := pMemo (Templ^.Client);
- ScrollBar := pExtendedTemplate (Templ)^.ScrollBar;
- Lab := pExtendedTemplate (Templ)^.Lab;
- IF What = SaveInsertDef THEN BEGIN
- IF ScrollBar <> NIL THEN BEGIN
- ScrollBar^.GetBounds (R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' View := New (pScrollBar, '+
- 'Init (R)); '));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (View); '));
- Lines^.Insert (NewStr (' pScrollBar (View)^.SetRange (0, 0); '));
- ScrollBarStr := 'pScrollBar (View)';
- END ELSE
- ScrollBarStr := 'NIL';
-
- GetClientBounds (Templ, R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' View := New (pMemo, '+
- 'Init (R, NIL, '+ScrollBarStr+', NIL, '+Int2Str (Memo^.BufSize)+'));'));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (View);'));
-
- IF Lab^.Text^ <> '' THEN BEGIN
- GetLabelBounds (Templ, R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (New (pLabel, '+
- 'Init (R, '''+Lab^.Text^+''', View)));'));
- END;
- END ELSE BEGIN
- Lines^.Insert (NewStr (' TextLen'+Int2Str (MemoNo)+': WORD;'));
- Lines^.Insert (NewStr (' TextRec'+Int2Str (MemoNo)+': ARRAY [0..'+Int2Str (Memo^.BufSize)+'] OF CHAR; '));
- Inc (MemoNo);
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* ClusterSource *)
- (* ---------------------------------------------------------------- *)
- (* ClusterSource ist für das Speichern des Quellcodes für die Er- *)
- (* zeugung von RadioButtons und CheckBoxes verantwortlich und wird *)
- (* von RadioButtonsSource und CheckBoxesSource aufgerufen, wobei *)
- (* TypeOfCluster entweder "pRadioButtons" oder "pCheckBoxes" sein *)
- (* muss. Die Speicherung ist etwas aufwendig, da die Elemente des *)
- (* Clusters, also die Strings aus tCluster.Strings, in Anweisungen *)
- (* der Art "NewSItem (NAME, " umgesetzt werden müssen. WriteItems *)
- (* übernimmt diese Aufgabe. *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE ClusterSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl;
- TypeOfCluster: STRING);
- VAR
- Cluster: pCluster;
- Lab: pLabel;
- R: tRect;
-
- PROCEDURE WriteItems;
- CONST
- FillStr : STRING = ' ';
- VAR
- j, i: INTEGER;
- s: STRING;
- BEGIN
- FOR i := 0 TO Cluster^.Strings.Count-1 DO BEGIN
- s := String (Cluster^.Strings.Items^[i]^);
- Lines^.Insert (NewStr (FillStr+'NewSItem ('''+s+''','));
- END;
- j := i;
- s := '';
- FOR i := 0 TO j DO
- s := s + ')';
- s := s+'));';
- Lines^.Insert (NewStr (FillStr+'NIL'+s));
- END;
-
- BEGIN
- Cluster := pCluster (Templ^.Client);
- Lab := pExtendedTemplate (Templ)^.Lab;
- IF What = SaveInsertDef THEN BEGIN
- GetClientBounds (Templ, R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' View := New ('+TypeOfCluster+','));
- Lines^.Insert (NewStr (' Init (R, '));
- WriteItems;
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (View);'));
-
- IF Lab^.Text^ <> '' THEN BEGIN
- GetLabelBounds (Templ, R);
- Lines^.Insert (NewStr (GetAssignString (R)));
- Lines^.Insert (NewStr (' '+InsertStr+'Insert (New (pLabel, '+
- 'Init (R, '''+Lab^.Text^+''', View)));'));
- END;
- END ELSE BEGIN
- Lines^.Insert (NewStr (' Cluster'+Int2Str (ClusterNo)+': WORD;'));
- Inc (ClusterNo);
- END;
- END;
-
- (* ---------------------------------------------------------------- *)
- (* ClusterSource *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE RadioButtonsSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- BEGIN
- ClusterSource (What, Templ, Lines, 'pRadioButtons');
- END;
-
- (* ---------------------------------------------------------------- *)
- (* ClusterSource *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE CheckBoxesSource (What: BYTE;
- Templ: pTemplate;
- Lines: pStringColl);
- BEGIN
- ClusterSource (What, Templ, Lines, 'pCheckBoxes');
- END;
-
- (* ---------------------------------------------------------------- *)
- (* RegisterDlgBuild *)
- (* ---------------------------------------------------------------- *)
- PROCEDURE RegisterDlgBuild;
- BEGIN
- RegisterType (rTemplate);
- RegisterType (rExtendedTemplate);
- RegisterType (rWorkDialog);
- RegisterEditors;
- END;
-
- END.
- (* ---------------------------------------------------------------- *)
- (* Ende von DLGBUILD.PAS *)
- (* ---------------------------------------------------------------- *)
-