![]() |
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:
Wieso ist die Liste nicht eine Liste von Integern ? So habe ich es doch in obigen Funktion deklariert. Oder etwa nicht ? |
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:
P.S.: Wo ist eigentlich das TList.Create? Hab ich das übersehen?
List.Add(Pointer(SQLQuery.FieldByName('WorkstationID')));
|
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. |
Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
Delphi-Quellcode:
da steht eindeutig integer und du übergibst eben einen Pointer. Von daher verstehe ich nicht was an der Fehlermeldung seltsam sein soll.
constructor TWorkstation.Create(DatabaseID: Integer);
|
Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
Zitat:
Zitat:
|
Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
Das habe ich getippt, bevor der rote Kasten kam. :P
|
Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
[OT] Ich finde es nur witzig, dass der Wortlaut haargenau übereinstimmt :zwinker: [/OT]
|
Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
Sogar die Uhrzeit. Das ist ein Omen! Evtl... :gruebel:
|
Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
:shock: Die letzte Person, bei der mir das häufiger passiert ist, habe ich geheiratet. :-D
|
Re: E2010 Inkompatible Typen: 'Integer' und 'Pointer'
Hallo,
Danke fuer die Antworten, Ich habe nun auch die Liste und die Instanzen durch
Delphi-Quellcode:
und
List := TList.Create;
Delphi-Quellcode:
erstellt.
Workstation := TWorkstation.Create(List[I]);
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 +1. Es ist jetzt 13:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz