Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponentenliste selber verwalten? (https://www.delphipraxis.net/96081-komponentenliste-selber-verwalten.html)

Mattze 18. Jul 2007 11:50


Komponentenliste selber verwalten?
 
Hallo,

kann man eine Komponentenliste (hier von einem Panel) selber verwalten.
Konkret:
Ich habe alle "Laufwerksbuttons" auf einem Panel. Damit ich bei "driveadd" und "driveremove" direkt und ordentlich die Button einordnen kann, muss ich sie als Komponenten von Panel "aufsteigend" sortieren, d. h. ein "niedrigerer Laufwerksbuchstaben" soll auch die kleinere Nummer haben.
Oder an die richtige Stelle einordnen. (Insertcomponent hängt aber die nächste Komponente immer hinten dran.)
Geht das Sortieren (So Components.customsort oder ähnliches) oder/und Einordnen direkt?
(Natürlich könnte man das alles über eine Liste verwalten, sortieren und bei Bedarf ALLE Komponenten des Panels löschen und wieder neu aufbauen. Aber, abgesehen von der Schreibarbeit, möchte ich soviel eigentlich gar nicht. Direkt die Komponentenliste nach eigenen Wünschen zu sortieren, wäre besser und schneller und ohne Flackern.)

Gruß
Mattze

Lannes 18. Jul 2007 23:07

Re: Komponentenliste selber verwalten?
 
Hallo,

weis nicht ob ich Dich richtig verstanden habe.

Den Index der Komponenten in der Liste Components kann man direkt ändern:
Delphi-Quellcode:
Button2.ComponentIndex := 0;

Mattze 19. Jul 2007 17:14

Re: Komponentenliste selber verwalten?
 
Hallo,

vielen Dank. Das ist es wahrscheinlich schon. Ich dachte, das wäre Read-only.
Also Komponenten in ein TList einlesen, sortieren, componentindex neu zuweisen.

Was macht Delphi bei der Zuweisung?
Beispiel: 10 Komponenten und ich weise der 10. die Nummer 7 zu. Rückt er den Rest automatisch auf?
(Also 7 wird dann zur 8, 8 zur 9 und 9 zur 10.)
Wäre nämlich ganz gut, weil man dann nach der Sortierung nur einen Wert zu ändern hat.

Gruß
Mattze

Lannes 20. Jul 2007 22:51

Re: Komponentenliste selber verwalten?
 
Hallo,

ja, probiers doch einfach mal aus. :zwinker:

//Edit: wozu die TList, die Liste Components steht doch schon zur Verfügung?

Mattze 21. Jul 2007 06:58

Re: Komponentenliste selber verwalten?
 
Hallo,

ich habe nach der Definition der Komponentenlist mal gesucht. Das ist eine TList und sie scheint nicht public.
Nur auf die eigentlichen Komponenten kann man mit ihren Indizes direkt zugreifen.
D. h., man muss die einzelnen Komponenten in eine TList einlesen - sozusagen als "externe" Komponentenliste.
Irre ich mich da? Vielleicht bin ich an der falschen Stelle fündig geworden.
Ich konnte jedenfalls kein Components als TList finden, nur einzelne Components[i].

Gruß
Mattze

SirThornberry 21. Jul 2007 08:17

Re: Komponentenliste selber verwalten?
 
irgendwie glaub ich das du es dir schwerer machst als es sein muss. Wenn du einfach nur mehrere Komponenten dynamisch erstellen willst und anordnen musst du doch nicht auf die interne Liste der Komponenten zugreifen können.

Jelly 21. Jul 2007 09:31

Re: Komponentenliste selber verwalten?
 
So wie Jens seh ich das auch.
Ich würde mir intern im Programm eine eigene TComponentList nehmen und alle dynamisch erstellten Komponenten für meine eigene Verwaltung dort reinhauen.

Mattze 21. Jul 2007 16:54

Re: Komponentenliste selber verwalten?
 
Hallo,

das ist doch eigentlich das, was ich meinte. Ich habe eine interne Liste von mir selbst verwaltet, die ich sortiere usw. und bei Bedarf eben zu Komponenten des Panels mache. Nur eine kleine Erweiterung, dass ich sie immer gegen die bestehenden Komponenten auf dem Panel gegenchecke.

Genauer zu meinen Laufwerksbuttons im Panel:
Bsp. "Es kommt ein neues Laufwerk an (driveadd als Changenotify)."
Da ich vorher nicht weiß, welchen Laufwerksbuchstaben das zugewiesen bekommt, es also nicht direkt "einsortieren" kann, baue ich mir eine Liste mit den Komponenten von Panel und ergänze die durch den neuen Button. Dann sortiere ich das. Und nun wird der neue Button entsprechend in das Panel eingebaut und der componentindex gesetzt. (Solange der Button.name gleich bleibt, geschieht nichts. Erst, wenn da etwas neues kommt, werden die Indizes verschoben - eigentlich ja nur das neue.)

Das sieht nun alles etwas unnötig aus, aber ich MUSS irgendwann mal For i:=0 to... für die Komponenten machen und da ich in der Schleife die Namen abteste, MUSS ich mich darauf verlassen können, dass der "spätere Name auch später kommt".

Ich verstehe das also eigentlich so, wie Ihr das ja empfohlen habt, oder?

Gruß
Matthias

Jelly 21. Jul 2007 18:43

Re: Komponentenliste selber verwalten?
 
In eine TComponentList kannst du beliebige TComponent reinknallen, also auch Buttons. Sortieren kannst du die auch recht leicht, da es bereits eine Sort Methode beinhaltet. Du musst dich nur noch drum kümmern, nach was sortiert werden soll, sprich du musst eine Compare Funktion selbst implementieren und den Pointer dieser Funktion (global definiert) an die Sort Methode übergeben.

Das Schöne an der TComponentList ist, im Vergleich zu einer TObjectList, dass wenn du den Button wieder freigibst, dieser auch gleich aus deiner ComponentList gelöscht wird.

Mattze 24. Jul 2007 16:36

Re: Komponentenliste selber verwalten?
 
Hallo

und oje! Da programmiere ich seit Delphis Anfängen mit Delphi, aber die Contnrs hat sich immer schön vor mir versteckt.
Ich wusste gar nicht, dass es das gibt. Mal sehen, welche Überraschungen da noch kommen...

Inzwischen habe ich das ganz vereinfacht gelöst. Mit einer sortierten Stringliste.
Da die Schalter alle als Namen nur den Laufwerksbuchstaben haben (der ist ja eindeutig), habe ich diese Namen in eine Stringlist eingelesen und als Objekt dazu den aktuellen Componentindex.
Dann den neuen dazu (mit TObject(-1)) - sortiert ist sofort. (Ist ja nicht viel).
Dann wieder die Komponenten durchgezählt und den Index mit dem Objekt der Stringlist verglichen.
Wird das falsch, dem neuen Button den "fälligen" Componentindex zugewiesen, der Rest wird automatisch verschoben. Dann noch die Positionierung (Left:=...) gesetzt bzw. für den Rest verschoben und alles ging sauber.

Ich glaube, die einfachste und schnellste Variante.

Gruß und trotzdem vielen Dank
Mattze


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 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