AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Sichtbarkeit von Klasseneigenschaft

Ein Thema von firegyver · begonnen am 11. Feb 2009 · letzter Beitrag vom 13. Feb 2009
Antwort Antwort
firegyver

Registriert seit: 11. Feb 2009
13 Beiträge
 
#1

Sichtbarkeit von Klasseneigenschaft

  Alt 11. Feb 2009, 22:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.977 Beiträge
 
Delphi 12 Athens
 
#2

Re: Sichtbarkeit von Klasseneigenschaft

  Alt 12. Feb 2009, 07:08
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!
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#3

Re: Sichtbarkeit von Klasseneigenschaft

  Alt 12. Feb 2009, 07:12
Oder um dem Problem gleich vorzubeugen, die Klasse anders nennen, z.B. TExtImage oder TMyImage.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.977 Beiträge
 
Delphi 12 Athens
 
#4

Re: Sichtbarkeit von Klasseneigenschaft

  Alt 12. Feb 2009, 08:37
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.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.097 Beiträge
 
Delphi 12 Athens
 
#5

Re: Sichtbarkeit von Klasseneigenschaft

  Alt 12. Feb 2009, 08:47
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
firegyver

Registriert seit: 11. Feb 2009
13 Beiträge
 
#6

Re: Sichtbarkeit von Klasseneigenschaft

  Alt 13. Feb 2009, 17:16
Vielen Dank für eure Antworten! Habe es entschärfen können.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:05 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