![]() |
eigene Klasse; Constructor inkl. TImage
Hallo,
ich habe eine Klasse, die ich jetzt weiterentwickeln will, damit ich in den Prozeduren oder Funktionen das TImage nicht immer gesondert "createn" muss. Allerdings bekomme ich immer eine Fehlermeldung und mir fällt nix mehr ein. z.B. bei Create(self): [DCC Fehler] enemy.pas(25): E2010 Inkompatible Typen: 'TComponent' und 'TEnemy' z.B. bei Create(TEnemy): [DCC Fehler] enemy.pas(25): E2010 Inkompatible Typen: 'TComponent' und 'Class reference' Die Klasse:
Delphi-Quellcode:
Da wo die Fragezeichen stehen habe ich schon alles mögliche ausprobiert (self) (TImage) (TEnemy) (TCompontent(TImage))
unit enemy;
interface uses ExtCtrls; Type TEnemy = class private public name : string; path : string; size : integer; priority : double; image : TImage; constructor Create; end; TEnemyArray = array of TEnemy; implementation Constructor TEnemy.Create; begin image := image.Create(????); end; end. Kann mir vielleicht jemand nen Tipp geben, mit dem ich weiter basteln und testen kann? Gruß Daniel |
AW: eigene Klasse; Constructor inkl. TImage
Du musst für TEnemy die passende Basisklasse verwenden:
Delphi-Quellcode:
Und realisiere image : TImage als read-only-property um klar zu machen das dieses nicht von aussen gesetzt werden kann.
Type TEnemy = class(TComponent)
|
AW: eigene Klasse; Constructor inkl. TImage
Hm.. hab das Gefühl, dass ich nen Schritt weiter bin, aber so ganz rund läuft das noch nicht.
Hier nochmal die Klasse:
Delphi-Quellcode:
und die Prozedur:
unit enemy;
interface uses ExtCtrls,Classes; Type TEnemy = class(TComponent) private public enemyimage : TImage; enemyname : string; enemypath : string; enemysize : integer; enemypriority : double; constructor Create(); end; TEnemyArray = array of TEnemy; implementation Constructor TEnemy.Create; begin enemyimage := enemyimage.Create(self); //enemyimage.Left := 400; //enemyimage.Top := 400; //enemyimage.AutoSize := true; end;
Delphi-Quellcode:
Zu dem nicht funktionieren CONSTRUCTOR kommt auch noch, die Frage, ob ich procedure tfrm_main.init_enemyarray(); VAR I : integer ; begin SetLength(EnemyArray,FileListBox1.Count+1); try for I := 0 to FileListBox1.Count-1 do begin EnemyArray[I] := TEnemy.Create; // So lief es ohne CONSTURCTOR //EnemyArray[I].enemyimage := TImage.Create(self); EnemyArray[I].enemyname := FileListBox1.Items.Strings[I]; EnemyArray[I].enemyimage.Picture.Icon.Handle := GetShellIcon(FileListBox1.Directory+'\'+FileListBox1.Items.Strings[I], True, False); end; except on E : Exception do begin WriteLog(E.Message + ' : ' + IntToStr(I)); ShowMessage(E.Message + ' : ' + IntToStr(I)); end; end; end;
Delphi-Quellcode:
auch beim Create zuweisen kann ? Also quasi das Handle bei Instanziierung übergeben.
EnemyArray[I].enemyimage.Picture.Icon.Handle
READ-ONLY für das Image und auslesen per GET kommt später :) Hier noch die Fehlermeldung vom EXCEPT: "Zugriffsverletzung bei Adresse 004BE9EB in Modul 'ADMINV.exe'. Lesen von Adresse 00000000" Ich vermute jetzt mal, dass das Objekt nicht instanziiert ist und nicht gefunden wird. Vielen Dank schon mal für die Unterstützung Gruß Daniel |
AW: eigene Klasse; Constructor inkl. TImage
Habs gelöst !!
Klasse:
Delphi-Quellcode:
Procedure:
unit enemy;
interface uses ExtCtrls,Classes,Forms,Windows; Type TEnemy = class(TComponent) private enemyimage : TImage; enemyname : string; public enemypath : string; enemysize : integer; enemypriority : double; constructor Create(AParent: TForm; EName: string; IHandle : HICON); end; TEnemyArray = array of TEnemy; implementation Constructor TEnemy.Create(AParent: TForm; EName: string; IHandle : HICON); begin enemyimage := TImage.Create(AParent); with enemyimage do begin Parent := AParent; Left := 400; Top := 400; AutoSize := true; Picture.Icon.Handle := IHANDLE; enemyname := EName; end; end; end.
Delphi-Quellcode:
Gruß
procedure tfrm_main.init_enemyarray();
VAR I : integer ; begin SetLength(EnemyArray,FileListBox1.Count+1); try for I := 0 to FileListBox1.Count-1 do begin EnemyArray[I] := TEnemy.Create(frm_main,FileListBox1.Items.Strings[I],GetShellIcon(FileListBox1.Directory+'\'+FileListBox1.Items.Strings[I], True, False)); end; except on E : Exception do begin WriteLog(E.Message + ' : ' + IntToStr(I)); ShowMessage(E.Message + ' : ' + IntToStr(I)); end; end; end; Daniel |
AW: eigene Klasse; Constructor inkl. TImage
Damit verbirgst Du aber den Konstruktor von TComponent, das sollte auch eine entsprechende Warnung geben. Und soll das Image von außen komplett unsichtbar sein? Ansonsten würde ich eine ReadOnly-Property einführen.
|
AW: eigene Klasse; Constructor inkl. TImage
Also am Anfang des Konstruktor einfach den der Superklasse aufrufen
Delphi-Quellcode:
inherited Create( AParent);
|
AW: eigene Klasse; Constructor inkl. TImage
Und als Owner für das TImage würde ich nicht AParent angeben, sondern entweder self oder nil. Im letzteren Fall muss man das TImage dann aber im Destruktor händisch freigeben.
|
AW: eigene Klasse; Constructor inkl. TImage
Also ungefär so !?
Klasse TEnemy:
Delphi-Quellcode:
Das AParent übergebe ich, damit das IMAGE auch auf dem FORM angezeigt wird. Aber die erste Zeile des CONSTRUCTORs verstehe ich nicht.
unit enemy;
interface uses ExtCtrls,Classes,Forms,Windows; Type TEnemy = class(TComponent) private enemyimage : TImage; enemyname : string; enemypath : string; enemysize : integer; enemypriority : double; public constructor Create(AParent: TForm; EPath : string; EName: string; ESize: Integer; IHandle : HICON); destructor Destroy;override; property enimage : TImage read enemyimage; property enname : string read enemyname write enemyname; property enpath : string read enemypath write enemypath; property ensize : integer read enemysize write enemysize; property enprior : double read enemypriority write enemypriority; end; TEnemyArray = array of TEnemy; implementation Constructor TEnemy.Create(AParent: TForm; EPath : string; EName: string; ESize: Integer; IHandle : HICON); begin inherited Create(nil); enemyimage := TImage.Create(nil); with enemyimage do begin Parent := AParent; Left := 400; Top := 400; AutoSize := true; Picture.Icon.Handle := IHANDLE; enemyname := EName; enemypath := EPath; enemysize := ESize; end; end; destructor TEnemy.Destroy; begin enemyimage.Free; inherited; end; end.
Delphi-Quellcode:
AParent, so wie vorher geschrieben geht nicht und self auch nicht. Oder ist das mit NIL so richtig?
inherited Create(nil);
|
AW: eigene Klasse; Constructor inkl. TImage
Was heißt denn "geht nicht"? Kommt eine Fehlermeldung? Wenn ja, welche?
|
AW: eigene Klasse; Constructor inkl. TImage
Delphi-Quellcode:
Constructor TEnemy.Create(AOwner:Tcomponent;AParent: TForm; EPath : string; EName: string; ESize: Integer; IHandle : HICON);
begin inherited Create(AOwner); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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