Announcement

Collapse
No announcement yet.

Wie funktioniert eine ComboBox?

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

  • Wie funktioniert eine ComboBox?

    Hallo Welt, hallo Delphianer!</P>
    <P>Ich ben&ouml;tige eine spezielle (immer wieder verwendbare) ComboBox und
    frage mich, wie die ComboBox &quot;mitbekommt&quot;, da&szlig; der Anwender mit
    der Maus au&szlig;erhalb der ComboBox (also nicht auf die Eingabezeile, den
    Schalter und nicht auf die ge&ouml;ffnete ListBox) geklickt hat, um die ListBox
    schlie&szlig;en zu k&ouml;nnen.</P>
    <P>Freilich m&uuml;&szlig;te ich mir hier&uuml;ber keine Gedanken machen, wenn
    ich einen Nachkommen von TCustomComboBox verwenden w&uuml;rde. Aber in meinem
    Fall tue ich mich leichter, wenn ich die ComboBox mittels eines Frames
    nachbilde, der die erw&auml;hnten Controls wie Eingabezeile etc. enth&auml;lt.
    Das Problem bleibt das gleiche: Wie erf&auml;hrt der Frame, da&szlig; mit der
    Maus au&szlig;erhalb seines Bereichs geklickt wurde?</P>
    <P>Besten Dank f&uuml;r Euere Anregungen.</P>
    <P>Wolfgang.

  • #2
    Hallo Wolfgang,<p>
    eine ganz spontane Antwort, ohne den Quelltext von TComboBox analysiert zu haben.<br>
    In dem Moment, wo auf irgend ein anderes Element außerhalb der ComboBox geklickt wird, verliert die ComboBox den Fokus. D.H. sie bekommt eine entsprechende Nachricht und reagiert entsprechend darauf. Wenn die Listbox geöffnet, so wird sie nun geschlossen.<p>
    Gruß<p>
    Wolfgang Rolle

    Comment


    • #3
      <P>Hallo Wolfgang (Roller),</P>
      <P>besten Dank f&uuml;r Deinen Hinweis. Dein L&ouml;sungsvorschlag setzt
      voraus, da&szlig; die Listbox den Fokus verliert, indem ich auf ein anderes
      Control im Formular klicke (z. B. auf ein Editfeld oder auf einen Radiobutton),
      das dann den Fokus erh&auml;lt. In diesem Fall kann ich &uuml;ber das
      OnExit-Ereignis der Listbox die Listbox schlie&szlig;en, bevor der Fokus
      weitergegeben wird.</P>
      <P>Was aber, wenn ich auf das Formular selbst, auf ein Panel, auf die Toolbar
      etc. klicke. Auch in diesem Falle w&auml;re es w&uuml;nschenswert, wenn sich
      die Listbox (der Combobox) schlie&szlig;en w&uuml;rde. Nur verliert in diesen
      F&auml;llen die Listbox offenbar nicht den Fokus und folglich wird auch das
      OnExit-Ereignis nicht ausgel&ouml;st.</P>
      <P>Eine Notl&ouml;sung w&auml;re zwar, wenn ich im OnClick-Ereignis des
      Formulars, des Panels etc. das Schlie&szlig;en der Listbox veranlassen
      w&uuml;rde. Aber das ist mitunter nicht praktikabel und vor allem nicht im
      Sinne einer allgemein verwendbaren Komponente bzw. eines Frames.</P>
      <P>Ich besitze zwar den Sourcecode von TComboBox, mu&szlig; aber gestehen,
      da&szlig; ich dennoch nicht &quot;dahintersteige&quot;, wie es die ComboBox
      schafft, sich zu schlie&szlig;en, wenn der Anwender irgendwo au&szlig;erhalb
      ihres Bereichs klickt.</P>
      <P>Gibt es einen allgemein g&uuml;ltigen L&ouml;sungsansatz? Besten Dank und
      viele Gr&uuml;&szlig;e</P>
      <P>Wolfgang.</P&gt

      Comment


      • #4
        Hallo Wolfgang!

        Im Quellcode der VCL wirst Du nicht fündig werden, da TCustomCombobox lediglich einen Wrapper um die Windowsfenster-Subklasse COMBOBOX darstellt. Diese Klasse macht die ganze Arbeit, Delphi reicht nur Messages weiter und verbirgt auch viel zu oft einige der Features, die Windows von Hause aus bietet.

        Die Nachricht, die Du verarbeiten musst, lautet WM_CAPTURECHANGED. Diese wird immer dann an Dein Fenster gesendet, wenn mit der Maus irgendwoanders hingeklickt wird. Der Focus geht dadurch nicht notwendigerweise verloren!

        Ich möchte Dir aber davon abraten, alles von Hand zu proggen, versuch lieber die Windows-Combobox an Deine Ansprüche anzupassen (OwnerDraw?!).

        Viele Grüsse

        OLL

        Comment


        • #5
          Hallo Olli,<br>
          ich habe ein Problem mit <b>WM_CAPTURECHANGED</b>. Es funktioniert nicht.<br>
          D.h. die Botschaft kommt bei der Listbox nicht an. Wenn ich die Botschaft im Formular abfange,<br>
          kann ich darauf reagieren. Dann verschwindet die Listbox jedoch nur, wenn ich auf das Formular <br>
          klicke. In der Win32 Referenz steht, das WM_CAPTURECHANGED an das Fenster gesendet wird,<br>
          dass den Mausfang verliert. Aber scheinbar wird es an Fenster gesendet, das den Mausfang erhält.<br>
          <pre>
          <font face="Verdana" size="1" color="#000000">unit Unit1;

          interface

          uses
          Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
          StdCtrls;

          type
          TNewListBox = class(TListBox)
          private
          <b>procedure WMCAPTURECHANGED(var M : TMessage); message WM_CAPTURECHANGED;</b>
          protected
          end;

          TForm1 = class(TForm)
          Button1: TButton;
          procedure Button1Click(Sender: TObject);
          procedure FormCreate(Sender: TObject);
          procedure FormDestroy(Sender: TObject);
          private
          { Private-Deklarationen }
          FLB : TNewListBox;
          public
          { Public-Deklarationen }
          end;

          var
          Form1: TForm1;

          implementation

          {$R *.DFM}

          procedure TForm1.Button1Click(Sender: TObject);

          begin
          FLB.Visible:=True;
          FLB.SetFocus;
          end;

          { TNewListBox }

          <b>procedure TNewListBox.WMCAPTURECHANGED(var M: TMessage);</b>
          begin
          Visible:=False;
          end;

          procedure TForm1.FormCreate(Sender: TObject);
          begin
          FLB:=TNewListBox.Create(Self);
          FLB.Parent:=Self;
          FLB.Top:=44;
          FLB.Left:=20;
          FLB.Visible:=false;
          end;

          procedure TForm1.FormDestroy(Sender: TObject);
          begin
          FLB.Free;
          end;

          end.</font>
          </pre>
          Jens Schumann<br&gt

          Comment


          • #6
            <P>Hallo Olli, hallo Jens</P>
            <P>vielen Dank f&uuml;r Euere wertvollen Hinweise. Ich werde diesen nachgehen
            und mich zur gegebenen Zeit wieder melden.</P>
            <P>Viele Gr&uuml;&szlig;e</P>
            <P>Wolfgang.</P&gt

            Comment

            Working...
            X