2009-05-25 8 views
7

Bevor Delphi 2006 (glaube ich) das TFlowPanel und TGridPanel eingeführt habe, habe ich ein Steuerelement gemacht, das im Konzept ähnlich war. Es gibt immer noch ein paar Dinge, die diese Steuerelemente nicht tun, und als ich meinen Code auf Delphi 2009 aktualisiert habe, habe ich beschlossen, ein paar Verbesserungen hinzuzufügen.Entwurfszeit Drag & Drop in Delphi?

Im Moment wird die Reihenfolge der untergeordneten Steuerelemente durch ihre Erstellungsreihenfolge bestimmt. Das FlowPanel und das GridPanel zeigen einen besseren Weg mit ControlIndex und anderen gefilterten Eigenschaften, aber ich frage mich, ob es eine Möglichkeit gibt, Drag-and-Drop-Umordnungen in der Entwurfszeit zu handhaben? Soweit ich das beurteilen kann, ruft das Ziehen eines Bearbeitungssteuerelements und das Ablegen auf mein Panel nichts auf, auf das ich während der Entwurfszeit zugreifen kann.

Ich war halb phantasiert über eine Möglichkeit, entweder die Drop-Operation direkt zu erkennen, oder vielleicht zu erkennen, wenn ein Steuerelement bewegt wird, damit ich bestimmen kann, wohin es gehen soll.

Irgendwelche Ideen?

Update: OK, habe es funktioniert. Das Containersteuerelement überschrieb bereits AlignControls, um die Platzierung der Steuerelemente zu verwalten. Wenn Sie das verschachtelte Steuerelement ziehen und ablegen, wird AlignControls erneut aufgerufen. Ich habe dann die neuen Koordinaten des Steuerelements mit den anderen Steuerelementen in der Liste verglichen und an die entsprechende Position verschoben.

Es gab ein paar Probleme, die ich durcharbeiten musste (hauptsächlich in Bezug auf die vielen Aufrufe von AlignControls), aber das Grundkonzept ist einfach genug. Danke an alle Kommentatoren für die Hilfe.

+0

"Die Reihenfolge der untergeordneten Steuerelemente wird durch ihre Erstellungsreihenfolge festgelegt" Was ist die Reihenfolge? Tab-Reihenfolge? Möchten Sie die Tabs in einem Panel von oben nach unten sortieren lassen? – Serguzest

+0

Jetzt, wenn Sie das Panel auswählen und dann Steuerelemente hinzufügen, werden die Steuerelemente in der Reihenfolge angeordnet, in der Sie sie hinzugefügt haben. Um die Reihenfolge zu ändern, würden Sie das Formular ausschneiden und einfügen oder als Text anzeigen und verschieben. Ich habe jetzt eine ControlIndex-Eigenschaft a la TFlowPanel hinzugefügt, möchte aber, dass die Benutzer des Steuerelements einfach per Drag & Drop neu anordnen können. Ergreifen Sie Edit2 und lassen Sie es links von Edit1 fallen, und sie tauschen auf magische Weise Positionen auf dem Panel aus. –

Antwort

5

Sie können ein Steuerelement, das sich bereits auf dem Formular befindet, nicht ziehen und es auf Ihrem Panel ablegen. Ziehen ist nur für Verschieben ein Steuerelement, nicht zum Ändern der übergeordneten. Um das übergeordnete Element zu ändern, kopieren und einfügen.

Wenn sich das Steuerelement bereits in Ihrem Bedienfeld befindet und Sie es an eine andere Position in Ihrem Bedienfeld verschieben möchten, kann das Bedienfeld das Layout durch Überschreiben der TWinControl.AlignControls-Methode steuern. Wenn ein Steuerelement verschoben wird, wird seine SetBounds-Methode aufgerufen, und unter den Dingen, die passiert, ist, dass es AlignControl(Self) auf seinem übergeordneten Fenster aufruft. Das ruft AlignControls auf. Schauen Sie in Controls.pas, und Sie werden sehen, dass das eine komplizierte Methode ist, aber es ist verantwortlich für das Layout der Kinder auf einem Steuerelement, und das ist genau das, was Sie planen, zu ändern.

+0

Hallo Rob, Ich denke, ich war nicht allzu klar über meine Absichten re Kontrollen, die auf meinem Container fallen gelassen werden - siehe meine Antwort auf Johns Kommentar. In Bezug auf AlignControls, um die Neuordnung zu behandeln, haben Sie natürlich Recht. Ich benutze AlignControls bereits, um die Kinder anzuordnen, aber im Moment ignoriere ich vollständig die linken und oberen Eigenschaften. Meine Sorge ist, dass es bei der Berücksichtigung dieser Faktoren ziemlich schwierig sein wird zu bestimmen, wann ein Steuerelement gerade hinzugefügt wird und wann der Benutzer versucht, die Reihenfolge zu ändern. Ich werde es aber versuchen und melden. –

0

Haben Sie versucht, ein "OnDragDrop" -Ereignis für Ihre Rasterkomponente zu schreiben, wo Sie überprüfen, ob sich Ihre Komponente im Entwurfsmodus befindet?

Ich habe noch keine solche Komponente geschrieben, aber ich sehe nicht, warum das Ereignis nicht ausgelöst werden sollte.

+0

Hallo LeGEC. Ich habe OnDragDrop noch nicht getestet, aber es scheint, als würden alle anderen Mausereignisse vom Formular-Designer abgefangen, so dass Sie nie benachrichtigt werden, dass ein Steuerelement gezogen wird. –

3

Vielleicht helfen einige dieser Vorschläge.

Sie können ein Steuerelement im Designer erneut erstellen, ohne es ausschneiden und einfügen zu müssen. Zeigen Sie das Strukturfenster an, und ziehen Sie das visuelle Steuerelement einfach auf den Knoten eines anderen übergeordneten Elements im Strukturfenster. Wenn Sie Objekte in einem Flowpanel haben, ziehen Sie alles aus dem Flow-Panel heraus und ziehen Sie sie in der Reihenfolge zurück, in der Sie sie haben möchten.

(können Sie re-parent ANY visuelle Kontrolle auf diese Weise, ohne etwas anderes als seine Eltern zu verändern. Ich empfehle es auf diese Art und Weise zu tun.)

Sie das Formular als Text anzeigen kann, und die Erklärung bewegen, um herum da - aber offensichtlich müssen Sie vorsichtig sein, wenn Sie die "Ressource" -Datei direkt bearbeiten.

Sie können die Tab-Reihenfolge im Designer festlegen, damit Sie ein anderes Steuerelement basierend auf der Tab-Reihenfolge erstellen können, das wie gewünscht funktioniert. Sie können mit der rechten Maustaste auf das Formular klicken und die Erstellungsreihenfolge der nicht sichtbaren Steuerelemente ändern, dies funktioniert jedoch nicht mit visuellen Steuerelementen.

+0

Danke, John. Meine Frage bezog sich wirklich darauf, sie von einem benutzerdefinierten Steuerelement aus zu unterstützen - im Grunde, damit das Steuerelement feststellte, dass ein anderes Steuerelement an einer Position abgelegt wurde, die Teil des Begrenzungsrechtecks ​​meines Steuerelements ist, sodass das übergeordnete Element geändert werden kann. Ich hatte jedoch einige Bedenken darüber - abgesehen davon, nicht zu wissen, wo genau zu starten, wird es die Kontrolle anders als andere Container, die für einige Benutzer der Kontrolle verwirrend sein kann. –

+1

Vielleicht möchten Sie es stattdessen zu einem Komponenteneditor machen, dann - öffnen Sie Ihre eigene UI von einem rechten Mausklick, und verwenden Sie entweder die altmodische Bewegung nach oben/unten oder implementieren Sie die Drag & Drop auf diesem Steuerelement. –