AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Prüfen, ob eine Klasse eine bestimmte Methode enthält
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen, ob eine Klasse eine bestimmte Methode enthält

Ein Thema von Christian18 · begonnen am 17. Mär 2008 · letzter Beitrag vom 18. Mär 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 18:15
So was gibt es schon. Guck mal hier: http://www.codeproject.com/KB/dotnet/XFormsNET.aspx Hatten wir in der Firma auch mal validiert, allerdings basiert das auf einem Com-Server, der installiert werden muss, aber unsere Anwendung darf nicht installiert werden. Aber eventuell ist es ja was für dich.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#12

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 18:33
Hallo,

ich habe ja oben erzählt, dass ich aus der XML Datei ereignisse zuweisen kann. das funktioniert auch. er findet die onclick methode und führt sie auch aus, wenn ich auf den button clicke. Jetzt wollte ich aber die Button Farbe ändern. Das geht nicht weil eine Exeption kommt. Ich weiß aber nicht warum.

suchen und zuweisung der Methode:
Delphi-Quellcode:
Method.Data:=FMenuBtn[i - 1];
Method.Code:=AClass.MethodAddress(lXml.DocumentElement.ChildNodes[AForm.Name].ChildNodes[i - 1].Attributes['OnClick']);
OnClick:=TNotifyEvent(Method);
Methode:
Delphi-Quellcode:
procedure TFMain.Neu(Sender: TObject);
begin
  MenuActive.Picture.LoadFromFile(Prg.GetAppPath + 'Img\BtnLeave.bmp');

  MenuActive:=TImage(Sender);
end;
XML Datei:

<Item Caption="Neu" OnClick="Neu" /> Achso, der Button ist in wirklichkeit ein TImage, da ich eigene Button habe.

LG Chris
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#13

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 19:25
Hallo,

ich bins nochmal. Ich glaube meine Beschreibung was ein bisschen dürftig, da keine antworten kommen. Ich probiere es einfach nochmal.

Ich habe eine Super Klasse TFMainForm. Diese Enthält alle Grafischen elemente. Dann habe ich eine Klasse TFMain abgeleitet.

Delphi-Quellcode:
type
  TFMainForm = class(TForm)
    PMain: TPanel;
    ITop: TImage;
    IBottom: TImage;
  private
    Prg: TProgram;
    FMenuBtn: Array of TImage;
    FMenuText: Array of TLabel;
    FMenuActive: TImage;
    { Private-Deklarationen }
  public
    procedure CreateMenu(AForm: TForm; AClass : TClass);
    procedure MoveMenu(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure ClickMenu(Sender: TObject);
    procedure LeaveMenu(Sender: TObject);
    property MenuActive: TImage Read FMenuActive Write FMenuActive;
    { Public-Deklarationen }
  end;
Diese Klasse erzeugt auch das Menu, welches ich aus der Xml Datei lade. Diese Klasse wird auch nicht created. Also wird auch nie angezeigt. Angezeigt wird immer nur die TFMain.

Delphi-Quellcode:
type
  TFMain = class(TFMainForm)
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormShow(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Neu(Sender: TObject);
  private
    Prg: TProgram;
    Bg: TBackground;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
Die Methode der Klasse TFMain ruft die Methode CreateMenu der Klasse TFMainForm auf. CreateMenu enthält auch die zuweisung des OnClick ereignisses auf die Images. Die Methoden für die OnClick Ereignisse befinden sich jedoch wieder in der Klasse TFMain.

Und wenn ich nun auf ein Image klicke, soll diese Funktionalität aufgeführt werden:

Delphi-Quellcode:
procedure TFMain.Neu(Sender: TObject);
begin
  MenuActive.Picture.LoadFromFile(Prg.GetAppPath + 'Img\BtnLeave.bmp');

  MenuActive:=TImage(Sender);
end;
Das passiert aber nicht, da eine Exception kommt. Und ich weiss nicht wieso.
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#14

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 20:41
Falls Ihr noch Informationen benötigt, könnt Ihr ruhig fragen. Ich will nicht gleich alles Posten, damit niemand verwirrt wird. Ich denke das ich mit meinen Informationen das Problem recht anschaulich dargestellt habe.

MFG Christian18
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#15

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 20:49
Ok, 2 Sachen wären hilfreich: Was ist das für eine Exception (AV an $000000 oder sonstawas) und in welcher Zeile tritt Sie auf?

  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#16

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 20:52
Hallo,

Fehler:

Zugriffsverletzung bei Adresse 0044048F in Modul 'Proect1.exe'. Lesen von Adresse 00000057.

beim ausführen dieser zeile:

MenuActive.Picture.LoadFromFile(Prg.GetAppPath + 'Img\BtnLeave.bmp');
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#17

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 21:29
Zitat von Christian18:
Zugriffsverletzung bei Adresse 0044048F in Modul 'Proect1.exe'. Lesen von Adresse 00000057.
Das ist nahe Null, also greifst du auf ein nicht initialisiertes Objekt zu.

Und wenn dus mal mit
Delphi-Quellcode:
procedure TFMain.Neu(Sender: TObject);
begin
  MenuActive:=TImage(Sender);
  MenuActive.Picture.LoadFromFile(Prg.GetAppPath + 'Img\BtnLeave.bmp');
end;
probierst?
Ich hab deinen Code jetzt nicht durchschaut, aber wenn es das ist, was ich denke dass es das ist, dann solltest du das Objekt zuweisen bevor du was reinlädtst
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#18

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 21:38
Hallo,

ich denke schon, dass ich das Objekt erzeuge. Bloß an einer anderen Stelle. Nämlich wenn die form erzeugt wird:

FMenuActive ist der Active Button, der leuchten soll.

Delphi-Quellcode:
procedure TFMainForm.CreateMenu(AForm: TForm; AClass : TClass);
  var lXml: TXMLDocument;
      Count: Word;
      i: Word;
      Method: TMethod;
begin
  lXml:=TXMLDocument.Create(Application);
  try
    Prg:=TProgram.Create();
    try
      lXml.LoadFromFile(Prg.GetAppPath() + 'Settings\Menu.xml');

      Count:=lXml.DocumentElement.ChildNodes[AForm.Name].ChildNodes.Count;
      SetLength(FMenuBtn, Count);
      SetLength(FMenuText, Count);
      for i:=1 to Count do
        begin
          FMenuBtn[i - 1]:=TImage.Create(AForm);
          FMenuText[i - 1]:=TLabel.Create(AForm);

          with FMenuBtn[i - 1] do
            begin
              Name:='IItem' + IntToStr(i);
              Width:=100;
              Height:=75;
              Left:=PMain.Width - Count * Width - (Count - 1) * 8 + (i - 1) * Width + (i - 1) * 8;
              Top:=0;
              if i = 1 then
                begin
                  Picture.LoadFromFile(Prg.GetAppPath() + 'Img\BtnMove.bmp');
                  FMenuActive:=FMenuBtn[i - 1];
                end
              else
                begin
                  Picture.LoadFromFile(Prg.GetAppPath() + 'Img\BtnLeave.bmp');
                end;

              Method.Data:=FMenuBtn[i - 1];
              Method.Code:=AClass.MethodAddress(lXml.DocumentElement.ChildNodes[AForm.Name].ChildNodes[i - 1].Attributes['OnClick']);
              OnClick:=TNotifyEvent(Method);

              OnMouseMove:=MoveMenu;
              OnMouseLeave:=LeaveMenu;

              Parent:=PMain;
            end;

          with FMenuText[i - 1] do
            begin
              Name:='LItem' + IntToStr(i);
              Left:=FMenuBtn[i - 1].Left + 4;
              Top:=57;
              Caption:=lXml.DocumentElement.ChildNodes[AForm.Name].ChildNodes[i - 1].Attributes['Caption'];
              Transparent:=True;

              Method.Data:=FMenuBtn[i - 1];
              Method.Code:=AClass.MethodAddress(lXml.DocumentElement.ChildNodes[AForm.Name].ChildNodes[i - 1].Attributes['OnClick']);
              OnClick:=TNotifyEvent(Method);

              OnMouseMove:=MoveMenu;
              OnMouseLeave:=LeaveMenu;

              Parent:=PMain;
            end;
        end;
    finally
      Prg.Free();
    end;
  finally
    lXml.Free();
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#19

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 21:45
Hmmm ... also wie gesagt, ich steig da nicht ganz durch (habs ja auch nicht programmiert )

Aber du kannst ja bis zu der Zeile Debuggen und dann herausfinden, was da genau auf nil zeigt (entweder mit den Hints, mit den Watches oder mit F7 )

Wie ich Fehler so kenne, macht es danach wahrscheinlich gar nichts mehr statt der AV
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#20

Re: Prüfen, ob eine Klasse eine bestimmte Methode enthält

  Alt 17. Mär 2008, 22:10
Hallo,

ich habe gerade mal getestet, ob FMenuActive überhaupt assigned ist. da bin ich auf was merkwürdiges gestoßen.

in der methode CreateMenu ist es Assigned.

Und in der erbenden Klasse nicht mehr. Hat jemand ne idee woran das liegen könte?

LG Chris
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 17:04 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