ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/journaling/design/IBDBReg.pas
Revision: 143
Committed: Fri Feb 23 12:11:21 2018 UTC (6 years, 1 month ago) by tony
Content type: text/x-pascal
Original Path: ibx/trunk/design/IBDBReg.pas
File size: 36422 byte(s)
Log Message:
Fixes Merged

File Contents

# User Rev Content
1 tony 33 {************************************************************************}
2     { }
3     { Borland Delphi Visual Component Library }
4     { InterBase Express core components }
5     { }
6     { Copyright (c) 1998-2000 Inprise Corporation }
7     { }
8     { InterBase Express is based in part on the product }
9     { Free IB Components, written by Gregory H. Deatz for }
10     { Hoagland, Longo, Moran, Dunst & Doukas Company. }
11     { Free IB Components is used under license. }
12     { }
13     { The contents of this file are subject to the InterBase }
14     { Public License Version 1.0 (the "License"); you may not }
15     { use this file except in compliance with the License. You }
16     { may obtain a copy of the License at http://www.Inprise.com/IPL.html }
17     { Software distributed under the License is distributed on }
18     { an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either }
19     { express or implied. See the License for the specific language }
20     { governing rights and limitations under the License. }
21     { The Original Code was created by InterBase Software Corporation }
22     { and its successors. }
23     { Portions created by Inprise Corporation are Copyright (C) Inprise }
24     { Corporation. All Rights Reserved. }
25     { Contributor(s): Jeff Overcash }
26     { }
27     { IBX For Lazarus (Firebird Express) }
28     { Contributor: Tony Whyman, MWA Software http://www.mwasoftware.co.uk }
29     { Portions created by MWA Software are copyright McCallum Whyman }
30 tony 143 { Associates Ltd 2011 - 2018 }
31 tony 33 {************************************************************************}
32    
33     unit IBDBReg;
34    
35     {$MODE Delphi}
36    
37     (*
38     * Compiler defines
39     *)
40     {$A+} (* Aligned records: On *)
41     {$B-} (* Short circuit boolean expressions: Off *)
42     {$H+} (* Huge Strings: On *)
43     {$J-} (* Modification of Typed Constants: Off *)
44     {$M+} (* Generate run-time type information: On *)
45     {$O+} (* Optimization: On *)
46     {$Q-} (* Overflow checks: Off *)
47     {$R-} (* Range checks: Off *)
48     {$T+} (* Typed address: On *)
49     {$W-} (* Always generate stack frames: Off *)
50     {$X+} (* Extended syntax: On *)
51     {$Z1} (* Minimum Enumeration Size: 1 Byte *)
52    
53     interface
54    
55     uses SysUtils, Classes, Graphics, Dialogs, Controls, Forms, TypInfo,
56     DB, IBTable, IBDatabase, IBEventsEditor, LazarusPackageIntf,
57 tony 80 IBUpdateSQL, IBUpdate, ComponentEditors, PropEdits, DBPropEdits, FieldsEditor,
58 tony 33 dbFieldLinkPropEditor, dbFieldListPropEditor, IBDialogs;
59    
60     type
61    
62     { TIBFileNameProperty
63     Property editor the DataBase Name property. Brings up the Open dialog }
64    
65     TIBFileNameProperty = class(TStringProperty)
66     public
67     procedure Edit; override;
68     function GetAttributes: TPropertyAttributes; override;
69     end;
70    
71     { TIBNameProperty
72     }
73     TIBNameProperty = class(TStringProperty)
74     public
75     function GetAttributes: TPropertyAttributes; override;
76     end;
77    
78     { TIBStoredProcNameProperty
79     Editor for the TIBStoredProc.StoredProcName property. Displays a drop-down list of all
80     the StoredProcedures in the Database.}
81     TIBStoredProcNameProperty = class(TIBNameProperty)
82     public
83     procedure GetValues(Proc: TGetStrProc); override;
84     end;
85    
86 tony 107 { TIBPackageNameProperty
87     Editor for the TIBStoredProc.PackageName property. Displays a drop-down list of all
88     the StoredProcedures in the Database.}
89     TIBPackageNameProperty = class(TIBNameProperty)
90     public
91     procedure GetValues(Proc: TGetStrProc); override;
92     end;
93    
94 tony 33 { TIBTableNameProperty
95     Editor for the TIBTable.TableName property. Displays a drop-down list of all
96     the Tables in the Database.}
97     TIBTableNameProperty = class(TIBNameProperty)
98     public
99     procedure GetValues(Proc: TGetStrProc); override;
100     end;
101    
102     { TDBStringProperty }
103    
104     TDBStringProperty = class(TStringProperty)
105     private
106     function ConnecttoDB: boolean;
107     public
108     function GetAttributes: TPropertyAttributes; override;
109     procedure GetValueList(List: TStrings); virtual;
110     procedure GetValues(Proc: TGetStrProc); override;
111     procedure Edit; override;
112     end;
113    
114     { TIBIndexFieldNamesProperty }
115    
116     TIBIndexFieldNamesProperty = class(TDBStringProperty)
117     public
118     procedure GetValueList(List: TStrings); override;
119     end;
120    
121     TIBIndexNameProperty = class(TDBStringProperty)
122     public
123     procedure GetValueList(List: TStrings); override;
124     end;
125    
126     { TIBDatabaseEditor }
127    
128     TIBDatabaseEditor = class(TComponentEditor)
129     procedure ExecuteVerb(Index: Integer); override;
130     function GetVerb(Index: Integer): string; override;
131     function GetVerbCount: Integer; override;
132     end;
133    
134     { TIBTransactionEditor }
135    
136     TIBTransactionEditor = class(TComponentEditor)
137     public
138     procedure ExecuteVerb(Index: Integer); override;
139     function GetVerb(Index: Integer): string; override;
140     function GetVerbCount: Integer; override;
141     end;
142    
143 tony 45 { TIBArrayGridEditor }
144    
145     TIBArrayGridEditor = class(TComponentEditor)
146     public
147     procedure ExecuteVerb(Index: Integer); override;
148     function GetVerb(Index: Integer): string; override;
149     function GetVerbCount: Integer; override;
150     end;
151    
152 tony 33 { TIBQueryEditor }
153    
154     TIBQueryEditor = class(TFieldsComponentEditor)
155     public
156     procedure ExecuteVerb(Index: Integer); override;
157     function GetVerb(Index: Integer): string; override;
158     function GetVerbCount: Integer; override;
159     end;
160    
161     { TIBStoredProcEditor }
162    
163     TIBStoredProcEditor = class(TFieldsComponentEditor)
164     public
165     procedure ExecuteVerb(Index: Integer); override;
166     function GetVerb(Index: Integer): string; override;
167     function GetVerbCount: Integer; override;
168     end;
169    
170     { TIBDataSetEditor }
171    
172     TIBDataSetEditor = class(TFieldsComponentEditor)
173     public
174     procedure ExecuteVerb(Index: Integer); override;
175     function GetVerb(Index: Integer): string; override;
176     function GetVerbCount: Integer; override;
177     end;
178    
179     { TIBUpdateSQLEditor }
180    
181     TIBUpdateSQLEditor = class(TComponentEditor)
182     public
183     procedure ExecuteVerb(Index: Integer); override;
184     function GetVerb(Index: Integer): string; override;
185     function GetVerbCount: Integer; override;
186     end;
187    
188     { TIBSQLEditor }
189    
190     TIBSQLEditor = class(TComponentEditor)
191     public
192     procedure ExecuteVerb(Index: Integer); override;
193     function GetVerb(Index: Integer): string; override;
194     function GetVerbCount: Integer; override;
195     end;
196    
197     { TIBServiceEditor}
198    
199     TIBServiceEditor = class(TComponentEditor)
200     public
201     procedure ExecuteVerb(Index: Integer); override;
202     function GetVerb(Index: Integer): string; override;
203     function GetVerbCount: Integer; override;
204     end;
205    
206     TIBStoredProcParamsProperty = class(TCollectionPropertyEditor)
207     end;
208    
209     { TIBTableFieldLinkProperty }
210    
211     TIBTableFieldLinkProperty = class(TFieldLinkProperty)
212     private
213     FTable: TIBTable;
214     protected
215     function GetIndexDefs: TIndexDefs; override;
216     function GetIndexFieldNames: string; override;
217     function GetMasterFields: string; override;
218     procedure SetIndexFieldNames(const Value: string); override;
219     procedure SetMasterFields(const Value: string); override;
220     public
221     procedure Edit; override;
222     end;
223    
224     { TSQLPropertyEditor }
225    
226     TSQLPropertyEditor = class(TStringsPropertyEditor)
227     public
228     function GetAttributes: TPropertyAttributes; override;
229     end;
230    
231     { TIBQuerySQLProperty }
232    
233     TIBQuerySQLProperty = class(TSQLPropertyEditor)
234     public
235     procedure Edit; override;
236     end;
237    
238     {TIBSQLSQLPropertyEditor }
239    
240     TIBSQLSQLPropertyEditor = class(TSQLPropertyEditor)
241     public
242     procedure Edit; override;
243     end;
244    
245     { TIBDatasetSQLProperty }
246    
247     TIBDatasetSQLProperty = class(TSQLPropertyEditor)
248     public
249     procedure Edit; override;
250     end;
251    
252     { TIBSQLProperty }
253    
254     TIBSQLProperty = class(TSQLPropertyEditor)
255     public
256     procedure Edit; override;
257     end;
258    
259     { TUpdateSQLPropertyEditor }
260    
261     TUpdateSQLPropertyEditor = class(TSQLPropertyEditor)
262     protected
263     FIBUpdateSQL: TIBUpdateSQL;
264     FDatabase: TIBDatabase;
265     function GetObjects: boolean;
266     end;
267    
268     { TIBUpdateSQLProperty }
269    
270     TIBUpdateSQLProperty = class(TSQLPropertyEditor)
271     public
272     procedure Edit; override;
273     end;
274    
275     { TIBRefreshSQLProperty }
276    
277     TIBRefreshSQLProperty = class(TSQLPropertyEditor)
278     public
279     procedure Edit; override;
280     end;
281    
282     { TIBInsertSQLProperty }
283    
284     TIBInsertSQLProperty = class(TSQLPropertyEditor)
285     public
286     procedure Edit; override;
287     end;
288    
289     { TIBDeleteSQLProperty }
290    
291     TIBDeleteSQLProperty = class(TSQLPropertyEditor)
292     public
293     procedure Edit; override;
294     end;
295    
296     { TIBUpdateSQLUpdateProperty }
297    
298     TIBUpdateSQLUpdateProperty = class(TUpdateSQLPropertyEditor)
299     public
300     procedure Edit; override;
301     end;
302    
303     { TIBUpdateSQLRefreshSQLProperty }
304    
305     TIBUpdateSQLRefreshSQLProperty = class(TUpdateSQLPropertyEditor)
306     public
307     procedure Edit; override;
308     end;
309    
310     { TIBUpdateSQLInsertSQLProperty }
311    
312     TIBUpdateSQLInsertSQLProperty = class(TUpdateSQLPropertyEditor)
313     public
314     procedure Edit; override;
315     end;
316    
317     { TIBUpdateSQLDeleteProperty }
318    
319     TIBUpdateSQLDeleteProperty = class(TUpdateSQLPropertyEditor)
320     public
321     function GetAttributes: TPropertyAttributes; override;
322     procedure Edit; override;
323     end;
324    
325 tony 126 { TIBUpdateRefreshSQLProperty }
326    
327     TIBUpdateRefreshSQLProperty = class(TSQLPropertyEditor)
328     protected
329     FIBUpdate: TIBUpdate;
330     FDatabase: TIBDatabase;
331     function GetObjects: boolean;
332     public
333     procedure Edit; override;
334     end;
335    
336    
337 tony 33 { TIBEventListProperty }
338    
339     TIBEventListProperty = class(TClassProperty)
340     public
341     function GetAttributes: TPropertyAttributes; override;
342     procedure Edit; override;
343     end;
344    
345     {TIBGeneratorProperty}
346    
347     TIBGeneratorProperty = class(TPersistentPropertyEditor)
348     public
349     function GetAttributes: TPropertyAttributes; override;
350     procedure Edit; override;
351     end;
352    
353     { TDBDynamicGridFieldProperty }
354    
355     TDBDynamicGridFieldProperty = class(TFieldProperty)
356     public
357     procedure FillValues(const Values: TStringList); override;
358     end;
359    
360     { TDBLookupPropertiesGridFieldProperty }
361    
362     TDBLookupPropertiesGridFieldProperty = class(TFieldProperty)
363     public
364     procedure FillValues(const Values: TStringList); override;
365     end;
366    
367     { TIBTreeViewFieldProperty }
368    
369     TIBTreeViewFieldProperty = class(TFieldProperty)
370     public
371     procedure FillValues(const Values: TStringList); override;
372     end;
373    
374     { TIBDynamicGridIndexNamesProperty }
375    
376     TIBDynamicGridIndexNamesProperty = class(TIndexFieldNamesProperty)
377     protected
378     function GetFieldDefs: TFieldDefs; override;
379     function GetIndexFieldNames: string; override;
380     procedure SetIndexFieldNames(const Value: string); override;
381     end;
382    
383 tony 45 { TIBFieldDefsProperty }
384 tony 33
385 tony 45 TIBFieldDefsProperty = class(TCollectionPropertyEditor)
386     public
387     procedure Edit; override;
388     end;
389 tony 33
390 tony 45 { TIBIndexDefsProperty }
391    
392     TIBIndexDefsProperty = class(TCollectionPropertyEditor)
393     public
394     procedure Edit; override;
395     end;
396    
397    
398 tony 33 procedure Register;
399    
400     implementation
401    
402 tony 45 uses IB, IBQuery, IBStoredProc, IBCustomDataSet, FBMessages,
403     IBSQL, IBSQLMonitor, IBDatabaseInfo, IBEvents, IBTypes,
404 tony 33 IBServices, IBDatabaseEdit, IBTransactionEdit,
405     IBBatchMove, IBExtract,LResources, IBSelectSQLEditor,
406     IBModifySQLEditor,IBDeleteSQLEditor,IBRefreshSQLEditor,
407     IBInsertSQLEditor, IBGeneratorEditor, IBUpdateSQLEditor, IBDataSetEditor,
408     IBSQLEditor, ibserviceeditor, LCLVersion, IBDynamicGrid, IBLookupComboEditBox,
409 tony 45 IBTreeView, DBControlGrid, ibxscript, IBLocalDBSupport, IBDSDialogs,
410 tony 47 IBArrayGrid, IBVersion, IBDataOutput;
411 tony 33
412 tony 45 const
413     IBPalette1 = 'Firebird'; {do not localize}
414     IBPalette2 = 'Firebird Admin'; {do not localize}
415     IBPalette3 = 'Firebird Data Controls'; {do not localize}
416    
417     resourcestring
418 tony 47 SInterbaseExpressVersion = 'Firebird Express for Lazarus ' + IBX_VERSION;
419 tony 45 SEditSQL = 'Edit SQL';
420     SIBSQLEditor = 'IBSQL Editor';
421     SIBServiceEditor = 'Edit IB Service';
422     SIBUpdateSQLEditor = '&UpdateSQL Editor...';
423     SIBDataSetEditor = '&Dataset Editor...';
424     SExecute = 'E&xecute';
425     SIBDatabaseEditor = 'Da&tabase Editor...';
426     SIBTransactionEditor = '&Transaction Editor...';
427     SIBUpdateLayout = 'Update Layout';
428 tony 33
429     procedure Register;
430     begin
431     if not TryIBLoad then
432     begin
433     MessageDlg('IBX is unable to locate the Firebird Library - have you remembered to install it?',mtError,[mbOK],0);
434     Exit;
435     end;
436    
437 tony 106 RegisterNoIcon([TIBStringField, TIBBCDField, TIBMemoField, TIBArrayField,
438     TIBSmallintField, TIBIntegerField, TIBLargeIntField]);
439 tony 33 {$if lcl_fullversion < 01010000}
440     {see http://bugs.freepascal.org/view.php?id=19035 }
441     RegisterNoIcon([TIntegerField]);
442     {$endif}
443     RegisterComponents(IBPalette1, [ TIBQuery, TIBDataSet,
444 tony 80 TIBDatabase, TIBTransaction, TIBUpdateSQL, TIBUpdate, TIBEvents,
445 tony 33 TIBSQL, TIBDatabaseInfo, TIBSQLMonitor,
446 tony 47 TIBStoredProc,TIBBatchMove, TIBTable,TIBExtract, TIBXScript, TIBLocalDBSupport,
447     TIBBlockFormatOut,TIBCSVDataOut,TIBInsertStmtsOut]);
448 tony 45 if FirebirdAPI.HasServiceAPI then
449 tony 33 RegisterComponents(IBPalette2, [TIBConfigService, TIBBackupService,
450 tony 143 TIBRestoreService, TIBValidationService, TIBOnlineValidationService, TIBStatisticalService,
451 tony 33 TIBLogService, TIBSecurityService, TIBServerProperties]);
452    
453    
454 tony 45 RegisterComponents(IBPalette3,[TIBLookupComboEditBox,TIBDynamicGrid,TIBTreeView,TDBControlGrid, TIBArrayGrid]);
455 tony 33 RegisterPropertyEditor(TypeInfo(TIBFileName), TIBDatabase, 'DatabaseName', TIBFileNameProperty); {do not localize}
456     RegisterPropertyEditor(TypeInfo(string), TIBStoredProc, 'StoredProcName', TIBStoredProcNameProperty); {do not localize}
457 tony 107 RegisterPropertyEditor(TypeInfo(string), TIBStoredProc, 'PackageName', TIBPackageNameProperty); {do not localize}
458 tony 33 RegisterPropertyEditor(TypeInfo(TParams), TIBStoredProc, 'Params', TIBStoredProcParamsProperty);
459     RegisterPropertyEditor(TypeInfo(string), TIBTable, 'TableName', TIBTableNameProperty); {do not localize}
460     RegisterPropertyEditor(TypeInfo(string), TIBTable, 'IndexName', TIBIndexNameProperty); {do not localize}
461     RegisterPropertyEditor(TypeInfo(string), TIBTable, 'IndexFieldNames', TIBIndexFieldNamesProperty); {do not localize}
462     RegisterPropertyEditor(TypeInfo(string), TIBTable, 'MasterFields', TIBTableFieldLinkProperty); {do not localize}
463 tony 45 RegisterPropertyEditor(TypeInfo(TFieldDefs), TIBTable, 'FieldDefs', TIBFieldDefsProperty); {do not localize}
464     RegisterPropertyEditor(TypeInfo(TIndexDefs), TIBTable, 'IndexDefs', TIBIndexDefsProperty); {do not localize}
465 tony 33 RegisterPropertyEditor(TypeInfo(TStrings), TIBQuery, 'SQL', TIBQuerySQLProperty); {do not localize}
466     RegisterPropertyEditor(TypeInfo(TStrings), TIBDataSet, 'SelectSQL', TIBDatasetSQLProperty); {do not localize}
467     RegisterPropertyEditor(TypeInfo(TStrings), TIBDataSet, 'ModifySQL', TIBUpdateSQLProperty); {do not localize}
468     RegisterPropertyEditor(TypeInfo(TStrings), TIBDataSet, 'InsertSQL', TIBInsertSQLProperty); {do not localize}
469     RegisterPropertyEditor(TypeInfo(TStrings), TIBDataSet, 'RefreshSQL', TIBRefreshSQLProperty); {do not localize}
470     RegisterPropertyEditor(TypeInfo(TStrings), TIBDataSet, 'DeleteSQL', TIBDeleteSQLProperty); {do not localize}
471     RegisterPropertyEditor(TypeInfo(TStrings), TIBSQL, 'SQL', TIBSQLSQLPropertyEditor); {do not localize}
472     RegisterPropertyEditor(TypeInfo(TStrings), TIBUpdateSQL, 'RefreshSQL', TIBUpdateSQLRefreshSQLProperty); {do not localize}
473     RegisterPropertyEditor(TypeInfo(TStrings), TIBUpdateSQL, 'ModifySQL', TIBUpdateSQLUpdateProperty); {do not localize}
474     RegisterPropertyEditor(TypeInfo(TStrings), TIBUpdateSQL, 'InsertSQL', TIBUpdateSQLInsertSQLProperty); {do not localize}
475     RegisterPropertyEditor(TypeInfo(TStrings), TIBUpdateSQL, 'DeleteSQL', TIBUpdateSQLDeleteProperty); {do not localize}
476 tony 126 RegisterPropertyEditor(TypeInfo(TStrings), TIBUpdate, 'RefreshSQL', TIBUpdateRefreshSQLProperty); {do not localize}
477 tony 33 RegisterPropertyEditor(TypeInfo(TStrings), TIBEvents, 'Events', TIBEventListProperty); {do not localize}
478     RegisterPropertyEditor(TypeInfo(TPersistent), TIBDataSet, 'GeneratorField', TIBGeneratorProperty); {do not localize}
479     RegisterPropertyEditor(TypeInfo(TPersistent), TIBQuery, 'GeneratorField', TIBGeneratorProperty); {do not localize}
480 tony 107 RegisterPropertyEditor(TypeInfo(TPersistent), TIBTable, 'GeneratorField', TIBGeneratorProperty); {do not localize}
481 tony 33
482     RegisterComponentEditor(TIBDatabase, TIBDatabaseEditor);
483     RegisterComponentEditor(TIBTransaction, TIBTransactionEditor);
484     RegisterComponentEditor(TIBUpdateSQL, TIBUpdateSQLEditor);
485     RegisterComponentEditor(TIBDataSet, TIBDataSetEditor);
486     RegisterComponentEditor(TIBQuery, TIBQueryEditor);
487     RegisterComponentEditor(TIBStoredProc, TIBStoredProcEditor);
488     RegisterComponentEditor(TIBSQL, TIBSQLEditor);
489     RegisterComponentEditor(TIBCustomService, TIBServiceEditor);
490 tony 45 RegisterComponentEditor(TIBArrayGrid, TIBArrayGridEditor);
491 tony 33
492    
493     {Firebird Data Access Controls}
494     RegisterPropertyEditor(TypeInfo(string), TDBLookupProperties, 'KeyField', TDBDynamicGridFieldProperty);
495     RegisterPropertyEditor(TypeInfo(string), TDBLookupProperties, 'ListField', TDBDynamicGridFieldProperty);
496     RegisterPropertyEditor(TypeInfo(string), TIBDynamicGrid, 'IndexFieldNames', TIBDynamicGridIndexNamesProperty);
497     RegisterPropertyEditor(TypeInfo(string), TDBLookupProperties, 'DataFieldName', TDBLookupPropertiesGridFieldProperty);
498     RegisterPropertyEditor(TypeInfo(string), TIBTreeView, 'KeyField', TIBTreeViewFieldProperty);
499     RegisterPropertyEditor(TypeInfo(string), TIBTreeView, 'TextField', TIBTreeViewFieldProperty);
500     RegisterPropertyEditor(TypeInfo(string), TIBTreeView, 'ParentField', TIBTreeViewFieldProperty);
501     RegisterPropertyEditor(TypeInfo(string), TIBTreeView, 'HasChildField', TIBTreeViewFieldProperty);
502 tony 143 RegisterPropertyEditor(TypeInfo(string), TIBTreeView, 'ImageIndexField', TIBTreeViewFieldProperty);
503     RegisterPropertyEditor(TypeInfo(string), TIBTreeView, 'SelectedIndexField', TIBTreeViewFieldProperty);
504 tony 33
505 tony 39 IBGUIInterface := TIBDSLCLInterface.Create;
506 tony 33 end;
507    
508     procedure LoadDataSourceFields(DataSource: TDataSource; List: TStrings);
509     var
510     DataSet: TDataSet;
511     i: Integer;
512     begin
513     if Assigned(DataSource) then
514     begin
515     DataSet := DataSource.DataSet;
516     if Assigned(DataSet) then
517     begin
518     if DataSet.Fields.Count > 0 then
519     DataSet.GetFieldNames(List)
520     else
521     begin
522     DataSet.FieldDefs.Update;
523     for i := 0 to DataSet.FieldDefs.Count - 1 do
524     List.Add(DataSet.FieldDefs[i].Name);
525     end;
526     end;
527     end;
528     end;
529    
530 tony 126 { TIBUpdateRefreshSQLProperty }
531    
532     function TIBUpdateRefreshSQLProperty.GetObjects: boolean;
533     begin
534     Result := false;
535     FIBUpdate := GetComponent(0) as TIBUpdate;
536     if not assigned(FIBUpdate) or not assigned(FIBUpdate.DataSet) then
537     Exit;
538     FDatabase := nil;
539     if FIBUpdate.DataSet is TIBQuery then
540     begin
541     FDatabase := (FIBUpdate.DataSet as TIBQuery).Database;
542     Result := true
543     end;
544     end;
545    
546     procedure TIBUpdateRefreshSQLProperty.Edit;
547     begin
548     GetObjects;
549     if IBRefreshSQLEditor.EditSQL(FIBUpdate.DataSet,FIBUpdate.RefreshSQL) then Modified;
550     end;
551    
552 tony 107 { TIBPackageNameProperty }
553    
554     procedure TIBPackageNameProperty.GetValues(Proc: TGetStrProc);
555     var
556     StoredProc : TIBStoredProc;
557     i : integer;
558     begin
559     StoredProc := GetComponent(0) as TIBStoredProc;
560     if StoredProc.Database = nil then
561     Exit;
562    
563     with StoredProc do
564     try
565     for I := 0 to PackageNames.Count - 1 do
566     Proc (PackageNames[i]);
567     except on E: Exception do
568     MessageDlg(E.Message,mtError,[mbOK],0)
569     end;
570     end;
571    
572 tony 45 { TIBIndexDefsProperty }
573    
574     procedure TIBIndexDefsProperty.Edit;
575     var IndexDefs: TIndexDefs;
576     begin
577     IndexDefs := TIndexDefs(GetObjectValue);
578     if IndexDefs <> nil then
579     IndexDefs.Update;
580     inherited Edit;
581     end;
582    
583     { TIBFieldDefsProperty }
584    
585     procedure TIBFieldDefsProperty.Edit;
586     var FieldDefs: TFieldDefs;
587     begin
588     FieldDefs := TFieldDefs(GetObjectValue);
589     if FieldDefs <> nil then
590     FieldDefs.Update;
591     inherited Edit;
592     end;
593    
594     { TIBArrayGridEditor }
595    
596     procedure TIBArrayGridEditor.ExecuteVerb(Index: Integer);
597     begin
598     if Index < inherited GetVerbCount then
599     inherited ExecuteVerb(Index)
600     else
601     case Index of
602     0: TIBArrayGrid(Component).UpdateLayout;
603     end;
604     end;
605    
606     function TIBArrayGridEditor.GetVerb(Index: Integer): string;
607     begin
608     if Index < inherited GetVerbCount then
609     Result := inherited GetVerb(Index) else
610     begin
611     Dec(Index, inherited GetVerbCount);
612     case Index of
613     0: Result := SIBUpdateLayout;
614     1 : Result := SInterbaseExpressVersion ;
615     end;
616     end;
617     end;
618    
619     function TIBArrayGridEditor.GetVerbCount: Integer;
620     begin
621     Result := 2;
622     end;
623    
624 tony 33 { TDBLookupPropertiesGridFieldProperty }
625    
626     procedure TDBLookupPropertiesGridFieldProperty.FillValues(
627     const Values: TStringList);
628     var
629     P: TDBLookupProperties;
630     begin
631     P :=TDBLookupProperties(GetComponent(0));
632     if not (P is TDBLookupProperties) then exit;
633     LoadDataSourceFields(TIBDynamicGrid(P.Owner.Grid).DataSource, Values);
634     end;
635    
636     { TIBTreeViewFieldProperty }
637    
638     procedure TIBTreeViewFieldProperty.FillValues(const Values: TStringList);
639     var ListSource: TDataSource;
640     begin
641     ListSource := TIBTreeView(GetComponent(0)).DataSource;
642     LoadDataSourceFields(ListSource, Values);
643     end;
644    
645     { TIBDynamicGridIndexNamesProperty }
646    
647     function TIBDynamicGridIndexNamesProperty.GetFieldDefs: TFieldDefs;
648     var Grid: TIBDynamicGrid;
649     begin
650     Result := nil;
651     Grid := TIBDynamicGrid(GetComponent(0));
652     if assigned(Grid.DataSource) and assigned(Grid.DataSource.DataSet) then
653     Result := Grid.DataSource.DataSet.FieldDefs
654     end;
655    
656     function TIBDynamicGridIndexNamesProperty.GetIndexFieldNames: string;
657     var Grid: TIBDynamicGrid;
658     begin
659     Grid := TIBDynamicGrid(GetComponent(0));
660     Result := Grid.IndexFieldNames
661     end;
662    
663     procedure TIBDynamicGridIndexNamesProperty.SetIndexFieldNames(
664     const Value: string);
665     var Grid: TIBDynamicGrid;
666     begin
667     Grid := TIBDynamicGrid(GetComponent(0));
668     Grid.IndexFieldNames := Value
669     end;
670    
671     { TDBDynamicGridFieldProperty }
672    
673     procedure TDBDynamicGridFieldProperty.FillValues(const Values: TStringList);
674     var
675     P: TDBLookupProperties;
676     begin
677     P :=TDBLookupProperties(GetComponent(0));
678     if not (P is TDBLookupProperties) then exit;
679     LoadDataSourceFields(P.ListSource, Values);
680     end;
681    
682     { TIBServiceEditor }
683    
684     procedure TIBServiceEditor.ExecuteVerb(Index: Integer);
685     begin
686     if Index < inherited GetVerbCount then
687     inherited ExecuteVerb(Index) else
688     begin
689     Dec(Index, inherited GetVerbCount);
690     case Index of
691     0 : if ibserviceeditor.EditIBService(TIBCustomService(Component)) then Designer.Modified;
692     end;
693     end;
694     end;
695    
696     function TIBServiceEditor.GetVerb(Index: Integer): string;
697     begin
698     if Index < inherited GetVerbCount then
699     Result := inherited GetVerb(Index) else
700     begin
701     Dec(Index, inherited GetVerbCount);
702     case Index of
703     0: Result := SIBServiceEditor;
704     1 : Result := SInterbaseExpressVersion;
705     end;
706     end;
707     end;
708    
709     function TIBServiceEditor.GetVerbCount: Integer;
710     begin
711     Result := inherited GetVerbCount + 2;
712     end;
713    
714     { TIBFileNameProperty }
715     procedure TIBFileNameProperty.Edit;
716     begin
717     with TOpenDialog.Create(Application) do
718     try
719     InitialDir := ExtractFilePath(GetStrValue);
720     Filter := SDatabaseFilter; {do not localize}
721     if Execute then
722     SetStrValue(FileName);
723     finally
724     Free
725     end;
726     end;
727    
728     function TIBFileNameProperty.GetAttributes: TPropertyAttributes;
729     begin
730     Result := [paDialog];
731     end;
732    
733     { TIBNameProperty }
734    
735     function TIBNameProperty.GetAttributes: TPropertyAttributes;
736     begin
737     Result := [paValueList, paSortList];
738     end;
739    
740     { TIBStoredProcNameProperty }
741    
742     procedure TIBStoredProcNameProperty.GetValues(Proc: TGetStrProc);
743     var
744     StoredProc : TIBStoredProc;
745     i : integer;
746     begin
747     StoredProc := GetComponent(0) as TIBStoredProc;
748     if StoredProc.Database = nil then
749     Exit;
750    
751     with StoredProc do
752     try
753     for I := 0 to StoredProcedureNames.Count - 1 do
754     Proc (StoredProcedureNames[i]);
755     except on E: Exception do
756     MessageDlg(E.Message,mtError,[mbOK],0)
757     end;
758     end;
759    
760     { TIBTableNameProperty }
761    
762     procedure TIBTableNameProperty.GetValues(Proc: TGetStrProc);
763     var
764     Table : TIBTable;
765     i : integer;
766     begin
767     Table := GetComponent(0) as TIBTable;
768     if Table.Database = nil then
769     Exit;
770     with Table do
771     for I := 0 to TableNames.Count - 1 do
772     Proc (TableNames[i]);
773     end;
774    
775     { TDBStringProperty }
776    
777     function TDBStringProperty.ConnecttoDB: boolean;
778     var DataSet: TIBCustomDataSet;
779     begin
780     Result := false;
781     DataSet := (GetComponent(0) as TIBCustomDataSet);
782     if assigned(Dataset.Database) then
783     begin
784     try
785     DataSet.Database.Connected := true;
786     except on E: Exception do
787     ShowMessage(E.Message)
788     end;
789     Result := DataSet.Database.Connected
790     end;
791     end;
792    
793     function TDBStringProperty.GetAttributes: TPropertyAttributes;
794     begin
795     Result := [paValueList, paSortList, paMultiSelect];
796     end;
797    
798     procedure TDBStringProperty.GetValueList(List: TStrings);
799     begin
800     end;
801    
802     procedure TDBStringProperty.GetValues(Proc: TGetStrProc);
803     var
804     I: Integer;
805     Values: TStringList;
806     begin
807     if not ConnecttoDB then Exit;
808     Values := TStringList.Create;
809     try
810     GetValueList(Values);
811     for I := 0 to Values.Count - 1 do Proc(Values[I]);
812     finally
813     Values.Free;
814     end;
815     end;
816    
817     procedure TDBStringProperty.Edit;
818     begin
819     if ConnecttoDB then
820     inherited Edit;
821     end;
822    
823     { Utility Functions }
824    
825     function GetPropertyValue(Instance: TPersistent; const PropName: string): TPersistent;
826     var
827     PropInfo: PPropInfo;
828     begin
829     Result := nil;
830     PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, PropName);
831     if (PropInfo <> nil) and (PropInfo^.PropType^.Kind = tkClass) then
832     Result := TObject(GetOrdProp(Instance, PropInfo)) as TPersistent;
833     end;
834    
835     function GetIndexDefs(Component: TPersistent): TIndexDefs;
836     var
837     DataSet: TDataSet;
838     begin
839     DataSet := Component as TDataSet;
840     Result := GetPropertyValue(DataSet, 'IndexDefs') as TIndexDefs; {do not localize}
841     if Assigned(Result) then
842     begin
843     Result.Updated := False;
844     Result.Update;
845     end;
846     end;
847    
848     { TIBIndexFieldNamesProperty }
849    
850     procedure TIBIndexFieldNamesProperty.GetValueList(List: TStrings);
851     var
852     I: Integer;
853     IndexDefs: TIndexDefs;
854     begin
855     IndexDefs := GetIndexDefs(GetComponent(0));
856     for I := 0 to IndexDefs.Count - 1 do
857     with IndexDefs[I] do
858     if (Options * [ixExpression, ixDescending] = []) and (Fields <> '') then
859     List.Add(Fields);
860     end;
861    
862    
863     { TIBIndexNameProperty }
864    
865     procedure TIBIndexNameProperty.GetValueList(List: TStrings);
866     begin
867     GetIndexDefs(GetComponent(0)).GetItemNames(List);
868     end;
869    
870     { TSQLPropertyEditor }
871    
872     function TSQLPropertyEditor.GetAttributes: TPropertyAttributes;
873     begin
874     Result := inherited GetAttributes + [paDialog] - [paMultiSelect,paSubProperties];
875     end;
876    
877     { TIBQuerySQLProperty }
878    
879     procedure TIBQuerySQLProperty.Edit;
880     var
881     Query: TIBQuery;
882     begin
883     Query := GetComponent(0) as TIBQuery;
884     if IBSelectSQLEditor.EditSQL(Query,Query.SQL) then Modified;
885     end;
886    
887     { TIBDatasetSQLProperty }
888    
889     procedure TIBDatasetSQLProperty.Edit;
890     var
891     IBDataset: TIBDataset;
892     begin
893     IBDataset := GetComponent(0) as TIBDataset;
894     if IBSelectSQLEditor.EditSQL(IBDataSet,IBDataSet.SelectSQL) then Modified;
895     end;
896    
897     { TIBSQLProperty }
898    
899     procedure TIBSQLProperty.Edit;
900     var
901     IBSQL: TIBSQL;
902     begin
903     IBSQL := GetComponent(0) as TIBSQL;
904 tony 80 if IBSQLEditor.EditSQL(IBSQL) then Modified;
905 tony 33 end;
906    
907     { TIBUpdateSQLEditor }
908    
909     procedure TIBUpdateSQLEditor.ExecuteVerb(Index: Integer);
910     begin
911     if IBUpdateSQLEditor.EditIBUpdateSQL(TIBUpdateSQL(Component)) then Modified;
912     end;
913    
914     function TIBUpdateSQLEditor.GetVerb(Index: Integer): string;
915     begin
916     case Index of
917     0 : Result := SIBUpdateSQLEditor;
918 tony 45 1: Result := SInterbaseExpressVersion ;
919 tony 33 end;
920     end;
921    
922     function TIBUpdateSQLEditor.GetVerbCount: Integer;
923     begin
924     Result := 2;
925     end;
926    
927     { TIBDataSetEditor }
928    
929     procedure TIBDataSetEditor.ExecuteVerb(Index: Integer);
930     begin
931     if Index < inherited GetVerbCount then
932     inherited ExecuteVerb(Index) else
933     begin
934     Dec(Index, inherited GetVerbCount);
935     case Index of
936     0:
937     if IBDataSetEditor.EditIBDataSet(TIBDataSet(Component)) then
938     Designer.Modified;
939     1: (Component as TIBDataSet).ExecSQL;
940     end;
941     end;
942     end;
943    
944     function TIBDataSetEditor.GetVerb(Index: Integer): string;
945     begin
946     if Index < inherited GetVerbCount then
947     Result := inherited GetVerb(Index) else
948     begin
949     Dec(Index, inherited GetVerbCount);
950     case Index of
951     0: Result := SIBDataSetEditor;
952     1: Result := SExecute;
953 tony 45 2: Result := SInterbaseExpressVersion ;
954 tony 33 end;
955     end;
956     end;
957    
958     function TIBDataSetEditor.GetVerbCount: Integer;
959     begin
960     Result := inherited GetVerbCount + 3;
961     end;
962    
963     { TIBEventListProperty }
964    
965     function TIBEventListProperty.GetAttributes: TPropertyAttributes;
966     begin
967     Result := inherited GetAttributes + [paDialog] - [paMultiSelect,paSubProperties];
968     end;
969    
970     procedure TIBEventListProperty.Edit;
971     var
972     Events: TStrings;
973     IBEvents: TIBEvents;
974     begin
975     IBEvents := GetComponent(0) as TIBEvents;
976     Events := TStringList.Create;
977     try
978     Events.Assign( IBEvents.Events);
979     if EditAlerterEvents( Events) then
980     begin
981     IBEvents.Events.Assign(Events);
982     Modified
983     end;
984     finally
985     Events.Free;
986     end;
987     end;
988    
989     { TIBDatabaseEditor }
990     procedure TIBDatabaseEditor.ExecuteVerb(Index: Integer);
991     begin
992     if Index < inherited GetVerbCount then
993     inherited ExecuteVerb(Index) else
994     begin
995     Dec(Index, inherited GetVerbCount);
996     case Index of
997     0 : if EditIBDatabase(TIBDatabase(Component)) then Designer.Modified;
998     end;
999     end;
1000     end;
1001    
1002     function TIBDatabaseEditor.GetVerb(Index: Integer): string;
1003     begin
1004     if Index < inherited GetVerbCount then
1005     Result := inherited GetVerb(Index) else
1006     begin
1007     Dec(Index, inherited GetVerbCount);
1008     case Index of
1009     0: Result := SIBDatabaseEditor;
1010 tony 45 1 : Result := SInterbaseExpressVersion ;
1011 tony 33 end;
1012     end;
1013     end;
1014    
1015     function TIBDatabaseEditor.GetVerbCount: Integer;
1016     begin
1017     Result := inherited GetVerbCount + 2;
1018     end;
1019    
1020     { TIBTransactionEditor }
1021    
1022     procedure TIBTransactionEditor.ExecuteVerb(Index: Integer);
1023     begin
1024     case Index of
1025     0: if EditIBTransaction(TIBTransaction(Component)) then Designer.Modified;
1026     end;
1027     end;
1028    
1029     function TIBTransactionEditor.GetVerb(Index: Integer): string;
1030     begin
1031     case Index of
1032     0: Result := SIBTransactionEditor;
1033 tony 45 1: Result := SInterbaseExpressVersion ;
1034 tony 33 end;
1035     end;
1036    
1037     function TIBTransactionEditor.GetVerbCount: Integer;
1038     begin
1039     Result := 2;
1040     end;
1041    
1042     { TIBQueryEditor }
1043    
1044     procedure TIBQueryEditor.ExecuteVerb(Index: Integer);
1045     var
1046     Query: TIBQuery;
1047     begin
1048     if Index < inherited GetVerbCount then
1049     inherited ExecuteVerb(Index) else
1050     begin
1051     Query := Component as TIBQuery;
1052     Dec(Index, inherited GetVerbCount);
1053     case Index of
1054     0: Query.ExecSQL;
1055     1: if ibselectsqleditor.EditSQL(Query,Query.SQL) then Designer.Modified;
1056     end;
1057     end;
1058     end;
1059    
1060     function TIBQueryEditor.GetVerb(Index: Integer): string;
1061     begin
1062     if Index < inherited GetVerbCount then
1063     Result := inherited GetVerb(Index) else
1064     begin
1065     Dec(Index, inherited GetVerbCount);
1066     case Index of
1067     0: Result := SExecute;
1068     1: Result := SEditSQL;
1069 tony 45 2: Result := SInterbaseExpressVersion ;
1070 tony 33 end;
1071     end;
1072     end;
1073    
1074     function TIBQueryEditor.GetVerbCount: Integer;
1075     begin
1076     Result := inherited GetVerbCount + 3;
1077     end;
1078    
1079     { TIBStoredProcEditor }
1080    
1081     procedure TIBStoredProcEditor.ExecuteVerb(Index: Integer);
1082     begin
1083     if Index < inherited GetVerbCount then
1084     inherited ExecuteVerb(Index) else
1085     begin
1086     Dec(Index, inherited GetVerbCount);
1087     if Index = 0 then (Component as TIBStoredProc).ExecProc;
1088     end;
1089     end;
1090    
1091     function TIBStoredProcEditor.GetVerb(Index: Integer): string;
1092     begin
1093     if Index < inherited GetVerbCount then
1094     Result := inherited GetVerb(Index) else
1095     begin
1096     Dec(Index, inherited GetVerbCount);
1097     case Index of
1098     0: Result := SExecute;
1099 tony 45 1: Result := SInterbaseExpressVersion ;
1100 tony 33 end;
1101     end;
1102     end;
1103    
1104     function TIBStoredProcEditor.GetVerbCount: Integer;
1105     begin
1106     Result := inherited GetVerbCount + 2;
1107     end;
1108    
1109     { TIBTableFieldLinkProperty }
1110    
1111     procedure TIBTableFieldLinkProperty.Edit;
1112     begin
1113     FTable := DataSet as TIBTable;
1114     if assigned(FTable.Database) then
1115     FTable.Database.Connected := true;
1116     inherited Edit;
1117     end;
1118    
1119     function TIBTableFieldLinkProperty.GetIndexDefs: TIndexDefs;
1120     begin
1121     Result := FTable.IndexDefs
1122     end;
1123    
1124     function TIBTableFieldLinkProperty.GetIndexFieldNames: string;
1125     begin
1126     Result := FTable.IndexFieldNames;
1127     end;
1128    
1129     function TIBTableFieldLinkProperty.GetMasterFields: string;
1130     begin
1131     Result := FTable.MasterFields;
1132     end;
1133    
1134     procedure TIBTableFieldLinkProperty.SetIndexFieldNames(const Value: string);
1135     begin
1136     FTable.IndexFieldNames := Value;
1137     end;
1138    
1139     procedure TIBTableFieldLinkProperty.SetMasterFields(const Value: string);
1140     begin
1141     FTable.MasterFields := Value;
1142     end;
1143    
1144     { TIBUpdateSQLProperty }
1145    
1146     procedure TIBUpdateSQLProperty.Edit;
1147     var
1148     IBDataset: TIBDataset;
1149     begin
1150     IBDataset := GetComponent(0) as TIBDataset;
1151     if IBModifySQLEditor.EditSQL(IBDataSet,IBDataSet.ModifySQL) then Modified;
1152     end;
1153    
1154     { TIBUpdateSQLUpdateProperty }
1155    
1156     procedure TIBUpdateSQLUpdateProperty.Edit;
1157     begin
1158     GetObjects;
1159     if IBModifySQLEditor.EditSQL(FIBUpdateSQL.DataSet,FIBUpdateSQL.ModifySQL) then Modified;
1160     end;
1161    
1162     { TIBRefreshSQLProperty }
1163    
1164     procedure TIBRefreshSQLProperty.Edit;
1165     var
1166     IBDataset: TIBDataset;
1167     begin
1168     IBDataset := GetComponent(0) as TIBDataset;
1169     if IBRefreshSQLEditor.EditSQL(IBDataSet,IBDataSet.RefreshSQL) then Modified;
1170     end;
1171    
1172     { TIBUpdateSQLRefreshSQLProperty }
1173    
1174     procedure TIBUpdateSQLRefreshSQLProperty.Edit;
1175     begin
1176     GetObjects;
1177     if IBRefreshSQLEditor.EditSQL(FIBUpdateSQL.DataSet,FIBUpdateSQL.RefreshSQL) then Modified;
1178     end;
1179    
1180     { TIBDeleteSQLProperty }
1181    
1182     procedure TIBDeleteSQLProperty.Edit;
1183     var
1184     IBDataset: TIBDataSet;
1185     begin
1186     IBDataset := GetComponent(0) as TIBDataSet;
1187     if IBDeleteSQLEditor.EditSQL(IBDataSet,IBDataSet.DeleteSQL) then Modified;
1188     end;
1189    
1190     { TIBUpdateSQLDeleteProperty }
1191    
1192     function TIBUpdateSQLDeleteProperty.GetAttributes: TPropertyAttributes;
1193     begin
1194     Result:=inherited GetAttributes;
1195     end;
1196    
1197     procedure TIBUpdateSQLDeleteProperty.Edit;
1198     begin
1199     GetObjects;
1200     if IBDeleteSQLEditor.EditSQL(FIBUpdateSQL.DataSet,FIBUpdateSQL.DeleteSQL) then Modified;
1201     end;
1202    
1203     { TUpdateSQLPropertyEditor }
1204    
1205     function TUpdateSQLPropertyEditor.GetObjects: boolean;
1206     begin
1207     Result := false;
1208     FIBUpdateSQL := GetComponent(0) as TIBUpdateSQL;
1209     if not assigned(FIBUpdateSQL) or not assigned(FIBUpdateSQL.DataSet) then
1210     Exit;
1211     FDatabase := nil;
1212     if FIBUpdateSQL.DataSet is TIBQuery then
1213     begin
1214     FDatabase := (FIBUpdateSQL.DataSet as TIBQuery).Database;
1215     Result := true
1216     end;
1217     end;
1218    
1219     { TIBInsertSQLProperty }
1220    
1221     procedure TIBInsertSQLProperty.Edit;
1222     var
1223     IBDataset: TIBDataSet;
1224     begin
1225     IBDataset := GetComponent(0) as TIBDataSet;
1226     if IBInsertSQLEditor.EditSQL(IBDataSet,IBDataSet.InsertSQL) then Modified;
1227     end;
1228    
1229     { TIBUpdateSQLInsertSQLProperty }
1230    
1231     procedure TIBUpdateSQLInsertSQLProperty.Edit;
1232     begin
1233     GetObjects;
1234     if IBInsertSQLEditor.EditSQL(FIBUpdateSQL.Dataset,FIBUpdateSQL.InsertSQL) then Modified;
1235     end;
1236    
1237     { TIBGeneratorProperty }
1238    
1239     function TIBGeneratorProperty.GetAttributes: TPropertyAttributes;
1240     begin
1241     Result:= inherited GetAttributes + [paDialog] - [paMultiSelect,paValueList];
1242     end;
1243    
1244     procedure TIBGeneratorProperty.Edit;
1245     begin
1246     if IBGeneratorEditor.EditGenerator(GetPersistentReference as TIBGenerator) then Modified;
1247     end;
1248    
1249     { TIBSQLEditor }
1250    
1251     procedure TIBSQLEditor.ExecuteVerb(Index: Integer);
1252     begin
1253 tony 80 if IBSQLEditor.EditSQL(TIBSQL(Component)) then Modified;
1254 tony 33 end;
1255    
1256     function TIBSQLEditor.GetVerb(Index: Integer): string;
1257     begin
1258     case Index of
1259     0 : Result := SIBSQLEditor;
1260 tony 45 1: Result := SInterbaseExpressVersion ;
1261 tony 33 end;
1262     end;
1263    
1264     function TIBSQLEditor.GetVerbCount: Integer;
1265     begin
1266     Result:= 2
1267     end;
1268    
1269     { TIBSQLSQLPropertyEditor }
1270    
1271     procedure TIBSQLSQLPropertyEditor.Edit;
1272     var
1273     IBSQL: TIBSQL;
1274     begin
1275     IBSQL := GetComponent(0) as TIBSQL;
1276 tony 80 if IBSQLEditor.EditSQL(IBSQL) then Modified;
1277 tony 33 end;
1278    
1279     initialization
1280     {$I IBDBReg.lrs}
1281     end.