![]() |
MDI Anwendung: Auflistung der Children in einer Listbox
Hallo,
auch wenn ich hier schon einige Zeit Delphi 8 & 2005 liegen habe, fange ich jetzt erst mein erstes großes .NET Projekt an :P. Die MDI Anwendung selber (das Grundgerüst) habe ich quasi schon. Nur an einer Sache scheitere ich gerade: Es können verschiedene Dateien geladen und in einem Editor-Fenster in einem Child angezeigt werden. Alle Children sollen in einer Listbox und vielleicht auch noch in einem Tabcontrol aufgelistet werden. Das klappt auch theoretisch. Jedoch möchte ich nur den Dateinamen (nicht den ganzen Pfad) in der Box anzeigen. Das Problem dabei ist dass ja theoretisch 2 oder mehr gleichnamige Dateien in verschiedenen Dateien auftreten können. Da ich anhand des angezeigten Namens das passende Child suche, ist das ganze nicht eindeutig, es kann also auf einen Dateinamen mehrere Children kommen. Wie könnte man das Problem elegant umgehen? Mein Source zum Anzeigen des Fensters (LB_Dok ist die Listbox, in der die Children aufgelistet werden):
Delphi-Quellcode:
Eine Idee wäre ja, irgendwie in der Listbox Pfad und Titel zu "speichern".
for i:=0 to Length(Self.MdiChildren)-1 do
if (Self.MdiChildren[i] is TMDIChild) then begin if (TMDIChild(Self.MdiChildren[i]).Text = LB_Dok.SelectedItem.ToString) then begin TMDIChild(Self.MdiChildren[i]).BringToFront; break; end; end; Aber wie bekommt man das hin? Ich freue mich schon auf eure Ideen und Lösungsansätze :) |
Re: MDI Anwendung: Auflistung der Children in einer Listbox
Ich hatte ein ähnliches Problem vor kurzem auch, mit .NET 2.0 zwar, aber soviel sollte da nicht anders sein. Und zwar kannst du in einer Listbox nicht nur Strings, sondern beliebige Objekte speichern :)
Entweder machst du dir also dafür ne Klasse, deren ToString-Methode genau die Anzeige liefert, die du willst, oder du speicherst direkt deine Fenster da drin und zeichnest die Listbox-Items per Ownerdraw. Bei den "größeren" Listenelementen, also ListView und TreeView, bieten die jeweiligen Itemklassen ein Data- bzw. Tag-Member an, in dem man sowas speichern kann. |
Re: MDI Anwendung: Auflistung der Children in einer Listbox
Hi,
vielen Dank. Die Tag Eigenschaft habe ich auch gesucht gehabt. Aber die gibt es ja scheinbar nur bei der Listbox. Aber das mit der Klasse hört sich gut an oder ich nehme wirklich die Listview. Wäre vielleicht gar nicht so schlecht :gruebel: |
Re: MDI Anwendung: Auflistung der Children in einer Listbox
So ich habe es gerade mal mit der Tag Eigenschaft der Listview probiert. Das klappt wunderbar.
Aber ich habe gerade noch ein Problem. Da es auch noch zu dem Titel meines Threads passt, poste ich es mal hier: Also wenn ich ein Child schließe, muss das Items ja auch wieder entfernt werden. Also habe ganz einfach im Closing-Event des Fensters eine Methode im Hauptfenster aufgerufen mit:
Delphi-Quellcode:
Das scheint problemlos zu klappen. Wenn ich jetzt aber in dieser Methode auf die Listview zu greife, bekomme ich die folgende Zugriffsverletzung um die Ohren geworfen:
TMainFrm(owner).ChildClose(Self.text, Self.path);
Zitat:
Delphi-Quellcode:
Irgendwie komme ich damit nicht weiter. Bei Delphi mit Win32 habe ich das eigentlich öfters so gemacht :gruebel:
public
procedure ChildClose(t, p : String); [...] procedure TMainFrm.ChildClose(t, p : String); var i : Integer; begin // Child aus Listbox entfernen for i:=0 to LView_Dok.Items.Count -1 do if (LView_Dok.Items.Item[i].Text.Equals(t) and LView_Dok.Items.Item[i].Tag.Equals(p)) then begin LView_Dok.Items.RemoveAt(i); break; end; end; |
Re: MDI Anwendung: Auflistung der Children in einer Listbox
Naja, was genau ist null? Das muss dir dein Debugger erstmal verraten, bevor man hier blind rät :)
|
Re: MDI Anwendung: Auflistung der Children in einer Listbox
Das ist eine gute Frage. So bald ich auf die Listview zu greife, knallt es. Self ist null, er scheint also das gesamte Form verloren zu haben :gruebel:. Vielleicht rufe ich die Methode einfach falsch auf (also vom child aus)?
|
Re: MDI Anwendung: Auflistung der Children in einer Listbox
Naja, ich weiß es nicht, wie machst du denn den Aufruf?
|
Re: MDI Anwendung: Auflistung der Children in einer Listbox
Hatte ich oben schon geschrieben:
Delphi-Quellcode:
procedure TMDIChild.TMDIChild_Closing(sender: System.Object; e: System.ComponentModel.CancelEventArgs);
begin TMainFrm(owner).ChildClose(Self.text, Self.path); end; |
Re: MDI Anwendung: Auflistung der Children in einer Listbox
Keiner eine Idee? Schade :sad:.
Was ich aber durch Zufall herausgefunden habe, ist dass das MainMenu diese Auflistung automatisch verwalten kann. Man muss nur MDIList des entsprechenden MainMenu Items auf true setzen und schon wird das alles automatisch gemacht. Sehr nett :). Dennoch möchte ich das wohl auch gerne in der Listviw angezeigt haben bzw. beim Schließen des Fensters auch wieder vernünftig entfernt haben :) |
Re: MDI Anwendung: Auflistung der Children in einer Listbox
Zitat:
Aber wie OregonGhost schon sagte, es geht mit Objekten viel leichter, Stringvergleiche fallen komplett weg. Beispiel:
Delphi-Quellcode:
In den Properties der ListBox1 noch DisplayMember = "FileName" einstellen, fertig.
listBox1.Add(new Form2('C:\foo\bar.txt'));
[...] Form2 = class(Form) private path: String; public property FileName: string read Path.GetFileName(path); end; [...] listBox1.Remove(myClosedForm); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 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