AGB  ·  Datenschutz  ·  Impressum  







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

Buttons/Controls sortieren

Ein Thema von Schwedenbitter · begonnen am 14. Sep 2017 · letzter Beitrag vom 18. Sep 2017
Antwort Antwort
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Buttons/Controls sortieren

  Alt 14. Sep 2017, 20:47
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
Miniaturansicht angehängter Grafiken
stammbaum.png  
Alex Winzer

Geändert von Schwedenbitter (14. Sep 2017 um 20:56 Uhr)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#2

AW: Buttons/Controls sortieren

  Alt 15. Sep 2017, 07:59
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:
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;
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.
Delphi-Quellcode:
  for i:=0 to LButtons.Count-1 do
    TBitButton(LButtons[i]).TabOrder := i;
Danach kann die temporäre Liste wieder frei geben werden.

Geändert von samso (15. Sep 2017 um 08:06 Uhr)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Buttons/Controls sortieren

  Alt 15. Sep 2017, 09:13
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:
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;
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.

Eine Nachfrage habe ich dann aber noch:
Irgend jemand muss ja dieses BtnCompare(); aufrufen. Ich vermute mal, die TList . Wie bringe ich sie dazu? Nach meiner Recherche müsste es mit Deinem Codebeispiel so gehen:
Delphi-Quellcode:
TList.Sort(@BtnCompare);
Refresh;
Ist das richtig?
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Buttons/Controls sortieren

  Alt 15. Sep 2017, 10:12
Irgend jemand muss ja dieses BtnCompare(); aufrufen. Ich vermute mal, die TList . Wie bringe ich sie dazu? Nach meiner Recherche müsste es mit Deinem Codebeispiel so gehen:
Delphi-Quellcode:
TList.Sort(@BtnCompare);
Refresh;
Ist das richtig?
Prinzipiell ja, aber schau lieber mal, ob es ohne Klammeraffen geht. Der ist bei Routinenzeigern meistens unnötig oder aber ein Zeichen, dass was nicht passt.
Uli Gerhardt
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.443 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Buttons/Controls sortieren

  Alt 18. Sep 2017, 15:42
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.
Warum soll das getrickst sein? TabOrder ist eine Dimension, Top und Left zwei. Irgend ein Mapping muss mna ja machen und das von Dir gewählte finde ich ist das sinnvollste.
  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 23:04 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