AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Auf Methoden einer Form zugreifen die über TFormClass erzeug
Thema durchsuchen
Ansicht
Themen-Optionen

Auf Methoden einer Form zugreifen die über TFormClass erzeug

Ein Thema von Sharky · begonnen am 29. Mär 2005 · letzter Beitrag vom 5. Apr 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#1

Auf Methoden einer Form zugreifen die über TFormClass erzeug

  Alt 29. Mär 2005, 10:19
Hai,

ich "spiele" eben etas mit TFormClass.
Meine Forms (TForm2 und TForm3) haben beide eine Methode .SetLabelText. Gibt es eine andere Möglichkeit auf diese von meiner Form1 zugreifen zu können als wie so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  newFormClass : TFormClass;
  newForm : TForm;
begin
  Case (Sender AS TButton).Tag of
    0 : newFormClass := TForm2;
    1 : newFormClass := TForm3;
  end;
  newForm := newFormClass.Create(self);
  try
    if (newFormClass = TForm2) then
    begin
      (newForm as TForm2).SetLabelText('Form 2');
    end
    else
    begin
      (newForm as TForm3).SetLabelText('Form 3');
    end;

    // newForm.SetLabelText ('*blubb das geht nicht*');

    newForm.ShowModal;
  finally
    FreeAndNil (newForm);
  end;
end;
Das Projekt hänge ich mal an.
Angehängte Dateien
Dateityp: zip formclass_200.zip (11,6 KB, 7x aufgerufen)
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Auf Methoden einer Form zugreifen die über TFormClass er

  Alt 4. Apr 2005, 16:51
Zitat von Sharky:
ich "spiele" eben etas mit TFormClass.
Meine Forms (TForm2 und TForm3) haben beide eine Methode .SetLabelText. Gibt es eine andere Möglichkeit auf diese von meiner Form1 zugreifen zu können als wie so:
1.) die Methode muss im published sein. Normalerweise werden nur Properties und Event published gemacht.
2.) die Methode wird dynamisch mit Hilfe von RTTI aufgerufen:

Delphi-Quellcode:
type
   // alle SetLabelText Methoden müssen diese Signatur haben
   TMySpecialMethode = procedure(const data:string) of object;

   procedure CallMySpecialProc(comp: TComponent; const data:string);
   var
      m: TMySpecialMethode;
   begin
      TMethod(m).Data := comp;
      TMethod(m).Code := comp.MethodAddress('SetLabelText');

      if( TMethod(m).Code <> nil )then
      begin
        m(data); // der Aufruf
      end
      else
      begin
         LogMsg('CallMySpecialProc - %s (%s) has no SetLabelText procedure',[comp.Name,comp.ClassName]);
      end;
   end;
Alternativ kann man auch mit Interfaces arbeiten, da sich damit eine Art von Mehrfachvererbung erreichen lässt.
Andreas
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#3

Re: Auf Methoden einer Form zugreifen die über TFormClass er

  Alt 5. Apr 2005, 07:23
Hallo Sharky,

erstelle ein Interface mit den benötigten Methoden, die Du von beiden voneinander unabhängigen Klassen erwartest und sprich die Exeplare über eben dieses an.

EDIT: Namen geändert
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Auf Methoden einer Form zugreifen die über TFormClass er

  Alt 5. Apr 2005, 07:27
Oder definiere eine Zwischenformularklasse:

Delphi-Quellcode:
type
  TBaseForm = class(TForm)
  public
    procedure SetLabelText; virtual; abstract;
  end;

  TForm2 = class(TBaseForm)
  public
    procedure SetLabelText; override;
  end;

  TForm3 = class(TBaseForm)
  public
    procedure SetLabelText; override;
  end;
und in deiner Funktion
  newForm: TBaseForm;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Auf Methoden einer Form zugreifen die über TFormClass er

  Alt 5. Apr 2005, 07:39
Zitat von shmia:
1.) die Methode muss im published sein. Normalerweise werden nur Properties und Event published gemacht.
Hai shmia,
dei Methode war nur ein Beispiel. Bei einem Propertie habe ich ja genau das selbe Problem. Ich werde mir deinen Vorschlag mal ansehen.
Mit Interfaces habe ich noch nicht gearbeitet. Wäre also ein guter Grund mich damit zu beschäftigen

Zitat von choose:
Hallo sakura,
*sich umguckt* Wo ist denn die DP-Katze in diesem Thread

@Bernhard:
Auch deinen Vorschlag werde ich mir ansehen.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#6

Re: Auf Methoden einer Form zugreifen die über TFormClass er

  Alt 5. Apr 2005, 07:46
Ich glaube, dass der Beste weg über den gemeinsamen Vorfahren ist, wobei die Variante über die RTTI natürlich nett ist Wobei es Probleme gibt, wenn sich dort die Parameter ändern. Dann dürftest du mit AV beglückt werden, wenn du nicht dran denkst, die Aufrufe anzupassen. Auf den Prüfen, den Compiler, muss man da leider verzichten.
Interfaces ist auch ne nette Lösung, läuft aber auf das gleiche wie den gemeinsamen Vorfahren hinaus.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Auf Methoden einer Form zugreifen die über TFormClass er

  Alt 5. Apr 2005, 07:57
Zitat von Bernhard Geyer:
...
und in deiner Funktion
  newForm: TBaseForm;
Hai Bernhard,

ich habe das jetzt mal versucht allerdings kommt in dieser Zeile:
newForm := newFormClass.Create(Self); die Meldung:
Zitat:
Inkompatible Typen: 'TBaseForm' und 'TForm'
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Auf Methoden einer Form zugreifen die über TFormClass er

  Alt 5. Apr 2005, 08:04
Dann definiere noch:

Delphi-Quellcode:
type
  TBaseFormClass = class(TBaseForm);

var
  newFormClass : TBaseFormClass;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#9

Re: Auf Methoden einer Form zugreifen die über TFormClass er

  Alt 5. Apr 2005, 08:24
Hallo Sharky,

vielleicht ist meine Ausführung etwas zu knapp gewesen. Die Lösung über RTTI ist fehlerträchtig, weil nicht Typsicher. Die Lösung mit der Vererbungshierarchie zwingt Dich zur Einhaltung einer Linie, die nicht unbedingt gewollt ist, wenn Du über Fabriken Exemplare von Klassen erzeugst, die von einander unabhängig sein können- wie in Deinem Beispiel.
Der Ansatz über Typpürfungen ist deshalb unelegant, weil Du an jeder Stelle an der Du mit unterschiedlichen Klassen arbeitest über jede Klasse prüfen müsstest.

Deshalb mein Vorschlag, Interfaces, hier zB:
Delphi-Quellcode:
type
  IMyInterface = Interface
  ['{70EA899F-F97B-4F8E-9C9E-1C3EF3718EE7}']
    procedure SetLabelText(const AText: string);
  end;
zu verwenden und die Deklaration Deiner Formulare entsprechend zu erweitern
Delphi-Quellcode:
type
  TForm2 = class(TForm, IMyInterface)
  protected
    procedure SetLabelText(const AText: string);
der Code innerhalb des Buttons könnte dann so aussehen:
Delphi-Quellcode:
[..]
  newForm := newFormClass.Create(self);
  try
    //ohne Wissen der konkreten Klasse kann die Methode über
    //das Interface verwendet werden
    if newForm.GetInterface(IMyInterface, myRef) then
      myRef.SetLabelText('AText');

    newForm.ShowModal;
  finally
    FreeAndNil (newForm);
  end;
Vielleicht hilft Dir in diesem Zusammenhang auch das Bei Google suchenfactory pattern oder, zur Vermeidung von Interfaces das Bei Google suchenvisitor pattern der GoF weiter.
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Auf Methoden einer Form zugreifen die über TFormClass er

  Alt 5. Apr 2005, 08:27
Zitat von Bernhard Geyer:
Dann definiere noch:...
Heute scheint nicht mein Tag zu sein

Jetzt bekomme ich hier:
newFormClass := TForm2;
Zitat:
Inkompatible Typen: 'TBaseFormClass' und 'Class reference'
Ich hänge den jetzigen Stand des TestProjektes noch einaml an.
Angehängte Dateien
Dateityp: zip formclass_136.zip (12,6 KB, 5x aufgerufen)
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  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 22:16 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