unit D7PdxMainForm; { MainForm for Delphi7Pdx.exe single form simple Paradox editor Author: Niels Knabe, www.nknabe.dk The CompilerVersion cut off (see [Initialization]) maybe can be set to some lower version - possibly corresponding Delphi 2009 (Compiler vers. 20) } interface uses Windows , Messages , SysUtils , Variants , Classes , Graphics , Controls , Forms , Dialogs , DBTables , DB , StdCtrls , Grids , DBGrids , ComCtrls , DBCtrls , Menus , ExtCtrls , INIFiles , Registry , ShellApi // [ShellApi] used executing ShellExecuteEx (incl. AppHelp/WebHelp) ; type TfrmMainForm = class(TForm) MainMenu1: TMainMenu; mnuFile: TMenuItem; mnuDatabaseHome: TMenuItem; mnuWorkDirChange: TMenuItem; mnuSep01: TMenuItem; mnuExit: TMenuItem; mnuTables: TMenuItem; mnuTableOpen: TMenuItem; mnuTableClose: TMenuItem; mnuHelp: TMenuItem; mnuHelpLocalSQL: TMenuItem; mnuAbout: TMenuItem; pnlTop: TPanel; DBNavigator1: TDBNavigator; StatusBar1: TStatusBar; PageControl1: TPageControl; TabSheet01: TTabSheet; TabSheet02: TTabSheet; TabSheet03: TTabSheet; TabSheet04: TTabSheet; DBGrid1: TDBGrid; pnlSQLexec1: TPanel; btnSQLexec1: TButton; Memo1: TMemo; pnlSQLexec2: TPanel; btnSQLexec2: TButton; Memo2: TMemo; pnlSQLexec3: TPanel; btnSQLexec3: TButton; Memo3: TMemo; Database1: TDatabase; Table1: TTable; Query1: TQuery; DataSource1: TDataSource; OpenDialog1: TOpenDialog; lblDefaultDriver: TLabel; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormShow(Sender: TObject); procedure mnuDatabaseHomeClick(Sender: TObject); procedure mnuWorkDirChangeClick(Sender: TObject); procedure mnuExitClick(Sender: TObject); procedure mnuTableOpenClick(Sender: TObject); procedure mnuTableCloseClick(Sender: TObject); procedure mnuHelpLocalSQLClick(Sender: TObject); procedure mnuAboutClick(Sender: TObject); procedure btnSQLexec1Click(Sender: TObject); procedure Table1AfterClose(DataSet: TDataSet); private { Private declarations } procedure prcINIfileCreate; procedure DatabasePrepare; public { Public declarations } end; var frmMainForm: TfrmMainForm; bolOpenDialogIniDirCompatible: Boolean; // Compiler sensitive switch dtAppDate: TDate; strAppINIfile: string; iniAppFile: TIniFile; strDatabaseName: string; slDbParams: TStringList; strSQL: string; LF: string; strMsg: string; curReg: TRegistry; strDefDriver: string; strShellHelpTarget: string; implementation {$R *.dfm} { Note: With Delphi 7 OpenDialog.InitialDir := is non-functional if compiled on Windows version >= 6.0 (Vista) and may be substituted with OpenDialog.FileName := + '\' If compiling with some later versions of Delphi < Delphi XE, the Initialization CompilerVersion directive may be altered accordingly, provided Delphi Compiler ~ Windows dialog compatibility. } procedure TfrmMainForm.FormCreate(Sender: TObject); begin Self.Caption := Application.Title; OpenDialog1.InitialDir := ExtractFileDir(ParamStr(0)); OpenDialog1.Title := 'Open Data Table'; if not FileExists(strAppINIfile) then prcINIfileCreate; end; procedure TfrmMainForm.FormClose(Sender: TObject; var Action: TCloseAction); var zstrSQL1,zstrSQL2,zstrSQL3: string; begin zstrSQL1 := Trim(Memo1.Text); zstrSQL2 := Trim(Memo2.Text); zstrSQL3 := Trim(Memo3.Text); Try iniAppFile := TIniFile.Create(strAppINIfile); with iniAppFile do begin WriteString('Data', 'DatabaseDir', strDatabaseName); WriteString('SQL', 'SQLstatement1', StringReplace(zstrSQL1,#13#10,'',[rfReplaceAll,rfIgnoreCase])); WriteString('SQL', 'SQLstatement2', StringReplace(zstrSQL2,#13#10,'',[rfReplaceAll,rfIgnoreCase])); WriteString('SQL', 'SQLstatement3', StringReplace(zstrSQL3,#13#10,'',[rfReplaceAll,rfIgnoreCase])); end; except iniAppFile.Free; exit; end; end; procedure TfrmMainForm.FormShow(Sender: TObject); var zstrSQL1,zstrSQL2,zstrSQL3: string; begin Try iniAppFile := TIniFile.Create(strAppINIfile); with iniAppFile do begin strShellHelpTarget := ReadString('SQLhelp','WebLocation',''); strDatabaseName := ReadString('Data','DatabaseDir',ExtractFileDir(ParamStr(0))); zstrSQL1 := ReadString('SQL', 'SQLstatement1',''); zstrSQL2 := ReadString('SQL', 'SQLstatement2',''); zstrSQL3 := ReadString('SQL', 'SQLstatement3',''); end; except iniAppFile.Free; exit; end; if copy(strDatabaseName,Length(strDatabaseName),1) = '\' then Delete(strDatabaseName,Length(strDatabaseName),1); Memo1.Text := StringReplace(zstrSQL1,'',#13#10,[rfReplaceAll,rfIgnoreCase]); Memo2.Text := StringReplace(zstrSQL2,'',#13#10,[rfReplaceAll,rfIgnoreCase]); Memo3.Text := StringReplace(zstrSQL3,'',#13#10,[rfReplaceAll,rfIgnoreCase]); PageControl1.TabIndex := 0; StatusBar1.SimpleText := '[' + strDatabaseName + ']'; curReg := TRegistry.Create(KEY_READ); curReg.RootKey := HKEY_LOCAL_MACHINE; if curReg.OpenKey('\SOFTWARE\Borland\Database Engine\Settings\System\INIT',True) then strDefDriver := curReg.ReadString('DEFAULT DRIVER') else strDefDriver := 'PARADOX'; curReg.CloseKey; curReg.Free; DatabasePrepare; if not (bolOpenDialogIniDirCompatible = True) then OpenDialog1.FileName :=strDatabaseName + '\'; if UpperCase(strDefDriver) = 'DBASE' then OpenDialog1.FilterIndex := 2 else OpenDialog1.FilterIndex := 1; end; procedure TfrmMainForm.mnuDatabaseHomeClick(Sender: TObject); begin if strDatabaseName <> ExtractFileDir(ParamStr(0)) then begin strDatabaseName := ExtractFileDir(ParamStr(0)); if not (bolOpenDialogIniDirCompatible = True) then OpenDialog1.FileName :=strDatabaseName + '\'; DatabasePrepare; end; end; procedure TfrmMainForm.mnuWorkDirChangeClick(Sender: TObject); var strInputWorkDir: string; begin strInputWorkDir := strDatabaseName; if not InputQuery('Change Database Directory','Add subdirectory or type existing directory:',strInputWorkDir) then exit; if copy(strInputWorkDir,Length(strInputWorkDir),1) = '\' then Delete(strInputWorkDir,Length(strInputWorkDir),1); if not DirectoryExists(strInputWorkDir) then Try CreateDir(strInputWorkDir); except exit; end; if not DirectoryExists(strInputWorkDir) then begin MessageDlg('Could note create directory:' + LF + '[' + strInputWorkDir + ']',mtWarning,[mbOK],0); exit; end; strDatabaseName := strInputWorkDir; DatabasePrepare; if not (bolOpenDialogIniDirCompatible = True) then OpenDialog1.FileName :=strDatabaseName + '\'; if UpperCase(strDefDriver) = 'DBASE' then OpenDialog1.FilterIndex := 2 else OpenDialog1.FilterIndex := 1; end; procedure TfrmMainForm.mnuExitClick(Sender: TObject); begin Self.Close; end; procedure TfrmMainForm.mnuTableOpenClick(Sender: TObject); var zstrFileName: string; zstrDefDriver: string; begin if not (bolOpenDialogIniDirCompatible = True) then OpenDialog1.FileName := ExtractFileName(OpenDialog1.FileName); if not OpenDialog1.Execute then exit; zstrFileName := ExtractFileName(OpenDialog1.FileName); if LowerCase(ExtractFileExt(zstrFileName)) = '.dbf' then zstrDefDriver := 'DBASE' else zstrDefDriver := 'PARADOX'; if ((ExtractFileDir(OpenDialog1.FileName) <> strDatabaseName) or (zstrDefDriver <> strDefDriver)) then begin strDatabaseName := ExtractFileDir(OpenDialog1.FileName); strDefDriver := zstrDefDriver; DatabasePrepare; end; if Table1.Active then Table1.Close; Table1.TableName := zstrFileName; Table1.Open; DataSource1.DataSet := Table1; PageControl1.TabIndex := 0; StatusBar1.SimpleText := '[' + strDatabaseName + ']: ' + Table1.TableName; mnuTableClose.Enabled := True; end; procedure TfrmMainForm.mnuTableCloseClick(Sender: TObject); begin Table1.Close; end; procedure TfrmMainForm.mnuHelpLocalSQLClick(Sender: TObject); begin if Trim(strShellHelpTarget) = '' then begin strMsg := 'No web-location specified for WebHelp on BDE LocalSQL.'; strMsg := strMsg + LF + 'WebHelp location is to be specified in the INI-file.'; MessageDlg(strMsg, mtInformation, [mbOK],0); exit; end; if ShellExecute(0,'open',PChar(strShellHelpTarget),nil,nil,SW_SHOWMAXIMIZED) <= 32 then begin strMsg := 'Cannot find WebHelp or the specified Help Target:'; strMsg := strMsg + #13#10 + strShellHelpTarget; strMsg := strMsg + #13#10 + 'WebHelp files are expected to be located in the folder:'; strMsg := strMsg + #13#10 + strShellHelpTarget; MessageDlg(strMsg, mtWarning, [mbOK],0); end; end; procedure TfrmMainForm.mnuAboutClick(Sender: TObject); begin strMsg := Application.Title; strMsg := strMsg + LF + 'Simple Paradox editor w/SQL'; strMsg := strMsg + LF + 'Designed with Delphi 7'; strMsg := strMsg + LF + 'compiled with Delphi 7 on Windows 7-32 Pro'; // strMsg := strMsg + LF + 'compiled with Delphi 10.4 on Windows 10-64 Pro'; strMsg := strMsg + LF + 'Appl. date: ' + FormatDateTime('ddddd',dtAppDate); MessageDlg(strMsg,mtInformation,[mbOK],0); end; procedure TfrmMainForm.DatabasePrepare; begin if Database1.Connected then Database1.Close; if copy(strDatabaseName, Length(strDatabaseName),1) = '\' then Delete(strDatabaseName,Length(strDatabaseName),1); Database1.Params.Clear; slDbParams := TStringList.Create; slDbParams.Add('PATH=' + strDatabaseName); slDbParams.Add('DEFAULT DRIVER=' + strDefDriver); Database1.Params := slDbParams; slDbParams.Free; Try Database1.Open; except on E:exception do begin MessageDlg(E.Message, mtError,[mbOK],0); lblDefaultDriver.Caption := ''; StatusBar1.SimpleText := ''; exit; end; end; OpenDialog1.InitialDir := strDatabaseName; if not (bolOpenDialogIniDirCompatible = True) then OpenDialog1.FileName :=strDatabaseName + '\'; if UpperCase(strDefDriver) = 'DBASE' then OpenDialog1.FilterIndex := 2 else OpenDialog1.FilterIndex := 1; lblDefaultDriver.Caption := strDefDriver; StatusBar1.SimpleText := '[' + strDatabaseName + ']'; end; procedure TfrmMainForm.Table1AfterClose(DataSet: TDataSet); begin mnuTableClose.Enabled := False; StatusBar1.SimpleText := '[' + strDatabaseName + ']'; end; procedure TfrmMainForm.prcINIfileCreate; var s: TStringList; begin s := TStringList.Create; s.Add(';***********************************************'); s.Add(';* Initialization (INI-)file for ' + ExtractFileName(ParamStr(0))); s.Add(';***********************************************'); s.Add('[Data]'); s.Add(''); s.Add('[SQLhelp]'); s.Add('WebLocation = http://www.nknabe.dk/localsql'); s.Add(''); s.Add('[SQL]'); s.Add(''); s.Add(';'); Try s.SaveToFile(ChangeFileExt(ParamStr(0),'.ini')); except End; s.Free; end; procedure TfrmMainForm.btnSQLexec1Click(Sender: TObject); begin if Table1.Active then Table1.Close; if PageControl1.TabIndex = 1 then strSQL := Trim(Memo1.Text) else if PageControl1.TabIndex = 2 then strSQL := Trim(Memo2.Text) else if PageControl1.TabIndex = 3 then strSQL := Trim(Memo3.Text); if Query1.Active then Query1.Close; Query1.SQL.Text := strSQL; Try Query1.Open; except on E:exception do begin if E is ENoResultSet then begin MessageDlg('SQL procedure without display data.',mtInformation,[mbOK],0); exit; end else begin MessageDlg('SQL execution error:' + LF + E.Message + LF + '===========' + LF + 'SQL Statement:' + LF + strSQL, mtError, [mbOK],0); exit; end; end; end; DataSource1.DataSet := Query1; PageControl1.TabIndex := 0; StatusBar1.SimpleText := '[' + strDatabaseName + ']: < SQL >'; end; Initialization dtAppDate := EncodeDate(2025,11,08); strAppINIfile := ChangeFileExt(ParamStr(0),'.ini'); LF := #13#10; // CompilerVersion 15 = Delphi 7 // CompilerVersion 22 = Delphi XE {$IF CompilerVersion >= 22} bolOpenDialogIniDirCompatible := True; {$IFEND} end.