AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

eigene Klasse; Constructor inkl. TImage

Ein Thema von Deinhaus · begonnen am 22. Jun 2010 · letzter Beitrag vom 23. Jun 2010
Antwort Antwort
Seite 1 von 2  1 2      
Deinhaus

Registriert seit: 31. Jan 2008
12 Beiträge
 
#1

eigene Klasse; Constructor inkl. TImage

  Alt 22. Jun 2010, 22:56
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:
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.
Da wo die Fragezeichen stehen habe ich schon alles mögliche ausprobiert (self) (TImage) (TEnemy) (TCompontent(TImage))

Kann mir vielleicht jemand nen Tipp geben, mit dem ich weiter basteln und testen kann?

Gruß
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: eigene Klasse; Constructor inkl. TImage

  Alt 22. Jun 2010, 23:03
Du musst für TEnemy die passende Basisklasse verwenden:

 Type TEnemy = class(TComponent) Und realisiere image : TImage als read-only-property um klar zu machen das dieses nicht von aussen gesetzt werden kann.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Deinhaus

Registriert seit: 31. Jan 2008
12 Beiträge
 
#3

AW: eigene Klasse; Constructor inkl. TImage

  Alt 22. Jun 2010, 23:50
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:
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;
und die Prozedur:
Delphi-Quellcode:

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;
Zu dem nicht funktionieren CONSTRUCTOR kommt auch noch, die Frage, ob ich EnemyArray[I].enemyimage.Picture.Icon.Handle auch beim Create zuweisen kann ? Also quasi das Handle bei Instanziierung übergeben.

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

Geändert von Deinhaus (23. Jun 2010 um 00:04 Uhr) Grund: add -> Fehlermeldung
  Mit Zitat antworten Zitat
Deinhaus

Registriert seit: 31. Jan 2008
12 Beiträge
 
#4

AW: eigene Klasse; Constructor inkl. TImage

  Alt 23. Jun 2010, 00:42
Habs gelöst !!

Klasse:
Delphi-Quellcode:
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.
Procedure:
Delphi-Quellcode:
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;
Gruß
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

AW: eigene Klasse; Constructor inkl. TImage

  Alt 23. Jun 2010, 09:58
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: eigene Klasse; Constructor inkl. TImage

  Alt 23. Jun 2010, 10:02
Also am Anfang des Konstruktor einfach den der Superklasse aufrufen

inherited Create( AParent);
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: eigene Klasse; Constructor inkl. TImage

  Alt 23. Jun 2010, 10:10
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Deinhaus

Registriert seit: 31. Jan 2008
12 Beiträge
 
#8

AW: eigene Klasse; Constructor inkl. TImage

  Alt 23. Jun 2010, 13:20
Also ungefär so !?

Klasse TEnemy:
Delphi-Quellcode:
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.
Das AParent übergebe ich, damit das IMAGE auch auf dem FORM angezeigt wird. Aber die erste Zeile des CONSTRUCTORs verstehe ich nicht.inherited Create(nil); AParent, so wie vorher geschrieben geht nicht und self auch nicht. Oder ist das mit NIL so richtig?
Daniel Einhaus
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

AW: eigene Klasse; Constructor inkl. TImage

  Alt 23. Jun 2010, 13:34
Was heißt denn "geht nicht"? Kommt eine Fehlermeldung? Wenn ja, welche?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: eigene Klasse; Constructor inkl. TImage

  Alt 23. Jun 2010, 13:46
Delphi-Quellcode:
Constructor TEnemy.Create(AOwner:Tcomponent;AParent: TForm; EPath : string; EName: string; ESize: Integer; IHandle : HICON);
begin
  inherited Create(AOwner);
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz