AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

beim doppelclick kein Mousedown event

Ein Thema von lordcroc · begonnen am 23. Nov 2005 · letzter Beitrag vom 24. Nov 2005
Antwort Antwort
lordcroc

Registriert seit: 13. Aug 2002
Ort: Braunschweig
137 Beiträge
 
Delphi 7 Professional
 
#1

beim doppelclick kein Mousedown event

  Alt 23. Nov 2005, 14:32
Hallo,

Ich möchte in einer Scrollbox dynamisch erzeugte Panels per Drag and drop verschiebbar machen was auch funktioniert. Ich habe mir
eine neue Klasse von TPanel abgeleitet und mit einer Verschiebenfunktion mit den OnMousedown, OnMouseMove und OnMouseUp Events erweitert. Dies ist bisher alles problemlos. Leider benötige ich auch eine Doppelclick funktion auf diese verschiebbaren Panels und dabei gibts probleme. Sobald ich versuche ein doppelclick mache werden die OnMouse Events ausgelöst, was dann auch meine Verschieben funktion Aufruft und das Programm macht dann komische Fehler, die nicht erwünscht sind

Im Anhang ist eine Demo App. An der Demo kann man sehen In wie weit ich alles bisher gelöst habe.
Quelltext ist auch dabei.

Wäre für jede Hilfe dankbar.

mfg
Lordcroc
Angehängte Dateien
Dateityp: zip test_467.zip (173,9 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: beim doppelclick kein Mousedown event

  Alt 23. Nov 2005, 14:55
Hi,
wenn du auf einen Doppelklick reagieren möchtest, musst du nur prüfen ob sich ssDouble in Shift befindet. Dabei wird natürlich trotzdem ein MouseDown, MouseUp ausgelöst. Um hier das unerwünschte abzufangen, solltest du dir beim MouseDown die Start-Koordinaten merken und in MouseMove und MouseUp nur reagieren, wenn diese ungleich den aktuellen sind (also StartX <> X aus OnMouseMove/Up).
Dann sollte es klappen

Gruß Der Unwissende
  Mit Zitat antworten Zitat
lordcroc

Registriert seit: 13. Aug 2002
Ort: Braunschweig
137 Beiträge
 
Delphi 7 Professional
 
#3

Re: beim doppelclick kein Mousedown event

  Alt 23. Nov 2005, 15:53
Vielen Dank, das ist genau was ich brauche.

Leider habe ich noch ein Problem beim vergleichen der Koordinaten und "ssDouble in Shift". Da Ja theoretisch die Maus sich während des doppelclicks um einige Pixel verschieben kann. Ich weiß jetzt auch nicht genau an welcher stelle ich mir die Koordinaten merken muß und in welcher Reihenfolge die Koordinaten und "ssDouble in Shift" ich in der Mousedown Routine vergleichen muß.

hab nochmal in den Anhang die etwas erweiterte Demo App hizugefügt.

Schon mal vielen Dank vorraus.

mfg
Lordcroc
Angehängte Dateien
Dateityp: zip test_120.zip (174,2 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: beim doppelclick kein Mousedown event

  Alt 24. Nov 2005, 11:52
Sorry, hab gestern nicht mehr reingeschaut. Ich häng dir mal (ausgehend von der ersten Version) ein Programm an, dass das erfüllen sollte, was du gern hättest.
Aber vorher ein paar Anmerkungen:
Wie du sehen wirst, hab ich deinen Code etwas anders formatiert und ich würde dir generell zu einer anderen Codeformatierung raten. Damit möchte ich dir überhaupt nicht zu meiner raten, ich glaube die Delphi Konvention weicht da doch von allen anderen etwas ab, aber trotzdem gibt es ein paar Dinge die man ruhig immer beachten sollte. Musst du halt gucken welche davon du umsetzt.

Also prinzipiell solltest du ruhig immer begin und end hinter jede if, else Anweisung und jede Schleife setzen. Gerade hier gibt es immer ein paar Leute die sagen dass einzelne begins und ends überflüssig sind, aber das stimmt so nicht. Sie beeinflussen den Programm Ablauf in keiner Weise, erhöhen aber die Lesbarkeit (man weiß genau welche Zeilen zur Bedingung gehören) und senkt die Fehlerrate (selber Grund).
Dann solltest du auch immer den Code in so einem begin end Block einrücken. Damit wird der Code wieder leichter lesbar. Klassenvariablen sollten immer mit dem self-Zeiger als solche gekennzeichnet werden (nur bei Klassenmethoden ist es Geschmackssache). Das sind wirklich Dinge, die guten Code-Stil ausmachen (steht so in den Werken die ich dazu kenne).

Ansonsten nur ein paar Empfehlungen, die ich dir persönlich gebe, weil ich sie auch mehr als lange falsch gemacht habe und das Umgewöhnen viel Zeit kostet aber auch viel bringt.
Du solltest unbedingt mehr kommentieren. Dachte früher häufig, ist eh nur prototyp und egal und weiß ja auch was ich da gemacht habe... Dachte, irgendwann kommt dein Chef und möchte etwas, was du schonmal als Prototyp angefangen hast, na ja, natürlich kamen andere Dinge dazwischen und man hat nie kommentiert und sitzt dann vor Code der nur ein Jahr alt ist. Leider hat er häufig kein Wiedererkennungswert und man fragt sich, was sich der Programmierer wohl dabei gedacht hat. Gar nicht übertrieben, sondern wirklich häufiger der Fall als man glaubt! Und da ich wirklich häufiger mal auf alten Code zurückgreifen muss, bin ich immer über jeden (sinnvollen) Kommentar froh. Hab halt ein paar Kollegen gehabt, die in ihren Code etwas wie Funktioniert reingeschrieben haben, nicht wirklich hilfreich.
Ok, bin natürlich auch faul, aber ist wirklich ein Tip immer kurze Kommentare die wenigstens grob sagen was du machst.
Dann hab ich deine Methoden in Kommentarblöcke eingeschlossen (siehst schon was ich meine), da gibt es auch viele Alternativen, aber die so zu markieren macht es leichter den Anfang und das Ende einer Methode zu finden. Ist halt nur nützlich wenn man mal über den Code scrollt (nicht nötig). In (*** ... ***) kann man zudem gut den Kommentar zu der jeweiligen Methode (was sie macht, was für Parameter erwartet werden, Rückgabewert, etc) schreiben.
Ach und dann als Letztes das Einrücken der := so, dass die untereinander stehen. Wie gesagt, hab ich auch ne Zeit lang gemacht, aber je länger die längste Zeile, desto kontraproduktiver. Ist Anstrengend so weit rüber zu schauen, was du eine Variablen zuweist. Verrutscht man auch leicht beim Lesen.

Wie gesagt alles nur Tipps, mir haben sie viel gebracht, aber jeder sollte seinen Codestil finden der nur (so gut wie möglich) gängige Konventionen erfüllt. Aber selbst diese lassen einem ein wenig auswahl was man anders machen kann. Nur je gleicher dein Code mit dem von Anderen, desto leichter kommst du mit deren und sie mit deinem klar.

Gruß Der Unwissende
Angehängte Dateien
Dateityp: zip test2_140.zip (220,7 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
lordcroc

Registriert seit: 13. Aug 2002
Ort: Braunschweig
137 Beiträge
 
Delphi 7 Professional
 
#5

Re: beim doppelclick kein Mousedown event

  Alt 24. Nov 2005, 13:47
Hi @Der_Unwissende,

erstmal vielen Dank für deine Tips werde mir auf jeden Fall einige davon zu gemüte ziehen. Das mit dem Kommentieren ist immer ne Sache für sich. Im Orginal Prg wo ich diese Funktion brauche ist natürlich etwas mehr kommentiert, da ich aber schnell mal ne kleine Test Anwendungen geschrieben habe hielt ich es eigentlich nicht für nicht nötig diese irgendwie besonders zu Kommentieren. Deine Tips haben mich bisher gut weitergebracht. Die einzige Sache die noch etwas stört ist das beim Doppelclick das temporäre Panel was zur Anzeige da ist kurz sichtbar wird und dann wieder verschwindet. Dafür habe ich bisher noch keine Lösungg gefunden. Da es aber auch nicht besoders schön aussieht. Ich würde mich freuen wenn du mir vielleicht noch dabei helfen könntest.

mfg
Lordcroc
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: beim doppelclick kein Mousedown event

  Alt 24. Nov 2005, 20:31
Am Einfachsten kannst du das machen, in dem du dein zweites Panel (bzw. alle analogen Eigenschaften) erst anzeigst, wenn die Maus bewegt wird. Dazu einfach folgende Methoden ändern:

Delphi-Quellcode:
procedure TMovingPanel.OnMouseDown;
begin
  if (self.FComesFrom = fPool) or (self.FComesFrom = fPlan) then
    begin
      screen.Cursor := crdrag
    end // if (self.FComesFrom = fPool) or (self.FComesFrom = fPlan)
  else
    begin
      screen.Cursor := crno;
    end;

  if (MoveWho <> mwNone) then
    begin
      OldLeft := self.ScreenToClient(Mouse.CursorPos).X;
      OldTop := self.ScreenToClient(Mouse.CursorPos).Y;
      P_tmpDraw := TPanel.Create(self);
      P_tmpDraw.Caption := Self.Caption;
      P_tmpDraw.Width := self.Width;
      P_tmpDraw.Height := self.Height;
      P_tmpDraw.Color := self.Color;
      P_tmpDraw.Visible := false; // <-- Unsichtbar solange nicht bewegt
      case FComesFrom of
        fPlan:
          begin
            PPlan.InsertControl (P_tmpDraw);
          end; // fPlan
        fPool:
          begin
            PPool.InsertControl (P_tmpDraw);
          end; // fPool
      end; // case FComesFrom

      P_tmpDraw.BringToFront;
      Moving := True;
    end; // if (MoveWho <> mwNone) and (Button = mbLeft)
end; // of procedure TMovingPanel.OnMouseDown;
Delphi-Quellcode:
procedure TMovingPanel.MouseMove (Shift: TShiftState; X, Y: Integer);
begin
  // inherited MouseMove(Shift, X, Y);
  if (MoveWho <> mwNone) and Moving then
    begin
      p_tmpDraw.Visible := true; // Und wieder sichtbar bei Mausbewegung
      ...
Kannst du natürlich ganz analog mit z.B. dem Cursor machen, falls du den Drag-Cursor erst sehen möchtest, wenn die Maus bewegt wird. Leider lässt es sich nicht ganz hübsch trennen, ob es sich um einen Doppelklick handelt oder nicht, da jedes Mausereignis ein Interrupt auslöst, so dass du von Delphi immer entsprechende Events bekommst.
Falls du aber wirklich unbedingt beides komplett trennen möchtest, solltest du die Eigenschaft Moving (und alles weitere) durch einen Timer setzen. Den würde dann ein Mausdown starten, ein MouseUp und/oder Doppelklick stoppen, aber du müsstest damit auch deine Zeit für einen Doppelklick verwenden, nicht die Windwos eigene. Bzw. die kann man sicher auch irgendwie auslesen, aber bestimmt nicht der schönste Weg.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz