String 在Delphi中以字符串形式从TopEndDialog传递文件路径
我试图利用TopEndDialog将所选文件的路径传递到ADoconConnection,并将Excel文件的内容加载到表中。我目前正在尝试以下代码,但代码的最后一部分未连接到Excel,返回错误: [dcc32错误]示例\u map.pas80:E2010不兼容类型:“字符串”和“TOpenDialog” openDialog是文件对话框的一个实例。它不是一根弦。您需要读取文件对话框对象的FileName属性,如下所示:String 在Delphi中以字符串形式从TopEndDialog传递文件路径,string,delphi,widestring,topendialog,String,Delphi,Widestring,Topendialog,我试图利用TopEndDialog将所选文件的路径传递到ADoconConnection,并将Excel文件的内容加载到表中。我目前正在尝试以下代码,但代码的最后一部分未连接到Excel,返回错误: [dcc32错误]示例\u map.pas80:E2010不兼容类型:“字符串”和“TOpenDialog” openDialog是文件对话框的一个实例。它不是一根弦。您需要读取文件对话框对象的FileName属性,如下所示: openDialog.FileName openDialog := T
openDialog.FileName
openDialog := TOpenDialog.Create(self);
try
.... // use openDialog to let user choose file:
strConn := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + openDialog.FileName + ';' +
'Extended Properties=Excel 8.0;';
finally
openDialog.Free; // executes no matter what, even if exception raised, etc.
end;
事实上,您已经在其中一个ShowMessage调用中使用了它
请确保在调用Free之前阅读此属性,问题代码中存在错误
事实上,您确实需要养成使用try/finally来保护资源的习惯。无论何时创建类的实例,都需要确保即使遇到异常也会将其销毁。在代码中,您需要这样编写:
openDialog.FileName
openDialog := TOpenDialog.Create(self);
try
.... // use openDialog to let user choose file:
strConn := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + openDialog.FileName + ';' +
'Extended Properties=Excel 8.0;';
finally
openDialog.Free; // executes no matter what, even if exception raised, etc.
end;
我也不认为您需要在这里使用WideString。如果使用Unicode Delphi,则可以使用本机字符串类型,它是Unicode Destring的别名。如果您的Delphi是Unicode之前的版本,那么您也可以安全地使用string,在这种情况下,它是Anistring的别名。您使用的文本是ASCII。文件对话框是ANSI控件,因此openDialog.FileName也是ANSI。使用WideString不会获得任何好处
最后,您将在一个函数中混合使用选择文件名的代码和处理数据库连接的代码。最好将关注点分开。创建一个只返回文件名的方法,该文件名由用户通过对话框选择。并添加处理数据库连接的方法,该方法将文件名作为参数传递。在释放对话框之前,需要获取OpenDialog.filename:
OpenDialog := TOpenDialog.Create(nil);
try
// Set up the OpenDialog as before
// Display the open file dialog
if openDialog.Execute then
begin
strConn := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + openDialog.FileName + ';' +
'Extended Properties=Excel 8.0;';
// Connect the Excel file
AdoConnection1.Connected:=False;
AdoConnection1.ConnectionString:=strConn;
else
ShowMessage('Open file was cancelled');
finally
// Free up the dialog
openDialog.Free;
end;
当然,你工作太辛苦了。使用PromptForFilename函数,Dialogs单元有一种更简单的方法来实现这一点,它消除了完全创建和释放对话框的需要:
var
FileName: string;
begin
FileName := '';
if PromptForFileName(FileName, // Chosen filename holder
'Excel 2003 and older|*.xls|Excel 2007 and older|*.xlsx'; // Filter(s) (optional)
'.xlsx', // Default extension (opt)
'Choose file', // Dialog title (opt)
GetCurrentDir, // Initial dir (opt)
False) then // Is it a save dlg? (opt)
begin
strConn := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + FileName + ';' +
'Extended Properties=Excel 8.0;';
// Connect the Excel file
AdoConnection1.Connected:=False;
AdoConnection1.ConnectionString:=strConn;
end
else
ShowMessage('Dialog cancelled.');
end;
作为旁注,如果您不知道:如果您以.xls*的形式输入所有Excel文件,则可以使用单个筛选器选择.xls和.xlsx这两个Excel文件,就像在Excel文件|*.xls*中一样
正如David所说,最好的方法是将获取文件名的代码和作为单独函数进行连接的代码分开。调用第一个文件名获取文件名,然后将该文件名传递给第二个文件名,以便在选择文件名的情况下实际进行连接。是的,这里的关键是,在将所选文件名添加到连接字符串时,您遗漏了filename属性。