Announcement

Collapse
No announcement yet.

AS-Operator

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • AS-Operator

    Weshalb ist folgende Abfrage sinnlos?
    if (sender as tedit).Name <>'Test' then...

  • #2
    Definiere "sinnlos"

    procedure TForm1.btnClick(Sender: TObject);
    begin
    (sender as tbutton).caption := 'Hallo';
    end;

    Klappt für einen Button einwandfrei.

    BYE BERN

    Comment


    • #3
      Hallo Bernd,
      ich erhalte bei dem genannten Ausdruck die Fehlermeldung:
      invalid class typecast. Kann damit leider nichts anfangen.
      Gruß
      Ud

      Comment


      • #4
        Wenn Sender kein TEdit oder eine abgeleitete Klasse ist geht nunmal der Cast nicht und da es sich bei AS um einen Cast mit Typüberprüfung handelt bekommst Du eine Exception

        Comment


        • #5
          Kann ich dies umgehen

          Comment


          • #6
            if (sender is TEdit) then
            if (sender as tedit).Name <> 'Test' then ..

            Comment


            • #7
              Das ist nun dann doch unsinnig.
              Wenn man schon auf den Typ mit is prueft dann kann man doch danach einen harten Typecast ohne as machen. is und as sind aufwaendige Operationen.
              Alternativ kann man mit try except die Exception von as abfangen

              Comment


              • #8
                Was ist besser a, b oder c?
                a
                try
                if (sender as tedit).Name <> 'Test' then ...
                ...
                except
                end;

                b
                if (sender is TEdit) then
                if TEdit(Sender).Name <> 'Test' then

                c
                if (sender is TComponent) then
                if (sender as tedit).Name <> 'Test' then ..

                Comment


                • #9
                  Hallo!

                  a) Exceptions bäh...
                  b) geht
                  c) Roberts Kommentar noch mal lesen

                  if (sender is tcomponent) then
                  if tcomponent(sender).name <> 'Test' then

                  tuts doch und ist relativ allgemeingültig..

                  Nur so aus Neugier was solls denn mal werden?

                  BYE BERN

                  Comment


                  • #10
                    Nochmals zurück zur Frage von Udo: "Weshalb ist folgende Abfrage sinnlos?
                    if (sender as tedit).Name <>'Test' then..."

                    Wenn sender nicht vom Typ TEdit oder ein Nachkomme von TEdit ist, dann kann nicht gecastet werden.
                    Es muß deshalb vorher der Typ abgeprüft werden.

                    Die Lösung von Bernd: "if (sender is tcomponent) then
                    if tcomponent(sender).name <> 'Test' then" ist dann die allgemein gültigste. Denn TEdit und andere Komponenten sind von TComponent abgeleitet.

                    Hallo Udo hat Dir das geholfen

                    Comment


                    • #11
                      if (sender as tedit).Name <>'Test' then..."
                      Der eigentliche Unsinn dabei ist das man recht umstaendlich (und mit as aufwaendig) abprueft.
                      if Sender <> EditTest then ..
                      Es ist einfacher diesen einfachen Pointer-Vergleich mit der Komponente selbst zu machen. Es ist auch besser. Es koennen mehrere Komponenten den Namen 'Test' haben. Wer einen Handler schreibt der so etwas macht, der schreibt ein schwer verstaendliches und damit schwer wartbares Program

                      Comment


                      • #12
                        Vielen Dank, mehr Hilfe kann man nicht erwarten

                        Comment

                        Working...
                        X