/SystemManager/CodeEngineUnit/uCnCeCommon.pas

https://github.com/qriver/Delphi2010 · Pascal · 950 lines · 711 code · 107 blank · 132 comment · 41 complexity · d3a580be4616cdb8923e0b7a0a23b96f MD5 · raw file

  1. {******************************************************************************}
  2. { CnPack For Delphi/C++Builder }
  3. { ???????????????? }
  4. { (C)Copyright 2001-2007 CnPack ??? }
  5. { ------------------------------------ }
  6. { }
  7. { ?????????????????? CnPack ??????? }
  8. { ??????????? }
  9. { }
  10. { ????????????????????????????? }
  11. { ?????????????????????? CnPack ????? }
  12. { }
  13. { ??????????????? CnPack ?????????? }
  14. { ????????????? }
  15. { }
  16. { ?????http://www.cnpack.org }
  17. { ?????master@cnpack.org }
  18. { }
  19. {******************************************************************************}
  20. unit uCnCeCommon;
  21. {* |<PRE>
  22. ================================================================================
  23. * ???????????
  24. * ?????Delphi ?????????
  25. * ?????SkyJacker
  26. * ? ???????????????????????
  27. * ?????WinXP sp2 + Delphi 6.0 up2
  28. * ??????
  29. * ? ? ????????????????????
  30. * ?????$Id: uCnCeCommon.pas,v 1.0 2007/03/06 14:36:27 SkyJacker Exp $
  31. * ?????2007.03.14
  32. * ?????????
  33. ================================================================================
  34. |</PRE>}
  35. interface
  36. uses
  37. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  38. Dialogs, StdCtrls, StrUtils;
  39. type
  40. TStringArray = array of string;
  41. const
  42. //------------------------------------------------------------------------------
  43. // ??????
  44. //------------------------------------------------------------------------------
  45. cnDBLinkUdl = 'data\DbLink.udl'; // ?????
  46. cnTemplatePath ='data\CETemplates\';
  47. cnTemplateDpr = cnTemplatePath + 'Project1.dpr';
  48. cnTemplatePas = cnTemplatePath + 'Unit1.pas';
  49. cnTemplateDfm = cnTemplatePath + 'Unit1.dfm';
  50. cnTempPath: string = 'data\temp\';
  51. cnCESetIni: string = 'data\ceset.ini';
  52. CRLF = #13#10;
  53. NL = '';
  54. //------------------------------------------------------------------------------
  55. // ??????
  56. // ?: ????????????, ??????????
  57. //------------------------------------------------------------------------------
  58. // ????
  59. cnPrgName = '<#PrgName>'; // ????
  60. cnUnitName = '<#UnitName>'; // ????
  61. cnFormClass = '<#TFormName>'; // ?????
  62. cnFormName = '<#FormName>'; // ?????
  63. cnFormCaption = '<#FormCaption>'; // ??????
  64. // ??????????
  65. cnAddUseGlobal = '<#AddUseGlobal>'; // ???? uses ???
  66. cnAddUseLocal = '<#AddUseLocal>'; // ???? uses ???
  67. cnAddControl = '<#AddControl>'; // ????
  68. cnAddControlDfm = '<#AddControlDfm>'; // ??????? dfm
  69. cnAddPrivateData = '<#AddPrivateData>'; // ????????
  70. cnAddPrivateFunc = '<#AddPrivateFunc>'; // ???????????
  71. cnAddPublicData = '<#AddPublicData>'; // ????????
  72. cnAddPublicFunc = '<#AddPublicFunc>'; // ???????????
  73. // ??????????????????
  74. cnAddGlobalFunc = '<#AddGlobalFunc>'; // ????????
  75. cnAddFormFunc = '<#AddFormFunc>'; // ???????
  76. cnAddFormFuncHead = '<#AddFormFuncHead>'; // ??????????
  77. //????
  78. cnTableName = '<#TableName>'; // ?????????
  79. cnPkFieldName = '<#PkFieldName>'; // ?????????
  80. // ???????
  81. SDELI = '?'; // ????????(????????? ? ???????)
  82. SP1 = ' '; // ?? 1 ~ 8 ???
  83. SP2 = SP1 + SP1;
  84. SP4 = SP2 + SP2;
  85. SP6 = SP4 + SP2;
  86. SP8 = SP6 + SP2;
  87. // ???? Sql ?????
  88. cnFmtStr = ' ''''%s''''';
  89. cnFmtInt = ' %d';
  90. cnFmtFlt = ' %f';
  91. // ???????
  92. ExtDpr = '.dpr';
  93. ExtPas = '.pas';
  94. ExtDfm = '.dfm';
  95. UnSaveFlag = ' *';
  96. var
  97. //------------------------------------------------------------------------------
  98. // ??????
  99. //------------------------------------------------------------------------------
  100. BtnText: array[0..2] of string= ('??','??','??');
  101. AppTitle: string = 'CnPack Delphi ???? V1.0';
  102. AppPath: string;
  103. TemplatePath: string;
  104. FileSavePath: string;
  105. bMySql: Boolean;
  106. lstTableName: TStrings;
  107. SqlInteger, SqlFloat, SqlString: TStringArray;
  108. //------------------------------------------------------------------------------
  109. // ??????
  110. //------------------------------------------------------------------------------
  111. PrgName: string = 'Project1';
  112. MyUnitName: string = 'Unit1';
  113. FormClass: string = 'TForm1';
  114. FormName: string = 'Form1';
  115. FormCaption: string = 'Form1';
  116. TableName: String ='MyTableName';
  117. PK_FieldName:String ='PK_FieldName';
  118. // ??????????
  119. AddUseGlobal: string; // ???? uses ???
  120. AddUseLocal: string; // ???? uses ???
  121. AddControl: TStrings; // ????
  122. AddCdsControl: TStrings; // ??TClientDataset??
  123. AddCdsFieldControl: TStrings; // ??TClientDataset??
  124. AddControlDfm: TStrings; // ??????? dfm
  125. AddPrivateData: TStrings; // ????????
  126. AddPrivateFunc: TStrings; // ???????????
  127. AddPublicData: TStrings; // ????????
  128. AddPublicFunc: TStrings; // ???????????
  129. // ??????????????????
  130. AddGlobalFunc: TStrings; // ????????
  131. AddFormFunc: TStrings; // ???????
  132. AddFormFuncHead: TStrings; // ??????????
  133. //------------------------------------------------------------------------------
  134. // ????
  135. //------------------------------------------------------------------------------
  136. procedure EnterPress(AFrm: TForm; var Key: Char);
  137. {* ???? Tab}
  138. function StrToDfmFmt(const AStr: string): string;
  139. {* ?????????? Delphi Dfm ???}
  140. function iGetDelimiterIndex(const AStr: string; n: integer): integer;
  141. {* ??????? n ???????}
  142. function GetDelimiterStr(const AStr: string; m: integer; n: integer): string;
  143. {* ??????? m ?????? n ?????????(m<n)}
  144. function GetDelimiterCount(const AStr, ADeli:string):integer;
  145. {* ???????}
  146. function IsExistStr(const AStr: string;var AStrList: TStringArray): Boolean;
  147. {* ???????????????}
  148. //------------------------------------------------------------------------------
  149. // ????????
  150. //------------------------------------------------------------------------------
  151. procedure CEGenTLabel(ANo, ALeft, ATop: Integer; const ACaption: string);
  152. {* ???? TLabel}
  153. procedure CEGenTEdit(ALeft, ATop: Integer; const AEdtName: string);
  154. {* ???? TEdit}
  155. procedure CEGenTClientDataSet (const ATableName,AColumnName,AChineseName,AType,ASize: string);
  156. {* ???? TClientDataSet}
  157. procedure CEGenTButton(ALeft, ATop: Integer; const AName, ACaption: string);
  158. {* ???? TButton}
  159. procedure CEGenTADOConnection(ALeft, ATop: Integer; const AName: string);
  160. {* ???? TADOConnection}
  161. procedure CEGenTADOQuery(ALeft, ATop: Integer; const AName, AAdoCon: string);
  162. {* ???? TADOQuery}
  163. procedure CEGenShowTableRec(const AFormName, ATableName, AConQry: string; var ColumnsTypes: string);
  164. {* ???????????, ???????}
  165. procedure CEGenDelTableRec(const AFormName, ATableName, AColumnName, AConQry, AAdoCon: string);
  166. {* ???????????}
  167. procedure CEGenInsertTableRec(const AFormName, ATableName, AConQry, AAdoCon: string; var ColumnsTypes: string);
  168. {* ???????????}
  169. procedure CEGenUpdateTableRec(const AFormName, ATableName, AColumnName, AConQry, AAdoCon: string; var ColumnsTypes: string);
  170. {* ???????????}
  171. implementation
  172. //------------------------------------------------------------------------------
  173. // ????
  174. //------------------------------------------------------------------------------
  175. // ???? Tab
  176. procedure EnterPress(AFrm: TForm; var Key: Char);
  177. begin
  178. if Key = #13 then
  179. begin
  180. Key := #0;
  181. AFrm.Perform(WM_NEXTDLGCTL, 0, 0);
  182. end;
  183. end;
  184. // ?????????? Delphi ? Dfm ??
  185. function StrToDfmFmt(const AStr: string): string;
  186. const
  187. QM = '''';
  188. var
  189. W: WideString;
  190. I: Integer;
  191. bEn: Boolean;
  192. Len: Integer;
  193. begin
  194. bEn := False;
  195. W := AStr;
  196. Len := Length(W);
  197. for I:=1 to Len do
  198. begin
  199. if Ord(W[i])>127 then // ?????? ascii????????
  200. begin
  201. if bEn then
  202. Result := Result + QM;
  203. Result := Result + '#' + IntToStr(Ord(W[I]));
  204. bEn := false;
  205. end
  206. else
  207. begin
  208. if not bEn then
  209. Result := Result + QM + W[i]
  210. else
  211. Result := Result + W[i];
  212. if I = Len then
  213. Result := Result + QM;
  214. bEn := true;
  215. end;
  216. end;
  217. end;
  218. // ??????? n ???????
  219. function iGetDelimiterIndex(const AStr: string; n: integer): integer;
  220. var
  221. Count, I: integer;
  222. begin
  223. Result := 0;
  224. Count := 0;
  225. for I := 1 to length(AStr) do
  226. begin
  227. if AStr[I] = SDELI then
  228. begin
  229. Count := Count + 1;
  230. if (n = Count) then
  231. begin
  232. Result := i;
  233. end;
  234. end;
  235. end;
  236. end;
  237. // ??????? m ?????? n ?????????(m<n)
  238. function GetDelimiterStr(const AStr: string; m: integer; n: integer): string;
  239. var
  240. iFirstDeli, iSecondDeli: integer;
  241. begin
  242. if m >= n then
  243. Exit;
  244. iFirstDeli := iGetDelimiterIndex(AStr, m);
  245. iSecondDeli := iGetDelimiterIndex(AStr, n);
  246. result := copy(AStr, iFirstDeli + 1, iSecondDeli - iFirstDeli - 1);
  247. end;
  248. // ???????
  249. function GetDelimiterCount(const AStr, ADeli:string):integer;
  250. var
  251. I: integer;
  252. begin
  253. Result := 0;
  254. for I := Length(AStr) downto 1 do
  255. begin
  256. if ADeli = AStr[I] then
  257. begin
  258. Inc(Result);
  259. end;
  260. end;
  261. end;
  262. // ?? string case
  263. function StringToCaseSelect(Selector : string; CaseList: array of string): Integer;
  264. var
  265. cnt: integer;
  266. begin
  267. Result := -1;
  268. for cnt := 0 to Length(CaseList)-1 do
  269. begin
  270. if CompareText( Selector, CaseList[cnt]) = 0 then
  271. begin
  272. Result := cnt;
  273. Break;
  274. end;
  275. end;
  276. end;
  277. // ???????????????
  278. function IsExistStr(const AStr: string; var AStrList: TStringArray): Boolean;
  279. var
  280. cnt: Integer;
  281. begin
  282. Result := false;
  283. for cnt := Low(AStrList) to High(AStrList) do
  284. begin
  285. if CompareText(AStr, AStrList[cnt]) = 0 then
  286. begin
  287. Result := true;
  288. Break;
  289. end;
  290. end;
  291. end;
  292. // ????????????? Delphi ???
  293. function IsInteger(const AStr: string): Boolean;
  294. begin
  295. Result := IsExistStr(AStr, SqlInteger);
  296. end;
  297. // ????????????? Delphi ????
  298. function IsFloat(const AStr: string): Boolean;
  299. begin
  300. Result := IsExistStr(AStr, SqlFloat);
  301. end;
  302. // ????????????? Delphi ????
  303. function IsString(const AStr: string): Boolean;
  304. begin
  305. Result := IsExistStr(AStr, SqlString);
  306. end;
  307. // ???? case string
  308. function ParseSqlDataType(const ADataType: string): Integer;
  309. begin
  310. Result := 0;
  311. if IsInteger(ADataType) then
  312. Result := 1
  313. else if IsFloat(ADataType) then
  314. Result := 2
  315. else if IsString(ADataType) then
  316. Result := 3;
  317. end;
  318. //------------------------------------------------------------------------------
  319. // ????????
  320. //------------------------------------------------------------------------------
  321. // ???? TLabel
  322. procedure CEGenTLabel(ANo, ALeft, ATop: Integer; const ACaption: string);
  323. const
  324. CeTLabel = SP4 + 'lbl%d: TStaticText;';
  325. CeTLabelDfm =
  326. ' object lbl%d: TStaticText' + SDELI
  327. + ' Left = %d ' + SDELI
  328. + ' Top = %d ' + SDELI
  329. + ' Width = 120 ' + SDELI
  330. + ' AutoSize = False ' + SDELI
  331. + ' BorderStyle = sbsSingle ' + SDELI
  332. + ' Color = clBtnFace ' + SDELI
  333. + ' Alignment = taCenter ' + SDELI
  334. + ' Height = 25 ' + SDELI
  335. + ' Caption = %s ' + SDELI
  336. + ' end ' + SDELI;
  337. var
  338. sCeTLabel: string;
  339. sCeTLabelDfm: string;
  340. Count: Integer;
  341. I: Integer;
  342. begin
  343. sCeTLabel := Format(CeTLabel, [ANo]);
  344. AddControl.Add(sCeTLabel);
  345. sCeTLabelDfm := Format(CeTLabelDfm, [ANo, ALeft, ATop, StrToDfmFmt(ACaption)]);
  346. Count := GetDelimiterCount(sCeTLabelDfm, SDELI);
  347. for I := 1 to Count do
  348. begin
  349. AddControlDfm.Add(GetDelimiterStr(sCeTLabelDfm, I-1, I));
  350. end;
  351. end;
  352. // ???? TEdit
  353. procedure CEGenTEdit(ALeft, ATop: Integer; const AEdtName: string);
  354. const
  355. CeTEdit = SP4 + 'edt%s: TMaskEdit;';
  356. CeTEditDfm =
  357. ' object edt%s: TMaskEdit' + SDELI
  358. + ' Left = %d ' + SDELI
  359. + ' Top = %d ' + SDELI
  360. + ' AutoSize = False ' + SDELI
  361. + ' Width = 121 ' + SDELI
  362. + ' Height = 25 ' + SDELI
  363. + ' Ctl3D = false ' + SDELI
  364. + ' BorderStyle = bsSingle ' + SDELI
  365. + ' Text = ''edt%s'' ' + SDELI
  366. + ' end ' + SDELI;
  367. var
  368. sCeTEdit: string;
  369. sCeTEditDfm: string;
  370. Count: Integer;
  371. I: Integer;
  372. begin
  373. sCeTEdit := Format(CeTEdit, [AEdtName]);
  374. AddControl.Add(sCeTEdit);
  375. sCeTEditDfm := Format(CeTEditDfm, [AEdtName, ALeft, ATop, AEdtName]);
  376. Count := GetDelimiterCount(sCeTEditDfm, SDELI);
  377. for I := 1 to Count do
  378. begin
  379. AddControlDfm.Add(GetDelimiterStr(sCeTEditDfm, I-1, I));
  380. end;
  381. end;
  382. // ???? TClientdataset
  383. procedure CEGenTClientDataSet( const ATableName,AColumnName,AChineseName,AType,ASize: string);
  384. const
  385. CeTEdit = SP4 + 'object cds_table: TClientDataSet ' + SDELI
  386. +' Aggregates = <> ' + SDELI
  387. +' Params = <> ' + SDELI
  388. +' Left = 144 ' + SDELI
  389. +' Top = 256 ' + SDELI ;
  390. CeTEditDfm =
  391. ' object %s%s: %s' + SDELI
  392. + ' DisplayLabel = %s ' + SDELI
  393. + ' DisplayWidth = 20 ' + SDELI
  394. + ' FieldName = ''%s'' ' + SDELI
  395. + ' Size = %s ' + SDELI
  396. + ' end ' + SDELI;
  397. var
  398. sCeTEdit: string;
  399. sCeTEditDfm: string;
  400. sType:String;
  401. Count: Integer;
  402. I: Integer;
  403. begin
  404. //TWideStringField???
  405. if AddCdsControl.Count=0 then
  406. begin
  407. // sCeTEdit:=format(CeTedit,[aTableName] );
  408. Count := GetDelimiterCount(sCeTEdit, SDELI);
  409. for I := 1 to Count do
  410. begin
  411. AddCdsControl.Add(GetDelimiterStr(sCeTEdit, I-1, I));
  412. end;
  413. end;
  414. // if upperCase(aType)='C' then sType:='TWideStringField';
  415. sType:='TWideStringField';
  416. sCeTEditDfm:=format(CeTEditDfm,[aTableName,aColumnName,sType,StrToDfmFmt(AChineseName),AColumnName,aSize]);
  417. Count := GetDelimiterCount(sCeTEditDfm, SDELI);
  418. for I := 1 to Count do
  419. begin
  420. AddCdsControl.Add(GetDelimiterStr(sCeTEditDfm, I-1, I));
  421. end;
  422. AddCdsFieldControl.Add(aTableName+aColumnName+':TWideStringField; ' );
  423. end;
  424. // ???? TButton
  425. procedure CEGenTButton(ALeft, ATop: Integer; const AName, ACaption: string);
  426. const
  427. CeTx = SP4 + 'btn%s: TButton;';
  428. CeTxDfm =
  429. ' object btn%s: TButton' + SDELI
  430. + ' Left = %d ' + SDELI
  431. + ' Top = %d ' + SDELI
  432. + ' Width = 75 ' + SDELI
  433. + ' Height = 25 ' + SDELI
  434. + ' Caption = %s ' + SDELI
  435. + ' end ' + SDELI;
  436. var
  437. sCeTx: string;
  438. sCeTxDfm: string;
  439. Count: Integer;
  440. I: Integer;
  441. begin
  442. sCeTx := Format(CeTx, [AName]);
  443. AddControl.Add(sCeTx);
  444. sCeTxDfm := Format(CeTxDfm, [AName, ALeft, ATop, StrToDfmFmt(ACaption)]);
  445. Count := GetDelimiterCount(sCeTxDfm, SDELI);
  446. for I := 1 to Count do
  447. begin
  448. AddControlDfm.Add(GetDelimiterStr(sCeTxDfm, I-1, I));
  449. end;
  450. end;
  451. // ???? TADOConnection
  452. procedure CEGenTADOConnection(ALeft, ATop: Integer; const AName: string);
  453. const
  454. CeTx = SP4 + 'con%s: TADOConnection;';
  455. CeTxDfm =
  456. ' object con%s: TADOConnection' + SDELI
  457. + ' Left = %d ' + SDELI
  458. + ' Top = %d ' + SDELI
  459. + ' end ' + SDELI;
  460. var
  461. sCeTx: string;
  462. sCeTxDfm: string;
  463. Count: Integer;
  464. I: Integer;
  465. begin
  466. sCeTx := Format(CeTx, [AName]);
  467. AddControl.Add(sCeTx);
  468. sCeTxDfm := Format(CeTxDfm, [AName, ALeft, ATop]);
  469. Count := GetDelimiterCount(sCeTxDfm, SDELI);
  470. for I := 1 to Count do
  471. begin
  472. AddControlDfm.Add(GetDelimiterStr(sCeTxDfm, I-1, I));
  473. end;
  474. end;
  475. // ???? TADOQuery
  476. procedure CEGenTADOQuery(ALeft, ATop: Integer; const AName, AAdoCon: string);
  477. const
  478. CeTx = SP4 + 'qry%s: TADOQuery;';
  479. CeTxDfm =
  480. ' object qry%s: TADOQuery' + SDELI
  481. + ' Connection = %s' + SDELI
  482. + ' Parameters = <> ' + SDELI
  483. + ' Left = %d ' + SDELI
  484. + ' Top = %d ' + SDELI
  485. + ' end ' + SDELI;
  486. var
  487. sCeTx: string;
  488. sCeTxDfm: string;
  489. Count: Integer;
  490. I: Integer;
  491. begin
  492. sCeTx := Format(CeTx, [AName]);
  493. AddControl.Add(sCeTx);
  494. sCeTxDfm := Format(CeTxDfm, [AName,AAdoCon, ALeft, ATop]);
  495. AddControlDfm.Add('');
  496. Count := GetDelimiterCount(sCeTxDfm, SDELI);
  497. for I := 1 to Count do
  498. begin
  499. AddControlDfm.Add(GetDelimiterStr(sCeTxDfm, I-1, I));
  500. end;
  501. end;
  502. // ?????????, ???????
  503. // ??????: ??????????
  504. procedure CEGenShowTableRec(const AFormName, ATableName, AConQry: string; var ColumnsTypes: string);
  505. const
  506. CeShowTableHead = 'procedure %sShow%s(const SID: string);';
  507. CeShowTable =
  508. 'const' + SDELI +
  509. ' cnSql_Show%s = ''select top 1 * from %s where %s = %s; ''; ' + SDELI +// ??????????
  510. 'var' + SDELI +
  511. ' ExeSql: string; ' + SDELI +
  512. 'begin' + SDELI +
  513. ' ExeSql := Format(cnSql_Show%s, [SID]);' + SDELI +
  514. ' with %s do' + SDELI +
  515. ' begin' + SDELI +
  516. ' close;' + SDELI +
  517. ' sql.clear;' + SDELI +
  518. ' sql.add(ExeSql);' + SDELI +
  519. ' Open;' + SDELI +
  520. ' if RecordCount=1 then' + SDELI +
  521. ' begin' + SDELI +
  522. '%s' + //SDELI +
  523. ' end;' + SDELI +
  524. ' end;' + SDELI +
  525. 'end;' + SDELI ;
  526. // edt%s.Text := FieldByName(''%s'').AsString;
  527. CeEdit = 'edt%s';
  528. CeEditField = SP6 + '%s.Text := FieldByName(''%s'').AsString; // %s' + SDELI;
  529. var
  530. sCeShowTableHeadPriv: string;
  531. sCeShowTableHeadForm: string;
  532. sCeShowTable: string;
  533. sColumnName: string;
  534. sColumnChineseName:String;
  535. sTableName:String;
  536. sColumnSIze:String;
  537. sTypeName: string;
  538. sCeEdit: string;
  539. sCeEditField: string;
  540. Count: Integer;
  541. I: Integer;
  542. J: Integer;
  543. begin
  544. // ???
  545. // sCeShowTableHeadPriv := SP4 + Format(CeShowTableHead, ['', ATableName]);
  546. // AddPrivateFunc.Add(sCeShowTableHeadPriv);
  547. // sCeShowTableHeadForm := Format(CeShowTableHead, ['T' + AFormName + '.', ATableName]);
  548. // AddFormFunc.Add(sCeShowTableHeadForm);
  549. // ???
  550. Count := GetDelimiterCount(ColumnsTypes, SDELI);
  551. I := 0;
  552. J := 0;
  553. while I < Count do
  554. begin
  555. Inc(J);
  556. sColumnName := GetDelimiterStr(ColumnsTypes, I, I + 1);
  557. Inc(I);
  558. sTypeName := GetDelimiterStr(ColumnsTypes, I, I + 1);
  559. Inc(I); //quanj
  560. sColumnChineseName := GetDelimiterStr(ColumnsTypes, I, I + 1); //quanj
  561. if sColumnChineseName='' then sColumnChineseName:= sColumnName;
  562. Inc(I);
  563. sTableName := GetDelimiterStr(ColumnsTypes, I, I + 1); //quanj
  564. Inc(I);
  565. sColumnSIze := GetDelimiterStr(ColumnsTypes, I, I + 1); //quanj
  566. Inc(I);
  567. sCeEdit := Format(CeEdit, [sColumnName]);
  568. sCeEditField := sCeEditField + Format(CeEditField, [sCeEdit, sColumnName, sTypeName]);
  569. CEGenTLabel(J, 80, J * 24, sColumnChineseName); // ?? TLabel/TEdit
  570. CEGenTEdit(180, J * 24, sColumnName);
  571. end;
  572. // sCeShowTable := Format(CeShowTable, [ATableName,ATableName, sColumnName, '''''%s''''',
  573. // ATableName, AConQry, sCeEditField]);
  574. // Count := GetDelimiterCount(sCeShowTable, SDELI);
  575. // for I := 1 to Count do
  576. // begin
  577. // AddFormFunc.Add(GetDelimiterStr(sCeShowTable, I-1, I));
  578. // end;
  579. // if Count > 0 then
  580. // AddFormFunc.Add('');
  581. end;
  582. // ???????????
  583. procedure CEGenDelTableRec(const AFormName, ATableName, AColumnName, AConQry, AAdoCon: string);
  584. const
  585. CeProcHead = 'function %sDel%s(const SID: string): Boolean;';
  586. CeProcBody =
  587. 'const' + SDELI +
  588. ' cnSql_Del%s = ''delete from %s where %s = %s; ''; ' + SDELI +// ??????????
  589. 'var' + SDELI +
  590. ' ExeSql: string; ' + SDELI +
  591. 'begin' + SDELI +
  592. ' Result := true; ' + SDELI +
  593. ' ExeSql := Format(cnSql_Del%s, [SID]);' + SDELI +
  594. ' try' + SDELI +
  595. ' %s.BeginTrans; ' + SDELI +
  596. ' with %s do' + SDELI +
  597. ' begin' + SDELI +
  598. ' close;' + SDELI +
  599. ' sql.clear;' + SDELI +
  600. ' sql.add(ExeSql);' + SDELI +
  601. ' ExecSql;' + SDELI +
  602. ' end;' + SDELI +
  603. ' %s.CommitTrans; ' + SDELI +
  604. ' except ' + SDELI +
  605. ' %s.RollbackTrans; ' + SDELI +
  606. ' Result := false; ' + SDELI +
  607. ' end; ' + SDELI +
  608. 'end;' + SDELI ;
  609. var
  610. sCeProcHeadPriv: string;
  611. sCeProcHeadForm: string;
  612. sCeProcBody: string;
  613. Count: Integer;
  614. I: Integer;
  615. begin
  616. // ???
  617. sCeProcHeadPriv := SP4 + Format(CeProcHead, ['', ATableName]);
  618. AddPrivateFunc.Add(sCeProcHeadPriv);
  619. sCeProcHeadForm := Format(CeProcHead, ['T' + AFormName + '.', ATableName]);
  620. AddFormFunc.Add(sCeProcHeadForm);
  621. // ???
  622. sCeProcBody := Format(CeProcBody, [ATableName,ATableName, AColumnName, '''''%s''''',
  623. ATableName, AAdoCon, AConQry, AAdoCon, AAdoCon]);
  624. Count := GetDelimiterCount(sCeProcBody, SDELI);
  625. for I := 1 to Count do
  626. begin
  627. AddFormFunc.Add(GetDelimiterStr(sCeProcBody, I-1, I));
  628. end;
  629. if Count > 0 then
  630. AddFormFunc.Add('');
  631. end;
  632. // ???????????
  633. procedure CEGenInsertTableRec(const AFormName, ATableName, AConQry, AAdoCon: string; var ColumnsTypes: string);
  634. const
  635. CeProcHead = 'function %sInsert%s(%s): Boolean;';
  636. CeProcBody =
  637. 'const' + SDELI +
  638. ' cnSql_Insert%s = ''insert into %s(%s) values(%s); ''; ' + SDELI +// ??????????
  639. 'var' + SDELI +
  640. ' ExeSql: string; ' + SDELI +
  641. 'begin' + SDELI +
  642. ' Result := true; ' + SDELI +
  643. ' ExeSql := Format(cnSql_Insert%s, [%s]);' + SDELI +
  644. ' try' + SDELI +
  645. ' %s.BeginTrans; ' + SDELI +
  646. ' with %s do' + SDELI +
  647. ' begin' + SDELI +
  648. ' close;' + SDELI +
  649. ' sql.clear;' + SDELI +
  650. ' sql.add(ExeSql);' + SDELI +
  651. ' ExecSql;' + SDELI +
  652. ' end;' + SDELI +
  653. ' %s.CommitTrans; ' + SDELI +
  654. ' except ' + SDELI +
  655. ' %s.RollbackTrans; ' + SDELI +
  656. ' Result := false; ' + SDELI +
  657. ' end; ' + SDELI +
  658. 'end;' + SDELI ;
  659. var
  660. sCeProcHeadPriv: string;
  661. sCeProcHeadForm: string;
  662. sCeProcBody: string;
  663. sColumnName: string;
  664. sTypeName: string;
  665. sFormParams: string; // ????
  666. sColumns: string; // ?????
  667. sColumnsValue: string; // ??
  668. Count: Integer;
  669. I: Integer;
  670. begin
  671. // ???
  672. Count := GetDelimiterCount(ColumnsTypes, SDELI);
  673. I := 0;
  674. while I < Count do
  675. begin
  676. sColumnName := GetDelimiterStr(ColumnsTypes, I, I + 1);
  677. Inc(I);
  678. sTypeName := GetDelimiterStr(ColumnsTypes, I, I + 1);
  679. Inc(I);
  680. sColumns := sColumns + sColumnName + ', ';
  681. case ParseSqlDataType(sTypeName) of
  682. 1:
  683. begin
  684. sFormParams := sFormParams + sColumnName + ': Integer; ';
  685. sColumnsValue := sColumnsValue + cnFmtInt + ', ';
  686. end;
  687. 2:
  688. begin
  689. sFormParams := sFormParams + sColumnName + ': Single; ';
  690. sColumnsValue := sColumnsValue + cnFmtFlt + ', ';
  691. end;
  692. 3:
  693. begin
  694. sFormParams := sFormParams + sColumnName + ': string; ';
  695. sColumnsValue := sColumnsValue + cnFmtStr + ', ';
  696. end;
  697. else
  698. begin
  699. sFormParams := sFormParams + sColumnName + ': string; ';
  700. sColumnsValue := sColumnsValue + cnFmtStr + ', ';
  701. end;
  702. end;
  703. if I = Count then
  704. begin
  705. sColumns := LeftStr(sColumns, Length(sColumns) - 2);
  706. sColumnsValue := LeftStr(sColumnsValue, Length(sColumnsValue) - 2);
  707. sFormParams := LeftStr(sFormParams, Length(sFormParams) - 2);
  708. sFormParams := 'const ' + sFormParams;
  709. end;
  710. end;
  711. // ???
  712. sCeProcHeadPriv := SP4 + Format(CeProcHead, ['', ATableName, sFormParams]);
  713. AddPrivateFunc.Add(sCeProcHeadPriv);
  714. sCeProcHeadForm := Format(CeProcHead, ['T' + AFormName + '.', ATableName, sFormParams]);
  715. AddFormFunc.Add(sCeProcHeadForm);
  716. // ???
  717. sCeProcBody := Format(CeProcBody, [ATableName, ATableName, sColumns, sColumnsValue,
  718. ATableName, sColumns, AAdoCon, AConQry, AAdoCon, AAdoCon]);
  719. Count := GetDelimiterCount(sCeProcBody, SDELI);
  720. for I := 1 to Count do
  721. begin
  722. AddFormFunc.Add(GetDelimiterStr(sCeProcBody, I-1, I));
  723. end;
  724. if Count > 0 then
  725. AddFormFunc.Add('');
  726. end;
  727. // ???????????
  728. procedure CEGenUpdateTableRec(const AFormName, ATableName,AColumnName, AConQry, AAdoCon: string; var ColumnsTypes: string);
  729. const
  730. CeProcHead = 'function %sUpdate%s(const SID: string; %s): Boolean;';
  731. CeProcBody =
  732. 'const' + SDELI +
  733. ' cnSql_Update%s = ''update %s set %s where %s = %s ; ''; ' + SDELI +// ??????????
  734. 'var' + SDELI +
  735. ' ExeSql: string; ' + SDELI +
  736. 'begin' + SDELI +
  737. ' Result := true; ' + SDELI +
  738. ' ExeSql := Format(cnSql_Update%s, [%s]);' + SDELI +
  739. ' try' + SDELI +
  740. ' %s.BeginTrans; ' + SDELI +
  741. ' with %s do' + SDELI +
  742. ' begin' + SDELI +
  743. ' close;' + SDELI +
  744. ' sql.clear;' + SDELI +
  745. ' sql.add(ExeSql);' + SDELI +
  746. ' ExecSql;' + SDELI +
  747. ' end;' + SDELI +
  748. ' %s.CommitTrans; ' + SDELI +
  749. ' except ' + SDELI +
  750. ' %s.RollbackTrans; ' + SDELI +
  751. ' Result := false; ' + SDELI +
  752. ' end; ' + SDELI +
  753. 'end;' + SDELI ;
  754. var
  755. sCeProcHeadPriv: string;
  756. sCeProcHeadForm: string;
  757. sCeProcBody: string;
  758. sColumnName: string;
  759. sTypeName: string;
  760. sFormParams: string; // ????
  761. sColumns: string; // ?????
  762. sColumnsValue: string; // ??
  763. Count: Integer;
  764. I: Integer;
  765. begin
  766. // ???
  767. Count := GetDelimiterCount(ColumnsTypes, SDELI);
  768. I := 0;
  769. while I < Count do
  770. begin
  771. sColumnName := GetDelimiterStr(ColumnsTypes, I, I + 1);
  772. Inc(I);
  773. sTypeName := GetDelimiterStr(ColumnsTypes, I, I + 1);
  774. Inc(I);
  775. sColumns := sColumns + sColumnName + ', ';
  776. case ParseSqlDataType(sTypeName) of
  777. 1:
  778. begin
  779. sFormParams := sFormParams + sColumnName + ': Integer; ';
  780. sColumnsValue := sColumnsValue + sColumnName + '=' + cnFmtInt + ', ';
  781. end;
  782. 2:
  783. begin
  784. sFormParams := sFormParams + sColumnName + ': Single; ';
  785. sColumnsValue := sColumnsValue + sColumnName + '=' + cnFmtFlt + ', ';
  786. end;
  787. 3:
  788. begin
  789. sFormParams := sFormParams + sColumnName + ': string; ';
  790. sColumnsValue := sColumnsValue + sColumnName + '=' + cnFmtStr + ', ';
  791. end;
  792. else
  793. begin
  794. sFormParams := sFormParams + sColumnName + ': string; ';
  795. sColumnsValue := sColumnsValue + sColumnName + '=' + cnFmtStr + ', ';
  796. end;
  797. end;
  798. if I = Count then
  799. begin
  800. sColumns := sColumns + 'SID, ';
  801. sColumns := LeftStr(sColumns, Length(sColumns) - 2);
  802. sColumnsValue := LeftStr(sColumnsValue, Length(sColumnsValue) - 2);
  803. sFormParams := LeftStr(sFormParams, Length(sFormParams) - 2);
  804. sFormParams := 'const ' + sFormParams;
  805. end;
  806. end;
  807. // ???
  808. sCeProcHeadPriv := SP4 + Format(CeProcHead, ['', ATableName, sFormParams]);
  809. AddPrivateFunc.Add(sCeProcHeadPriv);
  810. sCeProcHeadForm := Format(CeProcHead, ['T' + AFormName + '.', ATableName, sFormParams]);
  811. AddFormFunc.Add(sCeProcHeadForm);
  812. // ???
  813. sCeProcBody := Format(CeProcBody, [ATableName, ATableName, sColumnsValue, AColumnName, cnFmtStr,
  814. ATableName, sColumns, AAdoCon, AConQry, AAdoCon, AAdoCon]);
  815. Count := GetDelimiterCount(sCeProcBody, SDELI);
  816. for I := 1 to Count do
  817. begin
  818. AddFormFunc.Add(GetDelimiterStr(sCeProcBody, I-1, I));
  819. end;
  820. if Count > 0 then
  821. AddFormFunc.Add('');
  822. end;
  823. initialization
  824. SetLength(SqlInteger, 5);
  825. SetLength(SqlFloat, 2);
  826. SetLength(SqlString, 8);
  827. SqlInteger[0] := 'tinyint';
  828. SqlInteger[1] := 'smallint';
  829. SqlInteger[2] := 'int';
  830. SqlInteger[3] := 'bigint';
  831. SqlInteger[4] := 'decimal';
  832. SqlFloat[0] := 'float';
  833. SqlFloat[1] := 'real';
  834. SqlString[0] := 'char';
  835. SqlString[1] := 'nchar';
  836. SqlString[2] := 'varchar';
  837. SqlString[3] := 'nvarchar';
  838. SqlString[4] := 'text';
  839. SqlString[5] := 'smalldatetime';
  840. SqlString[6] := 'datetime';
  841. SqlString[7] := 'timestamp';
  842. end.