TListbox - Manipulieren Sie das Layout von Bildern und Text?

8

Ich habe mit dem TListBox-Steuerelement herumgespielt, Bilder gezeichnet und die Schriftstile usw. geändert. Ich möchte es ein wenig erweitern und versuchen, die Elemente etwas mehr mit Einrückung und mehrstufiger Einrückung zu manipulieren.

Schauen Sie sich dieses Bild für eine bessere Idee an:

Die Idee ist, dass Elemente in der Liste, die zwischen Start- und Endelementen positioniert sind, entsprechend eingerückt werden sollten.

Also, um eine Idee zu geben, habe ich den Screenshot in Paint bearbeitet, so dass er ungefähr so ​​aussehen würde:

Wie würde man so vorgehen? Mein Gedanke war, durch die Listbox zu iterieren und in 2 separaten Variablen die Anzahl der Start- und Endelemente zurückzugeben, dann irgendwie festzustellen, wo die anderen Elemente sind und ob die Anpassung zwischen - aber meine Logik ist nie so gut: (

Zur einfacheren Verwendung habe ich unten den Code angegeben, um zu zeigen, wie ich die Bilder und Stile zeichne:

%Vor%

Ich würde mich über einige Tipps freuen, wie ich die Gegenstände manipulieren könnte. Ich weiß, dass ich ändern kann, wo die Bitmap und die Texte platziert werden, aber es gibt an, ob ein Element zwischen den Gruppen liegt oder nicht, und ob es die richtige Einzugsebene festlegt.

Ich hoffe, das macht Sinn, deshalb habe ich ein paar Bilder gemacht.

Danke:)

PS, ich schreibe nie kleine Posts Entschuldigung!

UPDATE MIT DEMARBEITEN

Ich habe Sertacs Antwort, der ich perfekt arbeite, dank Sertac angenommen.

Um anderen zu helfen, die sich vielleicht gerade ansehen - und weil ich OOP gelernt habe, möchte ich meinen Code zeigen, um zu sehen, ob er gut ist:)

Ich habe 2 Einheiten erstellt, Lib.pas enthält die Klassen für die Listenelemente, und Unit1.pas ist die Form1-Einheit (Ich habe Einheit 1 gekürzt, damit es klarer wird, was passiert):

Lib.pas

%Vor%

Unit1.pas

%Vor%

Es kann besser gemacht werden, dh die Bildindizes werden basierend auf der Items.Objects [] Eigenschaft zugewiesen, aber das funktioniert perfekt:)

    
menjaraz 05.12.2011, 13:56
quelle

2 Antworten

6

Eine Möglichkeit besteht darin, über Elemente zu iterieren und den Text zu ändern, um den Einzug anzuzeigen:

%Vor%

Da der Text von Elementen geändert wird, erfordert dieser Ansatz, den Text beim Zeichnen entsprechend zu testen:

%Vor%

(Bei dieser Methode wäre das Einrücken von Bildern ein wenig Arbeit, zähle die führenden Leerzeichen in einem Nachrichtentext usw.).


Wenn Objekte von Objekten nicht bereits verwendet werden, kann ein etwas besserer Ansatz darin bestehen, Einrückungen als Ganzzahl zu speichern und diese Informationen beim Zeichnen zu verwenden. Z.B. beim Iterieren:

%Vor%

Beim Zeichnen:

%Vor%     
Sertac Akyuz 05.12.2011, 15:04
quelle
3

Ich denke, Sie sollten wahrscheinlich stattdessen die TTreeView verwenden, die bereits das Einrücken untergeordneter Elemente unterstützt.

Um deine Frage zu beantworten, könntest du Rekursion benutzen, um die Gegenstände in deiner TListBox zu zeichnen. Mit Rekursion ist es einfach zu sehen, wie viele Ebenen tief Sie sind.

So arbeiten die meisten Parser, zB HTML-Parser.

Hier ist ein Pseudocode, der das Konzept veranschaulicht:

%Vor%

Sie werden in Ihrem Fall einen "versteckten" Wurzelknoten brauchen.

Sie würden die gleiche Logik verwenden, um Ihre Elemente zu einem TTreeView hinzuzufügen.

    
Marcus Adams 05.12.2011 14:33
quelle

Tags und Links