Delphi 7中不兼容的类型

时间:2014-06-15 16:39:27

标签: delphi

我已按照以下说明完成此操作:

  

使用CDO_TLB,ADODB_TLB; _Stream在ADODB_TLB单元(活动数据对象)中定义。 IMessage,>我在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;

2 个答案:

答案 0 :(得分:3)

显然,您在TStream单元中有ADODB_TLB的第二次声明,当您在同一单元中使用ADODB_TLBClasses时,将使用TStream从最后一个单位宣布。你可以解决这个问题:

  1. 明确使用所需单位的TStream

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

  2. 将一个TStream重命名为更独特的内容 ADODB_TLB.TStreamADODB_TLB.TADOStream。我更喜欢这个 办法。您可以通过重新导入ADODB_TLB并指定类型来完成此操作 重命名为TStream(这在导入向导中已选中)

答案 1 :(得分:2)

问题是您的界面使用定义Classes的{​​{1}}。
您的实施使用TStream,其中也定义了ADODB_TLB 注意:正如Sertac指出的那样,如果您在界面部分中包含这两个单元,但在后面有TStream ,则也会出错> 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中的那个。正如Sertac指出的那样,Classes会返回CreateBlobStream,因此使用那个。{/ p>

选项

  • 首先考虑一下你是否真的需要使用ADODB_TLB? Delphi已经在Classes.TStream中为这个类型库提供了包装器。如果你可以使用它,你将遵循“更传统的”德尔福范式。

  • 如果您必须直接针对ADO进行编码,那么我建议您将ADODB.pas移至界面部分,然后 uses ADODB_TLB。这样,uses Classes(来自TStream)的最新定义将适用于您的整个单元。

  • 您还可以使用VitaliyG's answer的第1点中的完全限定名称来引用类型。即Classes

  • 但是,在这种情况下,我不建议将Classes.TStream重命名为他答案的第2点。原因是这些是Delphi附带的单元,其他单元依赖于它们。但如果命名冲突在你自己的单位,那么我肯定会建议选择更具体的名称来区分类型。如果类型真的是同一个东西,那么也许你应该把它们合并到一个共享的第三单元。


附录

你在评论中提到:

  

我想整合这个过程:Create *. Mht-file (Web Archive)在我在uses子句中添加ADODB_TLB之前,它工作正常。

这解释了您添加单位的原因。但是,鉴于命名冲突,以及可能出现不必要的麻烦:我建议您将功能隔离到一个小的专用单元(例如TStream)。

  • 然后您的单位将不需要使用MHTBuilder.pas(它将由MHTBuilder使用)。
  • 您的单位将改为使用ADODB_TLB
  • 并调用一个简单的函数来构建MHT文件。

这与我关于您需要将代码拆分为较小函数的评论密切相关。将事物分解成更小的部分使得管理复杂性变得更加容易。基本上你应该避免试图将所有的功能和选项都集中到一个巨大的方法中(正如你所做的那样)。