Autor Beitrag
Mashalla
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Windows 7 Professional
Delphi 7 Enterprise, Turbo Delphi Explorer 2006
BeitragVerfasst: Mo 01.11.10 21:24 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
{**
* Executes the file dialog and loads the file specific data
*}

procedure TWindow.btOpenClick(Sender: TObject);
const Playlist: Array[0..1of TClass = (TM3U, TPLS);
var
  // data of the loaded file
  Data: TStringList;
  // interator
  I: Integer;
  // instance of the specific class
  Obj: TObject;
begin
  if Window.OpenDlg.Execute then
  begin
    Data := TStringList.Create;
    try
      Data.LoadFromFile(Window.OpenDlg.FileName);

      // loop till the correct object is found
      for I := Low(Playlist) to High(Playlist) do
      begin
        try
          // hier kommt eine Compilermeldung, zu viele Parameter, der TObject Konstruktor hat keine Parameter
          Obj := Playlist[I].Create(Data);  
        except
          Obj.Free;          
          Obj := nil;
        end;
        if Assigned(Obj) then
        exit;
      end;
    finally
      Data.Free;
    end;
  end;
end;


Anbei folgende Prozedur, welche eine Datei lädt. Anschließend wird ein Objekt erstellt, dessen Konstruktor die StringList Data auf ein Dateiformat hin untersucht. Schlägt die Analyse fehl, wird eine Exception geworfen und die Schleife läuft ein weiteres Mal durch. Ich möchte je nach Dateiinhalt das passende Objekt erstellen, aber leider weiß ich nicht genau, wie ich das anstelle. Vielleicht ist mein Ansatz auch falsch.
Ich lade eine Datei und will entsprechend dem Inhalt das passende Objekt erstellen und die Daten weiterverarbeiten. Ich würde gerne massenhaft if-Abfragen vermeiden, da die Liste der Dateitypen länger als 3 oder 4 Elemente werden wird. Ich hoffe, mein Gedankengang wurde klar. Jemand eine Idee? :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 01.11.10 21:29 
Da gibt es verschiedene Ansätze. Einmal das sogenannte Factory-Pattern, bei dem eine Klasse das korrekte Objekt erzeugt.

Ja, und ich mache das in der Regel so, dass ich die Klassen in einer Liste registrieren lasse und dann über die Liste die korrekte Klasse suche.
Durch eine Klassenmethode wird dann festgestellt ob die Klasse die passende ist.

Auf diese Weise muss die Liste nicht die Klassen alle kennen, sondern die Klasse registrieren sich einfach in der Liste.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 02.11.10 23:58 
In Delphi wird häufig auf das Factory-Pattern verzichtet, da man relativ einfach mit den Typen direkt arbeiten kann, die hin- und herschieben kann und Instanzen ohne RTTI/Reflection instanzieren kann.

In deinem Fall musst du einfach darauf achten, dass du in deiner Basisklasse den Konstruktor virtual machst, damit du von einer Variablen von class of Basisklasse den Konstruktor der abgeleiteten Klasse kriegst (vgl. TComponent).
0xDEAD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

Win 7
C# (VS 2010 Professional)
BeitragVerfasst: Mi 03.11.10 11:46 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Ja, und ich mache das in der Regel so, dass ich die Klassen in einer Liste registrieren lasse und dann über die Liste die korrekte Klasse suche.
Durch eine Klassenmethode wird dann festgestellt ob die Klasse die passende ist.

Auf diese Weise muss die Liste nicht die Klassen alle kennen, sondern die Klasse registrieren sich einfach in der Liste.


Hat da jemand mal ein konkretes Beispiel für?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.11.10 11:59 
Ich habe zu Hause eines, bei dem ich ca. 100 Dateitypen für einen allgemeinen Editor aus verschiedenen Units so registriere. Ich schaue nach der Arbeit mal, dass ich daraus ein Beispiel mache. ;-)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 03.11.10 14:05 
Nur als Randbemerkung; Mit DphMEF kann man sowas auch. Ein Beispiel ist dabei. Das DphMEF habe ich aber eher so zum Spass entwickelt. Für Produktivcode würde ich jetzt auch einfach eine Klasse machen mit einer statischen Methode Register und einer statischen Liste (bei neueren Delphi-Versionen class var oder sonst in globalem Scope).

Als Beispiel könntest du dir TPicture.RegisterFileFormat und die Unit Jpeg anschauen.