簡體   English   中英

Delphi 7中不兼容的類型

[英]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_TLBClassesTStream將在最后一個單元中使用。 您可以解決此問題:

  1. 通過顯式使用所需單元中的TStream

    var
    S1: ADODB_TLB.TStream;
    S2: Classes.TStream;

  2. 通過將一個TStream重命名為更獨特的東西,例如ADODB_TLB.TStreamADODB_TLB.TADOStream 我希望這樣。 您可以通過重新導入ADODB_TLB並為TStream指定類型重命名來TStreamTStream (在導入向導中選擇該名稱)

問題是您的接口使用定義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
  • 並調用一個簡單的函數來構建MHT文件。

這與我關於您需要將代碼拆分為較小功能的評論密切相關。 將事情分解成更小的部分,可以更輕松地管理復雜性。 基本上,您應該避免嘗試將所有功能和選項都整合到一個巨大的方法中(就像您所做的那樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM