我的应用向用户显示了论文列表(pdf文件)。他们可以单击下载(通过TidHTTP
)并在TWebBrowser
中显示pdf。如果文件已经存在,它将跳过下载。上一次我使用此项目(2019年秋季)时,此代码有效,但是现在当我在iPhone上运行它时,我遇到了问题。
症状:单击的第一篇论文将被下载,然后在TWebBrowser
中正常显示。任何后续论文的点击都将下载(我可以告诉您,因为我可以列出我的apps文档文件夹中的* .pdf文件),但无法显示。我捕获了当我用TWebBrowser
指向Form1->WebBrowser1->URL = "file://" + LFileName;
指向文件时发生的错误。错误是“找不到指定的文件”。它在那里是因为我可以在上面列出目录。
[如果我杀死该应用程序并重新启动它,然后返回并单击先前单击的论文之一(未显示),它会正常打开并显示在TWebBrowser
中。确实,这使我认为这是某种文件锁定问题,因为该文件存在。
这里是代码:
void showPaper()
{
// paperName (e.g. 22.pdf)
UnicodeString LFileName = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetDocumentsPath(), paperNAME);
if (!FileExists(LFileName)) { // file is not present so download it
UnicodeString URL = pdfURLv4 + paperNAME;
TFileStream* fs = new TFileStream(LFileName, fmCreate);
Form1->Download->ConnectTimeout = 15000; // give it 15 seconds
Form1->Download->ReadTimeout = 15000;
Form1->Download->Request->BasicAuthentication = true;
Form1->Download->Request->Username = "XXXXXX";
Form1->Download->Request->Password = "YYYYYY";
Form1->Download->Request->UserAgent = "Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0";
try
{
Form1->Download->Get(URL, fs);
Form1->Download->Disconnect(); // make sure socket is closed
}
catch(const System::Sysutils::Exception &)
{
try
{
UnicodeString URL = pdfURLv6 + paperNAME; // the v6 url has brackets [] around host
Form1->Download->Get(URL, fs);
Form1->Download->Disconnect();
}
catch(const System::Sysutils::Exception &)
{
ShowMessage(L"No/poor internet connection.");
Form1->Download->Disconnect();
delete fs;
return;
}
}
delete fs;
} // end of download if block
if (FileExists(LFileName)) // have the file so open it
{
try
{
Form1->WebBrowser1->URL = "file://" + LFileName;
}
catch ( const Exception& e )
{
ShowMessage(e.Message);
}
ShowMessage(Form1->WebBrowser1->URL);
}
} // end of showPaper()
发生错误时,所捕获的消息是(在运行13.3的iPhone上:
显示Form1->TWebBrowser1->URL
的ShowMessage给出了正确的信息:
我是否无法正确关闭TFileStream
?我可以杀死该应用程序,重新启动并查看文件,这一事实使我知道文件已正确下载。另外,第一次通过代码完全可以使用(下载然后显示在TWebBrowser
中)。只有在随后的尝试中需要下载才能显示,才显示此“找不到文件”问题。
EDIT:现在,我创建了TWebBrowser
WebBrowser1的克隆,称为myW。它可以显示pdf,但后来我不知道如何正确删除它。
这是我用于创建它并显示pdf的代码:
if (FileExists(LFileName)) // have the file so open it
{
try
{
TWebBrowser *myW;
myW = new TWebBrowser(Form1->Panel3);
myW->Parent = Form1->Panel3;
myW->Align = TAlignLayout::Client;
myW->URL = "file://" + LFileName;
myW->Visible = true;
}
catch ( const Exception& e )
{
ShowMessage(e.Message);
}
}
这是我尝试删除的地方:
TComponent *T;
T = Form1->Panel3->Components[0]; // myW is only thing on Panel3
T->Free(); // not working
// T->DisposeOf(); // did not work
EDIT2:尝试处置临时TWebBrowser
:
我这样创建TWebBrowser
(并且可以很好地显示pdf):
TWebBrowser *myW;
myW = new TWebBrowser(Form1->Panel3);
myW->Parent = Form1->Panel3;
myW->Align = TAlignLayout::Client;
myW->URL = "file://" + LFileName; // displays the pdf
myW->Visible = true;
然后我尝试这样处理,但不起作用:
TComponent *T;
for (int i = 0; i < (Form1->Panel3->ComponentCount); i++) {
T = Form1->Panel3->Components[i];
if (TWebBrowser* TB = dynamic_cast<TWebBrowser*>(T)) {
Form1->Panel3->RemoveComponent(TB);
TB->Parent = nullptr;
TB = nullptr;
break;
}
}
}
我没有任何错误,我只是无法加载第二个pdf(仍然没有找到该文件错误)。我正在使用演员表,因为我无法访问T->Parent
。
void showPaper()
{
// paperName (e.g. 22.pdf)
UnicodeString LFileName = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetDocumentsPath(), paperNAME);
if (!FileExists(LFileName)) { // file is not present so download it
UnicodeString URL = pdfURLv4 + paperNAME;
TFileStream* fs = new TFileStream(LFileName, fmCreate);
Form1->Download->ConnectTimeout = 15000; // give it 15 seconds
Form1->Download->ReadTimeout = 15000;
Form1->Download->Request->BasicAuthentication = true;
Form1->Download->Request->Username = "XXXXXX";
Form1->Download->Request->Password = "YYYYYY";
Form1->Download->Request->UserAgent = "Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0";
try
{
Form1->Download->Get(URL, fs);
Form1->Download->Disconnect(); // make sure socket is closed
}
catch(const System::Sysutils::Exception &)
{
try
{
UnicodeString URL = pdfURLv6 + paperNAME; // the v6 url has brackets [] around host
Form1->Download->Get(URL, fs);
Form1->Download->Disconnect();
}
catch(const System::Sysutils::Exception &)
{
ShowMessage(L"No/poor internet connection.");
Form1->Download->Disconnect();
delete fs;
return;
}
}
delete fs;
} // end of download if block
//////// this gets around the wierd file lock problem
UnicodeString TFileName = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetDocumentsPath(), "dummy.pdf");
if (FileExists(TFileName)) {
TFile::Delete(TFileName); // delete it if present
}
TFile::Copy(LFileName, TFileName);
//--------------------------------------
if (FileExists(LFileName)) // have the file so open it
{
try
{
TWebBrowser *myW;
myW = new TWebBrowser(Form1->Panel3);
myW->Parent = Form1->Panel3;
myW->Align = TAlignLayout::Client;
myW->URL = "file://" + TFileName;
myW->Visible = true;
}
catch ( const Exception& e )
{
ShowMessage(e.Message);
}
ShowMessage(Form1->WebBrowser1->URL);
}
} // end of showPaper()
并且在显示文件并且用户单击关闭按钮后,我这样做是为了摆脱临时的TWebBrowser
:
TComponent *T;
for (int i = 0; i < (Form1->Panel3->ComponentCount); i++) {
T = Form1->Panel3->Components[i];
//if (T->ClassName() == "TWebBrowser") {
if (TWebBrowser* TB = dynamic_cast<TWebBrowser*>(T)) {
Form1->Panel3->RemoveComponent(TB);
TB->Parent = nullptr;
TB = nullptr;
break;
}
}