![]() |
Buttons/Controls sortieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich benutze in einem Programm zur Laufzeit erzeugte Objekte, die ich von TBitBtn abgeleitet habe. Diese Buttons können vom Benutzer verschoben werden so wie in der IDE von Delphi. Das funktioniert ganz gut, aber nicht perfekt. Ich hätte gern, dass nach jedem Verschieben bzw. hinzukommenden Button die TabOrder angepasst wird. Dabei sollen wie beim Lesen die Buttons oben links eine kleinere TabOrder als die Buttons unten rechts haben. Sonst wird das am Ende unschön. Dazu muss ich die Properties Top/Left verwenden. Eigentlich ist das nichts anderes als ein mehrdimensionales Array? Hat jemand so etwas schon mal gemacht oder eine Idee, wie ich herangehen/wo suchen kann? Gruß, Alex |
AW: Buttons/Controls sortieren
Ich würde zunächst ein temporäre Liste (LButtons: TList) mit allen Buttons mit füllen. Diese Liste würde ich sortieren und zwar mit einer Vergleichsfunktionen die dafür sorgt, dass die Buttons entsprechend der (gedachten) Zeile und Spalte bewertet werden. Ein Button ist dann in einer anderen Zeile, wenn seine Y-Position mindestens um die Höhe des Buttons von dem anderen Button abweicht.
Delphi-Quellcode:
Nachdem ich nun ein Liste habe, in der die Buttons in der Lese-Reihenfolgen geordnet sind, brauche ich nur noch durch die Liste zu gehen und alle Taborder-Werte gleich dem Index zu setzen.
function BtnCompare(P1, P2: Pointer): Integer;
var btn1, btn2: TBitButton; begin btn1 := TObject(P1) as TBitButton; btn2 := TObject(P2) as TBitButton; if btn1.Top>btn2.Top+btn2.Height then // btn1 ist tiefer als btn2 Result := 1 else if btn1.Top+btn1.Height<btn2.Top then // btn1 ist höher als btn2 Result := -1 else // die beiden Knöpfe sind in der gleichen Zeile Result := btn2.Left-btn1.Left; end;
Delphi-Quellcode:
Danach kann die temporäre Liste wieder frei geben werden.
for i:=0 to LButtons.Count-1 do
TBitButton(LButtons[i]).TabOrder := i; |
AW: Buttons/Controls sortieren
Erst einmal danke für die Antwort.
Ich habe jetzt auch gegrübelt und am Ende getrickst. Meine Überlegung war die, dass erst die "Höhe" und dann der linke Abstand entscheidend ist. Also habe ich mir erstmal so beholfen:
Delphi-Quellcode:
Ich werde mir aber auf jeden Fall Deine Version mal ansehen, weil meine "Wurschprogrammiererei" einen Nachteil hat: ab einer bestimmten Auflösung klappt es nicht mehr.
With TStringList.Create Do
Try Sorted:= True; For I:= 0 To Pred(ScrollBox1.ControlCount) Do // alle Buttons durchgehen If (ScrollBox1.Controls[I] Is TBitBtn) Then Begin lItem:= (ScrollBox1.Controls[I] As TBitBtn); AddObject( FormatFloat('00000', lItem.Top) + // von oben nach unten FormatFloat('00000', lItem.Left), // von links nach rechts lItem); // Object anhängen End; For I:= 0 To Pred(Count) Do // Listenplatz = Taborder (Objects[I] As TBitBtn).TabOrder:= I; Finally Free; End; Eine Nachfrage habe ich dann aber noch: Irgend jemand muss ja dieses
Delphi-Quellcode:
aufrufen. Ich vermute mal, die
BtnCompare();
Delphi-Quellcode:
. Wie bringe ich sie dazu? Nach meiner Recherche müsste es mit Deinem Codebeispiel so gehen:
TList
Delphi-Quellcode:
Ist das richtig?
TList.Sort(@BtnCompare);
Refresh; |
AW: Buttons/Controls sortieren
Zitat:
|
AW: Buttons/Controls sortieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz