Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sichtbarkeit von Klasseneigenschaft (https://www.delphipraxis.net/129059-sichtbarkeit-von-klasseneigenschaft.html)

firegyver 11. Feb 2009 22:22


Sichtbarkeit von Klasseneigenschaft
 
Hallo liebes Forum,

ich habe vor längerer Zeit eine im Internet gefundene Klasse zum nachträglichen Hinzufügen von OnMouseEnter- und OnMouseLeave-Events für TImage in meinen Quelltext eingebaut. Alles funktionierte wunderbar, bis ich die Strukturen, die die TImage enthalten, in eine neue Unit auslagern musste. Mir kommt es irgendwie so vor, als ob die nachträglich definierten Klasseneigenschaften für TImage nicht mehr sichtbar sind und von der originären TImage-Klasse überlagert werden. Könnt ihr mir da weiterhelfen?
Hier der grobe Quellcode der beiden Units:

Delphi-Quellcode:
unit AppManager;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, IniFiles, Spin, Menus, TypeDef;

type
  TImage = class(ExtCtrls.TImage)
  private
    FOnMouseEnter: TNotifyEvent;
    FOnMouseLeave: TNotifyEvent;
    procedure CMMouseEnter(var Msg: TMessage);message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg: TMessage);message CM_MOUSELEAVE;
  public
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  end;

  TForm1 = class(TForm)
    procedure MapNVisu;
  private
    { Private declarations }
    procedure DoOnEnter(Sender: TObject);
    procedure DoOnLeave(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1           : TForm1;
  ProgTupels     : array of array of TProgTupel_type;

implementation

{$R *.dfm}

procedure TImage.CMMouseEnter(var Msg: TMessage);
begin
  if Assigned(FOnMouseEnter) then
    FOnMouseEnter(self);
  Msg.Result := 0;
end;

procedure TImage.CMMouseLeave(var Msg: TMessage);
begin
  if Assigned(FOnMouseLeave) then
    FOnMouseLeave(self);
  Msg.Result := 0;
end;

procedure TForm1.DoOnEnter(Sender: TObject);
var SenderName : string;
begin
  //dosomething
end;

procedure TForm1.DoOnLeave(Sender: TObject);
var SenderName : string;
begin
  //dosomething
end;

procedure TForm1.MapNVisu;
var r, c : Integer;
begin
    for r := 1 to 10 do
    begin
      for c := 1 to 10 do
      begin
        ProgTupels[r][c].Icon       := TImage.Create(Form1);
        ProgTupels[r][c].Icon.Parent := Self;

        ProgTupels[r][c].Icon.OnMouseEnter := DoOnEnter;
        ProgTupels[r][c].Icon.OnMouseLeave := DoOnLeave;
      end;
    end;
end;

end.
Delphi-Quellcode:
unit TypeDef;

interface

uses
  ExtCtrls, StdCtrls;

type
  TProgTupel_type = record
    ProgID : Integer;
    Icon  : TImage;
    La    : TLabel;
  end;

implementation

end.

Uwe Raabe 12. Feb 2009 07:08

Re: Sichtbarkeit von Klasseneigenschaft
 
Da in der Unit TypeDef noch keine Neudeklaration von TImage zu sehen ist, ist das im Record verwendete TImage natürlich das aus ExtCtrls.

Abhilfe: Lege eine neue Unit (z.B. MyImage.pas) an und verlagere deine TImage-Ableitung dorthin. Dann musst du in überall wo du dein TImage benutzen willst nur MyImage nach ExtCtrls in die Uses-Klausel schreiben.

Eins noch: Da du das TImage nicht registrierst, werden alle TImage, die aus einer DFM geladen werden, dem Typ ExtCtrls.TImage entsprechen und nicht deinem TImage!

Meflin 12. Feb 2009 07:12

Re: Sichtbarkeit von Klasseneigenschaft
 
Oder um dem Problem gleich vorzubeugen, die Klasse anders nennen, z.B. TExtImage oder TMyImage.

Uwe Raabe 12. Feb 2009 08:37

Re: Sichtbarkeit von Klasseneigenschaft
 
Zitat:

Zitat von Meflin
Oder um dem Problem gleich vorzubeugen, die Klasse anders nennen, z.B. TExtImage oder TMyImage.

Grundsätzlich korrekt! Wenn ich aber auch Images in DFM-Dateien mit meinen Erweiterungen beglücken will, kann ich meine Klasse als TImage registrieren und alle TImage-Instanzen auf den Forms sind dann auch von dem neuen Typ. Das kann manchmal echt von Vorteil sein, z.B. wenn ich nicht alle Images in den Forms ersetzen will oder kannn. Man muss allerdings wissen was man tut - wie immer beim Programmieren.

himitsu 12. Feb 2009 08:47

Re: Sichtbarkeit von Klasseneigenschaft
 
Sowas hab ich auch schonmal genutzt, damit ich Änderungen in die VCL reinbekomm, ohne gleich einen neuen Typ zu registrieren.

Du mußt (wie schon sozusagen) erwähnt wurde, überall wo deine Änderung wirksam sein soll deine Klassendefinition vorher einbinden ... also eine Unit erstellen, dort dein TImage definieren und überall wo es benötigt wird deine Unit möglichst als letzes in die Uses-Klausel aufnehmen.

firegyver 13. Feb 2009 17:16

Re: Sichtbarkeit von Klasseneigenschaft
 
Vielen Dank für eure Antworten! Habe es entschärfen können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 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