eigener slider mit image



  • Man muss halt eine loop in MouseDown machen, bis die Taste losgelassen wird, also MouseUp eingetreten ist. In der Loop frägt man dann ständig die Mousposition ab.

    Wenn man das nicht macht, bekommt man nur die Postition nach drücken der Mousetaste.



  • @maYer: Hast Du das so schon mal ausprobiert? Das geht?

    Ich hätte es so gelöst:
    In der ButtonDown in z.B. Tag des Images eine 1 schreiben. In der MouseMove prüfen, ob Tag == 1 ist und wenn ja, das Bild entsprechend positionieren. In der ButtonUp Tag einfach wieder auf 0 setzen.

    Grüße Joe_M.



  • das geht soweit schonmal.

    mein code

    void __fastcall TForm1::Image7MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      Tag = 1;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image7MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
      if (Tag == 1)
      Image7->Left = X;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image7MouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
      Tag = 0;
    }
    //---------------------------------------------------------------------------
    

    jetzt hab ich nur das problem, das das image, was ich verschiebe sehr stark flackert. form1->doublebuffered hab ich auf true.



  • Flackert es auch noch, wenn Du es auf Panel legst, anstatt direkt auf das Form? (beim Panel DoubleBuffered auf true setzen.)



  • Hallo,

    ich habe das gleiche Problem, habt jemand eine gute Lösung gefunden?
    Habe das Image jetzt auf ein Panel gelegt, nun geht es aber gar nicht mehr.

    😕



  • Es funktioniert natürlich trotzdem noch!
    Allerdings wackelt es immer noch stark!!

    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
    	int X, int Y)
    {
    	switch(Pressed)
        {   case true:
                Image1->Left = X;
                Image1->Top = Y;
        }
    }
    

    So funktioniert es natürlich nicht, weil ja die Maus-Position nicht gleich Left,Top ist.
    Jemand einen Plan?



  • Hallo

    das wird daran liegen, das MouseMove einfach zu oft aufgerufen wird.
    Eventuell hilft eine Überprüfung, ob die Position sich wirklich verändert hat, bevor du diese als Koordinaten übergibst. Außerdem kannst du mit SetBounds() beide Koordinaten gleichzeitig setzen.

    bis bald
    akari



  • Das Problem ist aber, das ich die Mausposition auf dem Bild abfragen und dann das Bild verschiebe. Ich müsste die Position auf dem Formular wissen, aber da ist ja das Bild drüber.
    Irgend eine Idee,oder vielleicht muss ich ja das Bild nicht verschieben, sondern nur den Inhalt neu zeichnen. Habe aber momentan keinen Plan. 😕



  • Hallo

    Ich müsste die Position auf dem Formular wissen, aber da ist ja das Bild drüber.
    

    Dann kannst du doch die "globale Position" berechnen :

    XForm = LeftImage + XMouse; // X-koordinate auf Form umrechnen
    YForm = TopImage + YMouse; // Y-koordinate auf Form umrechnen
    

    bis bald
    akari



  • Vielen Dank dafür,

    jetzt sieht es schon etwas besser aus!

    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
    	int X, int Y)
    {   int XForm,YForm;
    
    	switch(Pressed)
        {   case true:
    
            XForm = Image1->Left + X; // X-koordinate auf Form umrechnen
    	YForm = Image1->Top + Y; // Y-koordinate auf Form umrechnen
    
            Image1->Left =X+XForm;
            Image1->Top = Y+YForm;
    
            char xPos[10];
    	char yPos[10];
    
    	itoa(X, xPos, 10);
    	itoa(Y, yPos, 10);
    
    	lbHorz->Caption = xPos;
     	lbVert->Caption = yPos;
        }
    }
    

    ich habe mir jetzt immer die X,Y Maus-Daten mit ausgeben lassen,
    die wechseln ständig ihr Vorzeichen.
    Ich kann mir das nicht erklären, deshalb flackert es auch so extrem!
    Weiß auch dazu noch jemand Hilfe?
    Ich wollte noch sagen Ihr seid die Besten 👍



  • Hallo

    char xPos[10];
       char yPos[10];
    
       itoa(X, xPos, 10);
       itoa(Y, yPos, 10);
    
       lbHorz->Caption = xPos;
       lbVert->Caption = yPos;
    

    ist nicht dein Ernst, oder?
    schau mal :

    lbHorz->Caption = IntToStr(X);
       lbVert->Caption = IntToStr(Y);
    

    bis bald
    akari



  • Hallo akari,

    vielen Dank für die schnelle Antwort, aber das ist momentan nicht mein Problem, sondern das Flackern!
    Aber ich werde es ändern.


Anmelden zum Antworten