Announcement

Collapse
No announcement yet.

zwei Komponenten

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

  • zwei Komponenten

    Ich brauche zwei verschiedene Komponenten.<br>
    Die erste soll ein TBitBtn sein, bei dem der erste Klick nur den Focus setzt, aber kein OnClick ausloest.<br>
    Die Andere soll ein TImage sein, das nur auf den Klick in nicht transparente Bereiche des Bildes ein OnClcik ausloest.<br>
    Bitte Beispiele oder Links zu freier Source.<br>
    Dank im Voraus.

  • #2
    Hat sich erledigt experts-exchange war schneller

    Comment


    • #3
      Hi

      1.) einfach kein OnClick zuweisen, oder im OnClick hat ActiveControl := XXX_Control setzen<br>
      2.) zwei Wege fallen mir ein:<br>

      a.) im OnClick des TImage wird mit Image1.Canvas.Pixels[X, Y] die Hintergrund-Farbe ermittelt, oder Gleiches geht mit der Bitmap selber.
      ABER !, hier steckt der Teufel im Detail, da es auf Grund der Grafikkarten Treiber zu Farbverschiebungen kommen kann, also immer die echte/real-Color benutzen.<br>

      b.) hier im Forum findest Du einen Source der aus einer TBitmap eine Region erstellt. Nun, ein TPanel mit dem TImage genommen, Image1 = Panel1 Größe. Hinter Panel1 ein zweites Panel2. Nun mit SetWindowRgn(Panel1.Handle, CreateRegionFromBitmap(Image1.Picture), False). Im Panel1/Panel2.OnMouseDown Dein Code. Nun, wenn der Anwender ins Bild klickt wird entweder Panel1.OnMouseDown = IM Bild oder Panel2.OnMouseDown = IM Transparentbereich, ausgelösst.<br>

      Gruß Hage

      Comment


      • #4
        Hi Robert

        zum Problem 1:<br>
        Du willst das wenn ein user auf den Button klickt dieser beim ersten klick erst mal nur fokusiert wird. Nur wenn er fokusiert ist sollte ein OnClick ausgelösst werden, richtig ? Dann schau Dir mal die Message <b>wm_MouseActivate</b> an. Einfach diese Message abfangen

        <pre>

        procedure TMyBitBtn.WMMouseActivate();
        begin
        Inc(FMouseActivate);
        inherited;
        Dec(FMouseActivate);
        end;

        </pre>

        Nun kannst Du in den anderen Methoden mit if FMouseActivate = 0 then ...; arbeiten.<br>

        Gruß Hage

        Comment


        • #5
          procedure CMHitTest(var Msg: TWMMouse); message CM_HITTEST;<br>
          <br>
          procedure TMouseImage.CMHitTest(var Msg: TWMMouse);<br>
          begin<br>
          inherited;<br>
          if Assigned(PicUp) and Assigned(PicUp.Bitmap) and Transparent and<br>
          (Msg.XPos < PicUp.Bitmap.Width) and (Msg.YPos < PicUp.Bitmap.Height) and<br>
          (PicUp.Bitmap.Canvas.Pixels[Msg.XPos, Msg.YPos] = (Picture.Bitmap.TransparentColor and $FFFFFF)) then<br>
          Msg.Result := 0;<br>
          end;<br><br>
          Das ist die Loesung fuer das TImage.<br>
          Hagen, das mit dem WMMouseActivate werde ich probieren. Sieht vielversprechend aus

          Comment


          • #6
            Meine CMHitTest-Loesung ist fuer eine abgeleitete TImage-Komponente, die mehrere Bilder hat. Fuer eine normale TImage-Ableitung muss es natuerlich Picture statt PicUp heissen

            Comment


            • #7
              Hagen, hat geklappt.<br>
              procedure TMyButton.WMMouseActivate(var Msg: TWMMouse);<br>
              var<br>
              F: Boolean;<br>
              begin<br>
              F := Focused;<br>
              inherited;<br>
              if not F then<br>
              begin<br>
              Msg.Result := MA_ACTIVATEANDEAT;<br>
              SetFocus;<br>
              end;<br>
              end;<br><br>
              Das hier funktioniert

              Comment


              • #8
                Jo, Ich hatte ein ähnliches Problem und ähnlicher Lösung mit meinen Floating Toolbars

                Ein bißchen gehts noch einfacher:

                <pre>

                procedure ...WMMouseActivate(var Msg: TWMMouseActivate);
                begin
                Msg.Result := MA_ACTIVATEANDEAT;
                end;

                </pre>

                wm_MouseActivate ist eine "Benachrichtigungs" Botschaft und der DefaultHandler macht eigentlich NICHTS. Damit müsste obiger Code reichen.

                Gruß Hage

                Comment


                • #9
                  Nö, will nich. Dann aktiviert der Button nie

                  Comment


                  • #10
                    Hi Robert

                    Du hast Recht, meine Toolbars haben sich auf Grund das sie ja TopLevel Fenster sind anders verhalten als ein Child Window.

                    <pre>

                    procedure ..WMMouseActivate(var Msg: TWMMouseActivate);
                    begin
                    if not Focused then
                    begin
                    Msg.Result := MA_ACTIVATEANDEAT;
                    SetFocus;
                    end else inherited;
                    end;

                    </pre>

                    So gehts aber, nun es gibt aber auch fast keinen Unterschied mehr zu Deiner lösung.

                    Gruß Hage

                    Comment


                    • #11
                      Ich bin dafuer IMMER inherited aufzurufen. Man weiss nie was da noch alles dranhaengt.<br>
                      Noch eine andere Frage: Weisst Du wie man FindNextControl einer TWinControl einsetzt? Ich will das mein Focus beim Betaetigen eines Buttons auf den naechten Button der Gruppe springt. Es sind abgeleitete TBitBtns. Von denen ich 100 programmatisch direkt auf einer Form erzeuge. TabStop und TabOrder sowie Parent sind gesettzt

                      Comment


                      • #12
                        Hi

                        <pre>

                        Parent.FindNextControl(Self, True, True, True).SetFocus;

                        </pre>

                        Sehr vereinfacht, und keinerlei Überprüfungen auf <b>nil</b>.

                        Appropo <b>inherited</b>:
                        Das ist so'ne Sache, wenn der inherited Handler z.B. ein OnClick() auslösen würde dann MUSSTE zwangsläufig OHNE inherited arbeiten um das OnClick() NICHT aufrufen zulassen. Konkret heist das das inherited aufgerufen wird wenn es nötig oder keinen Nebeneffekt hat, oder es wird absichtlich NICHT aufgrufen wenn ein bestimmtes Verhalten nicht erwünscht wird. Die Annahme inherited IMMER aufzurufen ist also nicht korrekt. Im obigen Fall wird also verhindert das der DefaultHandler oder der inherited Part NICHT dazwischenfunkt. Zusätzlich kann ich Dir versichern das im Falle von wm_MouseActivate dies notwendig ist, bzw. das wm_MouseActivate eine Benachrichtungs Message des System ist und nur das Rückgaberesultat entscheidend ist. Ok, der Aufruf von. SetFocus ist eigentlich wider dem Design, da ja wm_MouseActivate eigentlich nicht interagieren sollte.

                        Gruß Hage

                        Comment


                        • #13
                          Ich leg mir die Karten. Parent.FindNextControl gibt "[Error] MyProgram.pas(48): Undeclared identifier: 'FindNextControl'" Controls ist im uses enthalten

                          Comment


                          • #14
                            Sorry, welche Delphi Version ? Diese, doch wichtge Proc, ist nämlich protected (

                            <pre>

                            type
                            TWinControlCracker = class(TWinControl);<br>

                            TWinControlCracker(Parent).FindNextControl(Self, True, True, True).SetFocus; <bR>

                            </pre>

                            Hat ich total vergessen. Interssant ist aber das in der Delphi Hilfe diese methode ganz normal beschrieben wird.

                            Gruß Hagen

                            PS: eine der vielen Ärgerlichkeiten im VCL design :

                            Comment


                            • #15
                              Delphi 5.
                              Hast Du mal gesehen was die Funktion eigentlich tut? Pervers.
                              Sie muss auch mit CanFocus abgesichert werden.
                              Jetzt fahre ich erst mal zur Entwicklerkonferenz

                              Comment

                              Working...
                              X