Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi E2010 Inkompatible Typen: 'Integer' und 'Pointer' (https://www.delphipraxis.net/118487-e2010-inkompatible-typen-integer-und-pointer.html)

bl3nder 8. Aug 2008 16:12


E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
Hallo,


Ich versuch mich grade an einem Model View Controller. Hierzu habe ich unter anderem 2 Units die mit einander kommunizieren.

Model.pas
Model_Database.pas


Model_Database.pas sieht vereinfacht so aus:


Delphi-Quellcode:
unit Model_Database;

interface

uses
  ZConnection,ZDataset,DBgrids, ZAbstractRODataset,
  ZAbstractDataset,ZSysUtils,ZPlainMySqlDriver,DB,Classes;

type

  TDatabase = class(TObject)
  private
    SQLQuery: TZQuery;
    DataSource: TDataSource;
    SQLConnection: TZConnection;
  public
    constructor Create();
    function DBSearch: TList; virtual; abstract;
    //...
  end;





  TWorkStationSearch = class(TDatabase)
  private
  public
    function DBSearch: TList; override;
  end;




implementation

uses Model;


//...


function TWorkstationSearch.DBSearch: TList; override;
var List: TList;
begin
  SQLQuery.SQL.Text := 'SELECT * FROM Workstations';
  SQLQuery.Open;

  while not SQLQuery.EOF do
    List.Add(SQLQuery.FieldByName('WorkstationID'));

  Result := List;
end;



end.


Model.pas sieht verkürtzt so aus

Delphi-Quellcode:

unit Model;

interface

uses
  ZConnection,ZDataset,DBgrids, ZAbstractRODataset,
  ZAbstractDataset,ZSysUtils,ZPlainMySqlDriver,DB,Contnrs,Classes,SysUtils,
  Model_Database;

type
 

  TMain = class(TObject)
  private
  public

    function DBSearch(): TObjectList; Virtual; Abstract;
    //...
  end;


//...


  TWorkstation = class(TMain)
  private
    ID: Integer;
    Username: String;
    Room: String;
    FormerUserName: String;
    Documentation: String;

  public
    constructor Create(DatabaseID: Integer);
    destructor Destroy();


    function GetUsername: String;
   
    //...

  end;




  TWorkstationSearch = class(TMain)
  private
  public
    function DBSearch(): TObjectList; Override;
  end;




implementation

constructor TWorkstation.Create(DatabaseID: Integer);
begin
  ID := DatabaseID;
  Username := 'testname'+IntToStr(DatabaseID);
  Room := '123';
  FormerUsername := 'alt';
  Documentation := 'nc';
end;




function TWorkstation.GetUsername;
begin
  Result := Username;
end;



function TWorkstationSearch.DBSearch;
var WsSearch: Model_Database.TWorkstationSearch;
var Workstation: TWorkstation;
var List: TList;
var WsList: TObjectList;
var I: Integer;
begin
  I := 0;
  List := WsSearch.DBSearch();
  while (I<List.Count) do
  begin
    Workstation.Create(List[I]); // <------------------ FEHLERZEILE
    WsList.Add(Workstation);
    Workstation.Destroy;
    Inc(I);
  end;

  Result := WsList;
end;



end.


Beim Kompilieren von Model.pas sagt er mir dann den folgenden Fehler:

Zitat:

[Pascal Fehler] Model.pas(279): E2010 Inkompatible Typen: 'Integer' und 'Pointer'


Wieso ist die Liste nicht eine Liste von Integern ? So habe ich es doch in obigen Funktion deklariert. Oder etwa nicht ?

DeddyH 8. Aug 2008 16:16

Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
Mal abgesehen davon, dass ich eine Liste nicht als Funktionsrückgabewert definieren würde: TList ist eine Liste von Pointern. Das sind zwar intern 32-Bit-Integer, trotzdem musst Du casten.
Delphi-Quellcode:
List.Add(Pointer(SQLQuery.FieldByName('WorkstationID')));
P.S.: Wo ist eigentlich das TList.Create? Hab ich das übersehen?

Apollonius 8. Aug 2008 16:16

Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
Erstmal: Ein var reicht.
TList ist eine Liste von Pointern. Wenn du eine Integer-Liste willst, musst du casten.

Objekte werden mit Instanz := TKlasse.Create erzeugt, nicht mit Instanz.Create.
Auch Listen sind Objekte, die du erzeugen musst.

Außerdem darfst du das Objekt nicht gleich wieder freigeben.

SirThornberry 8. Aug 2008 16:19

Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
Delphi-Quellcode:
constructor TWorkstation.Create(DatabaseID: Integer);
da steht eindeutig integer und du übergibst eben einen Pointer. Von daher verstehe ich nicht was an der Fehlermeldung seltsam sein soll.

DeddyH 8. Aug 2008 16:19

Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
Zitat:

Zitat von DeddyH
TList ist eine Liste von Pointern.

Zitat:

Zitat von Apollonius
TList ist eine Liste von Pointern.

:lol:

Apollonius 8. Aug 2008 16:22

Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
Das habe ich getippt, bevor der rote Kasten kam. :P

DeddyH 8. Aug 2008 16:29

Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
[OT] Ich finde es nur witzig, dass der Wortlaut haargenau übereinstimmt :zwinker: [/OT]

Medium 8. Aug 2008 16:36

Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
Sogar die Uhrzeit. Das ist ein Omen! Evtl... :gruebel:

DeddyH 8. Aug 2008 16:41

Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
:shock: Die letzte Person, bei der mir das häufiger passiert ist, habe ich geheiratet. :-D

bl3nder 12. Aug 2008 10:31

Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
 
Hallo,

Danke fuer die Antworten,

Ich habe nun auch die Liste und die Instanzen durch
Delphi-Quellcode:
List := TList.Create;
und
Delphi-Quellcode:
Workstation := TWorkstation.Create(List[I]);
erstellt.

Dennoch ändert das nichts am Problem. Dass ich die Instanz wieder freigebe liegt daran, dass in jeder Schleife eine neue Instanz angelegt werden soll, sodass in der Liste nicht öfter das gleiche Objekt zu finden ist. Vielleicht habe ich da aber auch ein Vorstellungsproblem. Soweit ist noch Workstation.Destroy mit eingebaut...

Delphi-Quellcode:
function TWorkstationSearch.DBSearch;
var
WsSearch: Model_Database.TWorkstationSearch;
Workstation: TWorkstation;
List: TList;
WsList: TObjectList;
I: Integer;
begin
  I := 0;
  List := TList.Create;
  List := WsSearch.DBSearch();
  while (I<List.Count) do
  begin
    Workstation := TWorkstation.Create(List[I]);
    WsList.Add(Workstation);
    Workstation.Destroy;
    Inc(I);
  end;

  Result := WsList;
end;

Nun weiß ich nicht genau, wie ich diese Liste von Pointern casten kann, sodass in der Liste nur die Datenbank IDs stehen.
Würde mir jemand auf die Sprünge helfen ?

Danke
Mfg


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:22 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf