2009-11-27 7 views
5

Einfache Frage. Ich habe ein Panel mit 3 Komponenten. Alle von ihnen haben Align: = alRight. Aber das Problem ist, dass während der Laufzeit die Reihenfolge von ihnen ist nicht das gleiche wie Designtime.Wie Sie TControl.Align verwenden: = alCustom?

Kann ich stattdessen alCustom verwenden, um die Reihenfolge am rechten Rand zu erzwingen? Ich benutze D2007.

+1

Das Problem der unterschiedlichen Reihenfolge bei Designtime und Runtime kann durch Manipulation der Sichtbarkeit dieser Kontrollen auftreten –

Antwort

2

Sie zeigen nicht viel von dem Problem zur Hand, aber ich hätte stattdessen einen Blick auf das Flowpanel geworfen.

Beim Löschen von Steuerelementen in einem Flowpanel wird automatisch eine neue Bestelleigenschaft angezeigt. Sie können festlegen, auf welche Weise Ihre Steuerelemente fließen sollen. Wenn Sie einen Abstand zwischen den Steuerelementen wünschen, legen Sie die Ränder für jedes Steuerelement fest.

Eine kleine Verdeutlichung: Die neue 'Bestelleigenschaft' wird eigentlich 'ControlIndex' genannt und erscheint am unteren Rand des Objektinspektors.

+0

Danke, ich habe es noch nicht ausprobiert aber es scheint die beste Lösung zu sein (weniger Codierung). –

+0

Jetzt habe ich es versucht und es hat nicht funktioniert. Ich habe 3 Schaltflächen zu einem FlowPanel hinzugefügt und ich sehe keine Order-Eigenschaft auf dem Panel. Habe ich dich falsch verstanden? –

+0

Ich denke, ich war ein wenig unklar. Die 'Order'-Eigenschaft wird' ControlIndex 'genannt und erscheint am unteren Rand des Objektinspektors. – Vegar

7

Ja, Sie können jede Art von benutzerdefinierter Ausrichtung durchführen. Verwenden Sie einfach die Ereignisse OnAlignInsertBefore() und OnAlignPosition() des Steuerelements. (Diese sind in Delphi 2007 vorhanden, werden aber nicht veröffentlicht, so dass sie nicht auf der Registerkarte "Ereignisse" des Objektinspektors angezeigt werden. Sie können sie dennoch im Code zuweisen. Ich habe die folgenden Prototypen gezeigt. Sie sind in der Hilfedatei unter TAlignInsertBeforeEvent und TAlignPositionEvent, können Sie auch Custom und OnAlignInsertBefore sehen)

TAlignInsertBeforeEvent = function(Sender: TWinControl; 
    C1, C2: TControl): Boolean of object; 

TAlignPositionEvent = procedure(Sender: TWinControl; Control: TControl; 
    var NewLeft, NewTop, NewWidth, NewHeight: Integer; 
    var AlignRect: TRect; AlignInfo: TAlignInfo) of object; 

Die Dokumentation enthält ziemlich gute Beschreibungen der Parameter für beide Methoden..

In Delphi 2010 werden diese Ereignisse veröffentlicht und auf der Registerkarte "Ereignisse" des Objektinspektors angezeigt.

Ich habe noch nie das Problem gesehen, das Sie haben ... Haben Sie versucht, alle von ihnen auf alNone, Verschieben Sie sie von der rechten Kante, und dann neu einstellen Align: = alRight in der Reihenfolge Sie wollen, dass sie erscheinen?

+0

Oh! Ich habe gesehen, dass dies viel passiert ist. Es ist besonders doof, wenn Sie TSplitter-Instanzen zum äußersten Rand des Formulars "wechseln", wodurch sie deaktiviert werden. Ich habe das immer mit zusätzlichen TPanels und Verankerung in der Vergangenheit gelöst. –

+0

Ich musste Kens Empfehlung anwenden, die Ausrichtung auf "None" zu setzen und sie dann in der Reihenfolge, in der sie sie haben sollen, auf "Right" zu setzen. Ich möchte hinzufügen, dass Sie sie auch "weit genug" von der rechten Seite bewegen müssen. Angenommen, Sie haben zwei Komponenten in einem Formular: RightControl (rechtsbündig) und NoneControl (nicht ausgerichtet). Wenn NoneControl.Right> RightControl.Right ist, wird das Ändern von NoneControl.align: = alRight es rechts von RightControl setzen. Aus diesem Grund setze ich sie alle auf eine negative Zahl (z. B. in form create) und setze dann die Ausrichtung nach rechts. –

+0

Die neueste Version von Delphi 2007 veröffentlicht diese Ereignisse ebenfalls. (Weiß nicht, ob das von Anfang an war oder durch ein Update hinzugefügt wurde.) – dummzeuch

Verwandte Themen