Announcement

Collapse
No announcement yet.

Name des SenderObjects

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

  • Name des SenderObjects

    Hallo,

    ich versuche eine allgemeingültige Funktion zu schreiben uns muss wissen,<BR>
    aus welchem Eingabefeld ich komme. <BR>
    Sender.ClassName liefert mir ja nur TMaskEdit zurück. Ich muss aber <BR>
    wissen wie das Feld heißt.<BR>
    Außerdem möchte ich, das wenn die danach aufgerufene Funktion gescheitert
    <BR> ist, das Eingabefeld nicht verlassen wird (Außer mit Abbruch). <BR>
    Gibt es so eine Art "Return NO-APPLY" wie in bestimmten 4GL-Dialekten ? <BR>
    <BR>
    Danke im voraus für Eure Hilfe !!<BR>
    Viele Grüße<BR>
    Axel

  • #2
    Hi Axel,

    am besten ist es, wenn du eine Typumwandlung auf TComponent oder gleich auf das TMaskEdit machst. Dann hast du vollen Zugriff auf alle properties:

    TMaskEdit(Sender).Name

    und dann, beim Abbruch, die Methode TMaskEdit(Sender).Undo() aufrufst.

    Gruss,
    Marti

    Comment


    • #3
      Hi Stalle,<br>
      <br>
      das hier sollte Dein erstes Problem lösen:<br>
      <br>
      <pre>
      procedure TForm1.MaskEdit1Change(Sender: TObject);
      begin
      if (Sender is TMaskEdit) then
      Begin
      ShowMessage((Sender as TMaskEdit).Name);
      end;
      end;
      </pre>
      <br>
      Die if Abfrage kann man sich sparen, wenn man ganz sicher ist, dass<br>
      die Funktion nur für TMaskEdit genützt wird.<br>
      Da allerdings alle Ereignisse die als Paramter nur Sender haben diese<br>
      Funktion verwenden können, ist das nicht zwingend erforderlich.<br>
      Um die verschiedenen Felder unterscheiden zu können, könntest Du auch<br>
      die Eigenschaft <b>Tag</b> benutzen, die für jede Anwendung zu<br>
      beliebigem Zweck verwendet werden darf.<br>
      <br>
      Wenn Du beispielsweise drei TMaskEdit Felder hast, könntest Du<br>
      <br>
      MaskEdit1.Tag := 1;<br>
      MaskEdit2.Tag := 2;<br>
      MaskEdit3.Tag := 3;<br>
      im Objektinspektor setzen, und dann<br>
      <br>
      <pre>
      Case (Sender as TMaskEdit.Tag) of
      1 : Begin
      // Verarbeitung von MaskEdit1
      end;
      2 : Begin
      // Verarbeitung von MaskEdit2
      end;
      3 : Begin
      // Verarbeitung von MaskEdit3
      end;
      end;
      </pre>
      <br>
      in Deiner Verarbeitungsroutine benutzten.<br>
      Den Zweiten Punkt Deiner Frage hab' ich nicht ganz verstanden<br>
      <br>
      Ciao<br>
      Chri

      Comment


      • #4
        Vielen Dank, Martin und Christian, für Eure Mühe und schnelle Hilfe. Es funzt und langsam <BR>kommt einiges Licht ins Dunkel ;-))<BR>
        <BR>
        gruss Axe

        Comment


        • #5
          Nöö, doch noch nicht so ganz. Nochmal kurz zur Erklärung : <BR>
          Ich hab ein Formular wo 3 Personalnummern eingegeben werden sollen.<BR> Die Verarbeitungsroutine ist identisch und soll als <BR>
          Ergebniss den Personalnamen anzeigen. Das funzt dank Eurer Hilfe <BR>auch Prima. Wird jetzt aber eine ungültige Nummer eingegeben, <BR>
          soll soll das Eingabefeld nicht verlassen werden können, es sei dem <BR>mit Abbruch. <BR><BR>
          Bsp:<BR>
          If Query2.RecordCount = 0 Then<BR>
          Begin<BR>
          ShowMessage('Unbekannte Personalnummer.');<BR>
          TMaskEdit(Sender).Undo();<BR>
          End<BR>
          Else<BR>
          Begin<BR>
          If String(TDBText(Feldname)) = 'DruckerPNR' Then<BR>
          LNameDR.Caption:=Query2.FieldByName('Name').AsStri ng;<BR>
          End;<BR>
          <BR>
          Und das funzt soweit nur TMaskEdit(Sender).Undo() tut schlicht gar <BR>nix. <BR>
          Habt Ihr noch'ne Idee ??<BR&gt

          Comment


          • #6
            Ich kann zwar TMaskEdit(Sender).SetFocus aufrufen und der Eingabe-Focus bleibt auch im entsprechenden Feld, aber eben auch wenn ich den Ende-Button drücken will (was ja auch logisch ist). Kann ich das Irgendwie abfangen ? "Weiß" der EventHandler für OnExit schon, welcher Event folgt bzw. worauf der Focus verschoben wurde ? Ich denke sicher nicht. Die einzige Möglichkeit die ich sehe, wäre mit einem leeren Eingabefeld zu arbeiten und verhindern das die function aufgerufen wird, wenn die Eingabe leer ist. Nur, dann darf Sie ja immer leer sein und das möchte ich auch nicht

            Comment


            • #7
              Hi Axel,<br>
              <br>
              <pre>
              OnExit sollte es 'wissen', und zwar weil VOR dem Eintritt von OnExit
              die Eigenschaft ActiveControl geändert wird.
              Innerhalb von OnExit sollte dies also abzufragen sein, so das klar ist
              wohin der Focus wechseln wird.
              z.b.

              Procedure TForm1.MaskEdit1Exit(Sender : TObject);
              Begin
              // EndeButton ist der Name des Buttons, den Du Ende-Button genannt hast
              If ActiveControl <> EndeButton then
              Begin
              MaskEdi1.SetFocus
              end;
              end;

              Das funktioniert, solange der EndeButton in der Eigenschaft TabOrder
              nicht umittelbar nach bzw. vor dem MaskEdit1 kommt, dann könnte man
              nämlich mit Tab bzw. Shift-Tab auf diesen Button wechseln, und von
              da aus dann, wohin man will.
              </pre>
              Ciao<br>
              Chri

              Comment


              • #8
                Hi Christian,<br>
                genau das habe ich gebraucht !!! <br>
                Vielen Dank für Deine Hilfe.<br>
                Gruss Axe

                Comment

                Working...
                X