Autor Beitrag
DerSascha
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 18.08.04 11:28 
Hallo,

ich habe folgendes Problem mit ASP.NET unter Delphi:
Es gibt zwei User Controls (Klassen) die über die gleichen Properties verfügen. Nun möchte ich mit dem gleichen Codeblock beide Controls behandeln und nicht extra auf jede einzelne Klasse eingehen.

ausblenden volle Höhe 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:
38:
//  dyncontr ist ein Control
//    dyncontr: Control;

      controllist := ArrayList.Create;
      for i := 0 to dstestdaten.Tables[0].Rows.Count-1 do
      begin
        if ((i mod 2) =0) then
          dyncontr := Page.LoadControl('Karte.ascx')
        else
          dyncontr := Page.LoadControl('Karte2.ascx');

//  Gibt Übersetzungfehler: unbekannter Bezeichner,
//  dennoch gibt ein dyncontr.ClassName jeweils die zugehörigen
//  Klassen TKarte (Karte.ascx) bzw. TKarte2 (Karte2.ascx) aus.
//  Gut, andererseits gibt laut Deklaration die Funktion
//  LoadControl eigentlich nur eine Basisklasse Control zurück.

//      dyncontr.LinksOben :=
//        dstestdaten.Tables[0].Rows[i].Item[0].ToString;

//  Das funktioniert für den ersten Fall, in dem ich dem Compiler
//  explizit sage, es handle sich um die Klasse TKarte; für TKarte2
//  geht das halt nicht.

        TKarte(dyncontr).LinksOben :=
          dstestdaten.Tables[0].Rows[i].Item[0].ToString;


//  Solche seltsamen Versuche fruchten auch nicht. Ausgangspunkt war,
//  ClassName meldet die korrekte Klasse und man muss dyncontr nur zu
//  seinem Glück überreden.

//      (dyncontr as dyncontr.ClassType).LinksOben :=
//        dstestdaten.Tables[0].Rows[i].Item[0].ToString;

        controllist.Add(dyncontr);
        platzhalter.Controls.Add(Control(controllist.Item[i]));
      end;




Ich brauche -glaube ich- so etwas wie ein "dynamic typecast"(?).
Die 'Reflection API' scheint auch eine Möglichkeit, allerdings
ist der Aufruf über die Methode InvokeMember etwas länglich und
zum Laufen bekommen habe ich das mit dieser Möglichkeit auch noch
nicht. Eine andere Möglichkeit, die ich noch in Betracht ziehe, ist
das Erstellen eines Interface; ich weiss allerdings nicht, ob das
mit User Controls funktioniert, noch glaube ich wäre es für dieses
kleine Beispiel sinnvoll.

Ich bin für jeden :flehan: Hinweis dankbar.

Gruß,
Sascha