Listenfeld

B

ByeBye 31659

Hallo, hab da mal ein paar Fragen.

Ich muss eine kleine "Bücherdatenbank" erstellen. Hierzu habe ich ein Dialogfeld erstellt und einige Buttons. Es gibt die Buttons: Speichern/beenden, Buch einfügen, Buch ändern, Buch löschen und Buch suchen. Nun möchte ich aus einer Datei die Zeilen in enie Liste schreiben und diese Liste, dann in einem Listenfeld anzeigen lassen. Es sollen Buch_ID, Titel, Autor, Verlag, Jahr, Entleiher und Entleihdatum angegeben werden. In einer Konsolenanwendung habe ich dies bereits hinbekommen, allerdings möchte ich das jetzt in einem Dialogfeld realisieren oder in einem anderen Windowsfenster.

Ein Buch soll mit Hilfe von Textfeldern eingetragen, geändert, gelöscht oder gesucht werden können.

Was muss ich machen, um die Liste beim Start in das Listenfeld zu laden?
Und wenn diese dort im Feld ist, was müsste ich machen, damit Sie bei jeder Änderung sich aktualisiert.

Kann mir da jemand helfen? Möglichst genau beschreiben, bitte. Ich bin noch Anfänger...

Ich benutze Visual C++ 6.0 unter Windows NT.
 
Hi,

Solche Geschichten (wo Dinge herumgeschaufelt werden müssen) sind leider ein wenig umständlich, weil Du alles zu Fuß (oder per Hand) machen musst.

"Möglichst genau beschreiben" ist schwierig, weil ich das Programm dann schon selbst schreiben kann...

Wo hakt's denn als erstes? (Versuchen wir's step-by-step...)

G.
 
Hi,

so ich hab nun schon so einiges hinbekommen.

Er liest jetzt beim Start des Dialogfeldes eine Datei aus und schreibt die Daten in 4 verschiedene Listenfelder. Ausserdem kann man schon Daten hinzufügen in die Listenfelder und die Liste, und wenn man das Programm beendet wird die komplette Liste wieder in die Datei geschrieben.

Nun hab ich aber wieder ein paar Fragen.
Ich habe mir einen extra Scrollbalken rechts neben die Listenfelder gesetzt und die Scrollbalken der Listenfelder deaktiviert, wie mache ich das nun, das ich mit dem Scrollbalken die Listenfelder alle gleichzeitig steuern kann?

Und wie kann ich abfragen ob ein Element im Listenfeld markiert ist? Damit ich das später über eine Löschen Funktion aus der Liste entfernen kann!

Ich weiß sind viele Fragen dun eventuell auch dumme *GG* aber ihr würdet mir echt helfen wenn irh eine Antwort darauf habt.
 
Hi,

normalerweise wird beim synchronen scrollen zweier ListBoxen nicht ein extra ScrollBar danebengestellt, sondern eine ListBox mit der anderen synchronisiert (schon die Frage, warum die beiden ListBoxen dann überhaupt einen Scrollbar haben, verdeutlicht die Problematik: Was passiert, wenn ich in einer der beiden Boxen scrolle? Dann müssten alle drei Scrollbars synchronisiert werden - da ist es doch besser, wenigsten nur zwei Scrollbars synchronisieren zu müssen...)

Ich weiß, dass es am Internet "irgendwo" (da hammas wieder...) ein Beispiel für die Synchronisation zweier Listboxen gibt... aber ich habe keine Ahnung wo... :( )

Für die Ermittlung des selektierten Objekts gibt es die Funktion CListBox::GetCurSel(); den Text kannst Du dann mit CListBox::GetText() abfragen.

Wenn ich morgen neben Seminar vorbereiten, Unterlagen entwickeln, Verlag gründen, Buch zum Druck fertigmachen und zwei Songs überarbeiten noch Zeit habe, suche ich Dir die Synchronisations-Geschichte... :) )

G.
 
Zuletzt bearbeitet:
Ich habe mir einen extra Scrollbalken rechts neben die Listenfelder gesetzt und die Scrollbalken der Listenfelder deaktiviert, wie mache ich das nun, das ich mit dem Scrollbalken die Listenfelder alle gleichzeitig steuern kann?
Am besten lässt du die Listbox links liegen und verwendest CListview! Der Listview unterstützt nämlich im Gegensatz zur Listbox auch direkt mehrspaltige Listen. Er wird etwas anders gesteuert als die Listbox, es ist aber nicht viel komplizierter. Du kannst ihm zum Beispiel mit InsertColumn() weitere Spalten geben. CListview ist ordentlich dokumentiert. Falls du noch Tipps brauchst, frag mal nach. Wenn ich suche, finde ich wahrscheinlich etliche Codeschnipsel, die dir helfen könnten.
 
Hi,
ich hab mal versucht mir das mit InsertColumn() anzuschauene bekomme das aber nciht hin.
Er meckert dann immer bei:

IDC_LIST.InsertColumn(0, _T("Player Name"), LVCFMT_LEFT);

das der linke Teil von InsertColumn eine Klasse/Union etc sein muss.

Was mache ich denn falsch.

Langsam verzweifel ich, da ich nicht wirklich weiter komme.

Also falls mir jemand Codeschnipsel posten kann wäre das sehr nett.

Vielen Dank im voraus
 
IDC_LIST ist auch kein Member deines Dialoges, sondern nur einer Ressource-ID. Bau dir im Classwizard ein Listview-Control-Member in deinen Dialog ein (sowas wie m_MeinListview), das die Sterung des Listviews regelt (sozusagen :) ). Dann kannst du sowas machen wie:
m_MeinListview.InsertColumn(0, _T("Player Name"), LVCFMT_LEFT);

Wegen Codeschnipsel sehe ich gleich mal nach.
 
Zuletzt bearbeitet:
Hi,

danke, der Fehler ist nun weg.
Allerdings weiß ich noch nicht, wie ich nun die Spalten mit Text fülle.

Kannst du mir mal ein paar Stichwörter nennen, die ich nachschlagen kann? Bei MSDN komme ich so nicht viel weiter, leider.

Aber Code oder direkte Hilfe wären auch super.

Vielen Dank das du dir die Mühe machst.
 
So nun habe ich das mit dem Zeilenmarkeiren hinbekommen, bleibt aber wieder ein Problem übrig...

Wie kann cih die Listview aktualisieren wenn ich ein Element hinzugefügt habe?
Denn bei mir wird dies nicht in der listview angezeigt erst nach einem neustart....
 
Zuletzt bearbeitet von einem Moderator:
Such nach CListview. Dann solltest du dir alle Klassenmethoden auflisten lassen können.

Wie kann cih die Listview aktualisieren wenn ich ein Element hinzugefügt habe?
Also, wenn du es hinten anhängst, müsste es sofort angezeigt werden. Mittendrin einfügen geht nicht, soweit ich weiss.
Hast du mal testweise DeleteAllItems() (Oder wie die Funktion zum Löschen aller Einträge?) ausprobiert und geguckt, ob diese Änderung direkt angezeigt wird?
Einträge lassen sich übrigens mit SetItemText() IIRC ändern.
 
Zurück