[英]incompatible types in Delphi 7
我已經按照以下說明進行了操作:
使用CDO_TLB,ADODB_TLB; 在ADODB_TLB單元(活動數據對象)中定義的_Stream。 IMessage,> I Configurationin位於CDO_TLB單元(協作數據對象)中。 如果尚未創建,請按如下所示使用導入類型庫並創建:CDO_TLB = C:\\ WINDOWS \\ system32 \\ cdosys.dll
ADO_TLB = C:\\ Program Files \\ Common Files \\ System \\ ado \\ msadoxx.dll-xx版本號
現在我得到以下錯誤:
[Fehler] Unit1.pas(1650): Inkompatible Typen: 'ADODB_TLB.TStream' und 'Classes.TStream'
[Fehler] Unit1.pas(1651): Inkompatible Typen: 'ADODB_TLB.TStream' und 'Classes.TStream'
[Fehler] Unit1.pas(1655): Inkompatible Typen: 'Classes.TStream' und 'ADODB_TLB.TStream'
[Fehler] Unit1.pas(1656): Inkompatible Typen: 'Classes.TStream' und 'ADODB_TLB.TStream'
[Fehler] Unit1.pas(1720): Inkompatible Typen: 'ADODB_TLB.TStream' und 'Classes.TStream'
[Fehler] Unit1.pas(1724): Inkompatible Typen: 'Classes.TStream' und 'ADODB_TLB.TStream'
在此聲明中:
SpecStream := MyQuery9.CreateBlobStream(MyQuery9.FieldByName('SpecSheet'), bmRead);
SaftyStream := MyQuery9.CreateBlobStream(MyQuery9.FieldByName('SaftySheet'), bmRead);
我知道我已經通過導入TLB更改了類型庫。 但是,如何仍可以同時使用兩個類?
這是我的代碼,僅此部分是必需的:(用//我們推薦的行會出錯。)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, Grids, DBGrids, ExtCtrls, DBCtrls, MemDS, DBAccess,
MyAccess, MyDacVcl, StdCtrls, frxClass, frxDesgn, frxDBSet, frxExportPDF,
jpeg, ComCtrls, SBCookieMgr, SBSimpleSSL, SBHTTPSClient, SBConstants,
SBHTTPCRL, SBHTTPOCSPClient, SBHTTPCertRetriever, SBX509,
SBSSLClient, SBTypes, SBUtils, SBCustomCertStorage, SBCertValidator,
OleCtrls, SHDocVw ,Wininet, PDFSplitMerge_TLB,
ActiveX, // IMalloc
ShlObj, SBArcBase, SBArcZip, // CSIDL_-Konstanten
ShellAPI; // SHGetSpecialFolderLocation() und SHGetPathFromIDList()
type
...
implementation
{$R *.dfm}
uses RegExpr, CDO_TLB, ADODB_TLB;
..
procedure TForm1.Button7Click(Sender: TObject);
var
oldTabSheet: TTAbSheet;
SpecStream, SaftyStream: TStream;
MyAN: string;
MyLief: String;
begin
oldTabSheet := pageControl1.ActivePage;
pageControl1.ActivePage:= TabSheet5;
//WebBrowser1.Navigate(PrgDirName+'\laborbedarf.pdf');
//WebBrowser1.Quit;
//Radiobutton1.Checked:=NOT(radiobutton1.Checked);
//Radiobutton2.Checked:=NOT(radiobutton2.Checked);
MyAN := MyQuery1.FieldByName('ArtikelNummer').AsString;
MyLIEF := MyQuery1.FieldByName('Lieferant').AsString;
if NOT((MyAN = NULL) or (MyAN = '')) then
begin
(* ---------------------------------------------------------- LIEFERANT 1 ---*)
if MyLIEF = DBGrid1.Columns[11].PickList[0] then
begin
MyQuery9.SQL.Text:='select * from stoff WHERE RecID = :Old_RecID';
MyQuery9.ParamByName('Old_RecID').AsInteger := MyQuery1.FieldByName('RecID').AsInteger;
MyQuery9.Execute;
//we SpecStream := MyQuery9.CreateBlobStream(MyQuery9.FieldByName('SpecSheet'), bmRead);
//we SaftyStream := MyQuery9.CreateBlobStream(MyQuery9.FieldByName('SaftySheet'), bmRead);
MyStream2S := TMemoryStream.Create;
MyStream3S := TMemoryStream.Create;
MyStream2S.Clear; MyStream3S.clear;
//we MyStream2S.LoadFromStream(SaftyStream );
//we MyStream3S.LoadFromStream(SpecStream );
if RadioButton1.Checked then
begin
try
DeleteFile(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf');
MyStream2S.SaveToFile(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf');
WebBrowser1.Navigate(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf');
Radiobutton1.Checked:= false;
Radiobutton2.Checked:= true;
except
end;
try
DeleteFile(GetTempDirectory+'Spezifikation_tmp.pdf');
MyStream3S.SaveToFile(GetTempDirectory+'Spezifikation_tmp.pdf');
WebBrowser1.Navigate(GetTempDirectory+'Spezifikation_tmp.pdf');
Radiobutton1.Checked:= true;
Radiobutton2.Checked:= false;
except
end;
end
else if RadioButton2.Checked then
begin
try
DeleteFile(GetTempDirectory+'Spezifikation_tmp.pdf');
MyStream3S.SaveToFile(GetTempDirectory+'Spezifikation_tmp.pdf');
WebBrowser1.Navigate(GetTempDirectory+'Spezifikation_tmp.pdf');
Radiobutton1.Checked:= true;
Radiobutton2.Checked:= false;
except
end;
try
DeleteFile(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf');
MyStream2S.SaveToFile(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf');
WebBrowser1.Navigate(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf');
Radiobutton1.Checked:= false;
Radiobutton2.Checked:= true;
except
end;
end;
end
(* ---------------------------------------------------------- LIEFERANT 2 ---*)
else
if MyLIEF = DBGrid1.Columns[11].PickList[1] then
begin
MyQuery9.SQL.Text:='select * from stoff WHERE RecID = :Old_RecID';
MyQuery9.ParamByName('Old_RecID').AsInteger := MyQuery1.FieldByName('RecID').AsInteger;
MyQuery9.Execute;
//SpecStream := MyQuery9.CreateBlobStream(MyQuery9.FieldByName('SpecSheet'), bmRead);
//we SaftyStream := MyQuery9.CreateBlobStream(MyQuery9.FieldByName('SaftySheet'), bmRead);
MyStream2S := TMemoryStream.Create;
MyStream3S := TMemoryStream.Create;
MyStream2S.Clear; MyStream3S.clear;
//we MyStream2S.LoadFromStream(SaftyStream );
//MyStream3S.LoadFromStream(SpecStream );
Radiobutton1.Checked:= false;
Radiobutton2.Checked:= true;
if RadioButton2.Checked then
begin
try
DeleteFile(GetTempDirectory+'Spezifikation_tmp.pdf');
MyStream3S.SaveToFile(GetTempDirectory+'Spezifikation_tmp.pdf');
if Filesize(GetTempDirectory+'Spezifikation_tmp.pdf') > 5 then
WebBrowser1.Navigate(GetTempDirectory+'Spezifikation_tmp.pdf')
else
WebBrowser1.Navigate(PrgDirName+'\PDFLeer.pdf');
Radiobutton1.Checked:= true;
Radiobutton2.Checked:= false;
except
ShowMessage(' Kann PDF nicht anzeigen, wurde es nicht geladen weil nicht verfügbar?');
end;
try
DeleteFile(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf');
MyStream2S.SaveToFile(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf');
if Filesize(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf') > 5 then
WebBrowser1.Navigate(GetTempDirectory+'Sicherheitsdatenblatt_tmp.pdf')
else
WebBrowser1.Navigate(PrgDirName+'\PDFLeer.pdf');
Radiobutton1.Checked:= false;
Radiobutton2.Checked:= true;
except
ShowMessage(' Kann PDF nicht anzeigen, wurde es nicht geladen weil nicht verfügbar?');
end;
end;
end ;
//MyQuery1.Next;
MyStream3S.Clear;
MyStream2S.Clear;
MyStream3S.free;
MyStream2S.free;
end
else
begin
ShowMessage('Kein PDF in DB gefunden!');
end;
end;
顯然,您在ADODB_TLB
單元中有第二個TStream
聲明,並且當您在同一單元中同時使用ADODB_TLB
和Classes
時TStream
將在最后一個單元中使用。 您可以解決此問題:
通過顯式使用所需單元中的TStream
。
var
S1: ADODB_TLB.TStream;
S2: Classes.TStream;
通過將一個TStream
重命名為更獨特的東西,例如ADODB_TLB.TStream
到ADODB_TLB.TADOStream
。 我希望這樣。 您可以通過重新導入ADODB_TLB
並為TStream
指定類型重命名來TStream
此TStream
(在導入向導中選擇該名稱)
問題是您的接口使用定義TStream
Classes
。
而且您的實現使用ADODB_TLB
,它也定義了TStream
。
注 :由於Sertac所指出的,你也會,如果你包括在接口部分兩個單元,但必須得到錯誤ADODB_TLB
之后 Classes
。
因此,每當在單元的接口部分中使用TStream
時,就在使用Classes.TStream
。 但是在實現部分中,它將是ADODB_TLB.TStream
,這就是為什么出現錯誤的原因。 當在使用不同類型的另一單元調用一個例程的錯誤也發生TStream
(如CreateBlobStream
返回Classes.TStream
)。
//You declared SaftyStream in the implementation section, so it is ADODB_TLB.TStream.
//But CreateBlobStream returns a Classes.TStream.
//So they are incompatible.
SaftyStream := MyQuery9.CreateBlobStream(MyQuery9.FieldByName('SaftySheet'), bmRead);
//You don't show where you declare MyStream2S.
//I assume interface section, so it is Classes.TStream.
//Classes.TStream.LoadFromStream expects to be given a Classes.TStream
//But SaftyStream is ADODB_TLB.TStream, which is incompatible.
MyStream2S.LoadFromStream(SaftyStream );
解決此問題時,您需要決定的第一件事是您實際要使用兩個TStream
的哪個? (我懷疑一個中Classes
。作為Sertac指出, CreateBlobStream
返回Classes.TStream
,所以你應該使用那一個。)
首先考慮您是否真的需要使用ADODB_TLB? Delphi在ADODB.pas
已經為該類型庫提供了ADODB.pas
。 如果可以使用它,您將遵循“更傳統的” Delphi范例。
如果您必須直接針對ADO進行編碼,那么建議您將uses ADODB_TLB
移到接口部分中,然后再 uses Classes
。 這樣, TStream
最新定義(來自Classes
)將適用於您的整個單元。
您也可以使用VitaliyG答案的第 1點中的完全限定名稱來引用類型。 即Classes.TStream
但是,在這種情況下,我不建議像他回答的第2點那樣重命名TStream
。 原因是這些是Delphi附帶的單元,其他單元對此也有依賴性。 但是,如果命名沖突在您自己的單位內,那么我絕對會建議選擇更具體的名稱來區分類型。 如果類型確實是同一回事,那么也許您應該將它們合並為一個共享的第三單元。
您在評論中提到:
我要集成此過程: 創建*。 Mht-file(Web存檔)在我在uses子句中添加ADODB_TLB之前,它運行良好。
這說明了為什么要添加單位。 但是,考慮到命名沖突和潛在的不必要麻煩:我建議您寧可將功能隔離到一個小的專用單元中(例如MHTBuilder.pas
)。
ADODB_TLB
(它將由MHTBuilder使用)。 MHTBuilder
。 這與我關於您需要將代碼拆分為較小功能的評論密切相關。 將事情分解成更小的部分,可以更輕松地管理復雜性。 基本上,您應該避免嘗試將所有功能和選項都整合到一個巨大的方法中(就像您所做的那樣)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.