Announcement

Collapse
No announcement yet.

SetFocus

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

  • #16
    Hi Carsten, <br>
    &lt;nitpicking&gt;
    <ul>
    <li><tt>if bMarkieren = False then</tt> ist evil. Das muss <tt>if not bMarkieren then</tt> heißen -
    ist schöner :-) und richtiger. Bei manchen booleschen Typen (LongBool etc. - Rückgabewert vieler
    API-Funktionen) funktioniert deine Variante nicht zuverlässig.
    <li>Nimm Edit1.SelectAll.
    <li>Noch besser: Lass das Verhalten der Editbox, wie es ist, nämlich standardkonform. :-)
    Wenn der Benutzer den ganzen Edit-Text selektieren will, kann er das nämlich bei Standard-Edits
    locker tun: Doppelklick oder Kontextmenü -> Alles markieren oder per Lasso-/Drag-Selektion usw.
    Umgedreht dürfte dein Vorgehen das gezielte Selektieren eines <i>Teils</i> des Textes aushebeln.
    </ul>
    &lt;/nitpicking&gt;

    <p><i>Was ich noch nicht verstehe ist, warum der Code des OnClick-Events nicht beim OnEnter-Event funktioniert.
    </i><br>
    Ich hab jetzt nicht groß nachgeschaut, aber ich vermute mal, dass Windows,
    nachdem es (indirekt, via VCL) deinen OnEnter-Handler aufgerufen hat, mit
    seinem normalen Vorgehen bei einem Fokuswechsel weitermacht und dabei
    die Selektion des angeklickten Edits verändert.
    Das OnClick-Ereignis kommt vermutlich später.
    <p>Wenn es dich näher interessiert, kannst du mal beiden Handler mit OutputDebugString-Aufrufen
    o.ä. spicken.
    <p>Ciao, Uli

    Comment


    • #17
      Hallo,

      der Code funktioniert sehr wohl im OnEnterEvent, wenn du dort mal die Länge der Selection abfragst.
      Anscheinend wird die Selection dann aber gleich wieder übergebügelt, ich nehme an, durch den Mausclick. Mausclick in ein invertiertes Feld hat ja zur Folge, dass die Invertierung verschwindet...

      Leider ist mir auch noch nichts eingefallen, um dass zu verhindern.

      Du könntest aber mit den Tags arbeiten, wenn Du die globale Variable vermeiden willst.

      Ausserdem könntest Du SelectAll benutzen, dass ist dann noch ein bisschen kürzer...

      Grüße
      Juli

      Comment


      • #18
        @Ulrich:
        > if bMarkieren = False then ist evil. Das muss if not bMarkieren then heißen ....

        Warum soll die Variante nicht funktionieren. Vielleicht nicht, wenn ich andere API-Funktionen benutze, die ein LongBool haben. Aber in meinem eigenen Programm sehe ich kein Problem bezüglich Zuverlässigkeit.

        >Nimm Edit1.SelectAll.
        Gemacht.

        >Noch besser: Lass das Verhalten der Editbox, wie es ist, nämlich standardkonform...
        Der Benutzer wünschte dieses Verhalten und es klappt ja ganz gut durch die Boolean-Abfrage. Das gezielte Selektieren ist ebenfalls weiterhin möglich. Halt eine "Verbesserung" der Standard-Einstellung in diesem Fall.

        >Wenn es dich näher interessiert, kannst du mal beiden Handler mit OutputDebugString-Aufrufen o.ä. spicken.
        Klar interessiert mich das, aber wie mache ich so etwas. Hast Du ein Code-Beispiel ?

        @Julia:
        Vielen Dank auch für Deine Tips. Besonders gut gefallen hat mir die Variante mit den Tags. Dann kann man sich die Boolean-Variablen sparen. Funktioniert auch wunderbar, wie ich gerade getestet habe. "SelectAll" habe ich ebenfalls mitgeändert.

        >der Code funktioniert sehr wohl im OnEnterEvent, wenn du dort mal die Länge der Selection abfragst.
        Richtig, aber das Verhalten ist nicht so wie es gewünscht war. Wäre cool, wenn man es im "OnEnterEvent" schaffen würde, die Invertierung nicht verschwinden zu lassen.

        Grüsse,
        Carste

        Comment


        • #19
          <i>Warum soll die Variante nicht funktionieren. Vielleicht nicht, wenn ich andere API-Funktionen benutze, die ein LongBool haben. Aber in meinem eigenen Programm sehe ich kein Problem bezüglich Zuverlässigkeit.</i><br>
          Na ja, wenn du nur den normalen Boolean-Typ nimmst und weder du noch die verwendeten
          Bibliotheken Sauereien (Byte nach Boolean casten etc.) treiben, ist's wohl nur
          Geschmacksfrage. Andererseits: Bevor ich mir <i>potentiell</i> gefährliche Sachen
          angewöhne, nimm ich lieber die sichere Variante, wenn's sonst nicht viel kostet.

          <i>Der Benutzer wünschte dieses Verhalten</i><br>
          Jaja, die Benutzer haben manchmal komische Vorstellungen, von
          denen sie nicht lassen wollen. :-)

          <i>Wenn es dich näher interessiert, kannst du mal beiden Handler mit OutputDebugString-Aufrufen o.ä. spicken. Klar interessiert mich das, aber wie mache ich so etwas. Hast Du ein Code-Beispiel ?</i><br>
          Fertig nicht, aber ich meine sowas:
          <pre>
          <code><font size=3 face="Courier New"><font color="#000000"><b>procedure </b>ODSFmt(<b>const </b>s: <b>string</b>; <b>const </b>Args: <b>array of const</b>);
          <b>begin
          </b>OutputDebugString(PChar(Format(s, Args)));
          <b>end</b>;
          <br>
          <b>procedure </b>TForm1.Edit1Enter(Sender: TObject);
          <b>begin
          </b>ODSFmt(<font color="#FF00FF">'Vor TForm1.Edit1Enter: %d %d'</font>, [Edit1.SelStart, Edit1.SelLength]);
          <br>
          bMarkieren := False;
          <br>
          ODSFmt(<font color="#FF00FF">'Nach TForm1.Edit1Enter: %d %d'</font>, [Edit1.SelStart, Edit1.SelLength]);
          <b>end</b>;
          <br>
          <b>procedure </b>TForm1.Edit1Click(Sender: TObject);
          <b>begin
          </b>ODSFmt(<font color="#FF00FF">'Vor TForm1.Edit1Click: %d %d'</font>, [Edit1.SelStart, Edit1.SelLength]);
          <br>
          <b>if not </b>bMarkieren <b>then
          begin
          </b>Edit1.SelectAll;
          bMarkieren := True;
          <b>end</b>;
          <br>
          ODSFmt(<font color="#FF00FF">'Nach TForm1.Edit1Click: %d %d'</font>, [Edit1.SelStart, Edit1.SelLength]);
          <b>end</b>;
          </font>
          </code></pre>
          Wenn du jetzt, während du ins Edit1 klickst, das Ereignisprotokoll in Delphi beobachtest, kannst du
          zuschauen, wie sich Edit1.SelStart und Edit1.SelLength im Laufe der Zeit ändern.

          <i>Halt eine "Verbesserung" der Standard-Einstellung in diesem Fall.</i><br>
          "Verbesserung"? Bsp: In meinem Edit steht Edit1. Jetzt drücke ich mit der Maus
          vor dem d, ziehe die Maus hinter das d und lasse die Maustaste los -
          schon hab ich ein d selektiert. Und jetzt kommst du mit deinem SelectAll daher. :-)
          <p>Nix für ungut,<br>Uli

          Comment


          • #20
            Hallo Ulrich,

            danke für Deinen Tip mit dem OutputDebugString. Er ist ganz nützlich und ich kann ihn bestimmt auch gut für andere Dinge verwenden.

            Habe es gerade ausprobiert und festgestellt, das bei beiden Varianten (OnClick bzw. OnEnter) die Selektierung stattfindet. Beim OnEnter-Event wird lediglich noch die Invertierung übergebügelt, wie Julia bereits erwähnt hat.

            >>Halt eine "Verbesserung" der Standard-Einstellung in diesem Fall.
            >"Verbesserung"? Bsp: In meinem Edit steht Edit1. Jetzt drücke ich mit der Maus vor dem d, ziehe die Maus hinter das d und lasse die Maustaste los - schon hab ich ein d selektiert. Und jetzt kommst du mit deinem SelectAll daher. :-)

            Habe "Verbesserung" extra in Anführungszeichen gesetzt, da diese Aussage als subjektiv empfunden wird. So etwas ist ja nur Definitionssache. Richtige Vorgehensweise für diese neue TEdit-Variante:
            1. Irgendwo ins TEdit-Feld klicken
            2. Den Bereich markieren, den Du mochtest, also vor dem d bis nach dem d

            Praktischer Anwendungsfall dieses TEdits:
            In dem Edit, das nur Zahlenwerte aufnimmt, steht vor Eingabe "0,00". Da der Benutzer in nahezu allen Fällen den Zahlenwert ändert, ist es für ihn einfacher, bei einem Mausklick in dieses Feld alles markiert zu haben, um somit direkt den neuen Zahlenwert einzutragen. Aber jetzt kommst Du daher und sagst, der User solle unbedingt mit einem Doppelklick in das Feld klicken. )

            Viele Grüsse,
            Carsten

            P.S.: Habe soeben noch eine interessante Feststellung gemacht. Wenn ich mir mit Showmessage vor und nach dem "SelectAll"-Befehl die Werte von SelStart und SelLength anzeigen lasse, ist die Markierung noch aktiv nach Wegklicken der Bildschirmmeldung. Dies kann man nachvollziehen, wenn man mit die Maus über das Edit-Feld zieht

            Comment

            Working...
            X