Kapitel 1 Eine Listbox erstellen und Dateiausgabe der Liste
1. Datei --> Neu --> Projekt
--> Vorlage MFC --> MFC-Anwendung
Name: BListbox
Projekt-Stil: MFC
Anwendungstyp: Auf Dialogfeldern basierend
MFC in einer statischen Bibliothek verwenden
Recourcesprache: Deutsch
UNICODE -Bibliotheken verwenden
Nach dem 'Fertigstellen' erscheint das Formular BListbox mit den beiden Buttons OK und Abbrechen
2. Wir entfernen den Button 'Abbrechen' und den Text TODO:... durch Markieren und Rechtsklick --> Löschen
Den OK - Button lassen wir zunächst so stehen. Wir markieren Ihn und sehen rechts das Eigenschaften-Fenster.
Hier finden wir u.a. die Beschriftung des Buttons --> Caption: OK und die --> ID: IDOK.
Jetzt rufen wir mit Rechtsklick den Klassen-Assistent (MFC Class
Wizard) auf. Unter Objekt-IDs sehen wir IDOK schwach markiert und in
den Meldungen BN_CLICKED markiert.
Nachdem wir den Button 'Handler hinzufügen...' gedrückt haben
und den Vorschlag für den Funktionsnamen angenommen haben, steht
unter Memberfunktionen die neue Zeile
OnBnClickedOk IDOK BN_CLICKED
Wir haben damit in der Quelldatei BListboxDlg.cpp die neue Funktion OnBnClickedOk() eingefügt.
Über den Button 'Code bearbeiten' gelangen wir an die Stelle im Quelltext:
void CBListboxDlg::OnBnClickedOk()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
CDialogEx::OnOK();
}
Da wir unser Beispielsprogramm auf diese Art nicht beenden wollen, kommentieren wir die Exit-Funktion auch aus: // CDialogEx::OnOK();
Wichtig: Wir bearbeiten anschließend den OK-Button noch einmal im Dialog-Fenster.
In der Übersicht links schalten wir auf den Reiter Resourcenansicht um
und öffnen die Baumstruktur, bis der Ordner Dialog geöffnet
ist. Jetzt können wir mit Doppelklick auf
IDD_BLISTBOX_DIALOG unsere Form wieder öffnen.
OK-Button in der Form markieren, Eigenschaften ändern:
ID: IDC_BEENDEN
Caption:
Beenden
Focus auf Beenden-Button und mit Rechtsklick den Klassen-Assistenten öffnen,
IDC_BEENDEN BN_CLICKED ist markiert.
Mit 'Handler hinzufügen...' erstellen wir die neue
Beenden-Funktion mit dem Memberfunktionsnamen OnBeenden . Dann noch
'Übernehmen' anklicken und mit
'Code bearbeiten' gelangen wir wieder in den Quellcode der Datei
BListboxDlg.cpp . Hier fügen wir den vor auskommentierten Code ein:
void CBListboxDlg::OnBeenden()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
CDialogEx::OnOK();
}
>>Soweit die Vorarbeiten<<
3. Nun richten wir 2 Listboxen ein. Die erste Liste enthält ein
Sortiment von Werkzeugen und die 2. Liste soll unsere Bestellliste
werden.
Wir gehen dazu wieder in die Resourcenansicht und Klicken doppelt auf
IDD_BLISTBOX_DIALOG . Die Dialogform mit dem Beenden-Button ist
wieder zur Ergänzung bereit.
Ganz rechts oben im Studio finden wir den Sticky-Knopf Toolbox bzw. geht es auch umständlicher von
der oberen Menüleiste aus unter Ansicht zur Zeile Toolbox. Der Dialog-Editor
enthält alle graphischen Symbole für den Ausbau unserer
Dialogform.
Wir platzieren die zwei Listboxen mit Klick auf 'List Box'
untereinander und geben Ihnen mit 'Static Text' eine
Überschrift: 'Werkzeuge Sortiment:' und
'Bestellliste:'
In der Sortimentsliste soll mehrfach ausgewählt werden, also tragen wir in den Eigenschaften ein:
ID: IDC_WERKZEUGE Selection: Mehrfach
Die Bestellliste dient nur zur Übersicht, es soll nichts selektiert werden:
ID: IDC_BESTELLUNG Selection: Einfach
Für die Bearbeitung benötigen wir noch 2 Knöpfe:
Zusammenstellen, wenn die Auswahl in der Sortimentsliste abgeschossen
werden soll und Speichern, wenn nach Prüfung der Bestellliste
alles richtig ausgewählt wurde.
ID: IDC_ZUSAMMENSTELLEN Caption:
Zusammenstellen und
ID: IDC_SPEICHERN
Caption: Speichern
Für die beiden neuen Button müssen noch Funktionen eingerichtet werden.
Button 'Zusammenstellen' markieren, Klassen-Assistent aufrufen,
IDC_ZUSAMMENSTELLEN und BN_CLICKED sind markiert, jetzt den
Button 'Handler hinzufügen...' drücken, dann geben wir der
Memberfunktion den Namen: OnZusammenstellen .
Entsprechend für den Button 'Speichern' den Memberfunktionsnamen OnSpeichern festlegen.
Nun können wir schon einmal 'probieren' , ob unser Projekt im
Compiler ohne Fehler durchläuft und der Linker ein
ablauffähiges Progamm herstellt:
Obere Menü-Zeile: Erstellen --> BListbox neu
erstellen . Wenn Sie jetzt alles richtig gemacht haben, erscheint im
Ausgabefenster des Studios:
========== Alles neu erstellen: 1 erfolgreich, Fehler bei 0, 0 übersprungen ==========
Dann können Sie das erste mal Ihr Programm starten mit Obere
Menüzeile --> Debuggen --> Starten ohne Debugging und
die folgende Windows-Box erscheint:
Wundern Sie sich nicht - Damit kann man natürlich noch nicht viel
anfangen... Im Sortiment wird nichts zur Auswahl angeboten, beim Klick
auf 'Zusammenstellen' passiert nichts und genauso wenig beim Klick auf
'Speichern'.
4. Am Anfang sollte im Werkzeug-Sortiment eine Liste verschiedener
Werkzeuge erscheinen. Man könnte das u.a. so programmieren, dass
durch ein Ladevorgang die aktuelle Angebotsliste geladen wird - aber
wir wollen für
den Anfang einfach eine feste Liste erscheinen lassen:
Alles, was vor Start des Programms zusätzlich organisiert sein
muß, wird in der Quelldatei BListboxDlg.cpp am Anfang
initialisiert. Dazu ist die folgende Funktion bereitgestellt:
BOOL CBListboxDlg::OnInitDialog()
{
...
...
return TRUE; // TRUE zurückgeben, wenn der Fokus nicht auf ein Steuerelement gesetzt wird
}
Suchen Sie den Kopf dieser Funktion in der Quelldatei. Etwas weiter
tiefer finden Sie am Ende innerhalb der Funktion etwa die folgenden
Zeilen:
// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
// wenn das Hauptfenster der Anwendung kein Dialogfeld ist
SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden
SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden
// TODO: Hier zusätzliche Initialisierung einfügen
return TRUE; // TRUE zurückgeben, wenn der Fokus nicht auf ein Steuerelement gesetzt wird
}
Zwischen // TODO: und return TRUE; wird der zusätzliche Code zur Anfangsinitialisierung eingeschoben:
// ListBox Werkzeuge Sortiment
//Ein Pointer pLB auf ein Datenfeld für die Listbox IDC_Werkzeuge wird deklariert
CListBox * pLB = (CListBox*) GetDlgItem ( IDC_WERKZEUGE ) ;
//Temporäre Stringfelder werden mit Daten gefüllt
int i;
CString ctmpk[5], ctmpw[5], ctmpz[21];
ctmpk[0] = "Werkzeug-Tragekoffer";
ctmpk[1] = "Steckschlüssel-Satz";
ctmpk[2] = "Schraubendreher-Satz";
ctmpk[3] = "Hebel-Kraftschneider";
ctmpk[4] = "";
ctmpz[0] = "Schlosserhammer";
ctmpz[1] = "Wasserpumpenzange";
ctmpz[2] = "Bolzenschneider";
ctmpz[3] = "Gummi-Schonhammer";
ctmpz[4] = "Tischkreissäge";
ctmpz[5] = "Stemm- und Abbruchhammer";
ctmpz[6] = "6-teiliges Maurer Set";
ctmpz[7] = "Bau- und Montageschrauber";
ctmpz[8] = "Elektro-Tacker";
ctmpz[9] = "Hochdruckreiniger";
ctmpz[10] = "Stufen-Stehleiter";
ctmpz[11] = "Leiterhaken";
ctmpz[12] = "Benzinmotorsäge";
ctmpz[13] = "Elektro-Kettensäge";
ctmpz[14] = "Baumschere";
ctmpz[15] = "Elektro-Heckenschere";
ctmpz[16] = "Benzin-Rasenmäher";
ctmpz[17] = "";
ctmpz[18] = "";
ctmpz[19] = "";
ctmpz[20] = "Universal-Bohrfutterschlüssel";
//Hier erfolgt die Einspeisung der temporären Datenzeilen in die Listbox
for(i=0;i<5;i++)
{
CListBox * pLB = (CListBox*) GetDlgItem ( IDC_WERKZEUGE ) ;
pLB -> InsertString ( -1 , ctmpk[i] ) ;
}
//Hier erfolgt eine weitere Einspeisung der temporären Datenzeilen in die Listbox
for(i=0;i<21;i++)
{
CListBox * pLB = (CListBox*) GetDlgItem ( IDC_WERKZEUGE ) ;
pLB -> InsertString ( -1 , ctmpz[i] ) ;
}
5. Nun werden die Funktionen, die hinter den Button 'Zusammenstellen' und 'Speichern' stehen ausgefüllt.
Zuvor brauchen wir noch eine Benutzdefinierte Variable für die Feststellung der Speicherung der Zusammenstellung.
Dazu rufen wir den Klassen-Assistenten auf und gehen auf den Reiter Membervariablen.
Button 'Benutzerdefiniert hinzufügen...' klicken und eingeben:
Typ: bool Member: m_Bwer_speichern
Jetzt ergänzen wir am Ende den Code zur Anfangsinitialisierung mit:
// Variable zur Kontrolle über das Abspeichern der Bestellung
m_Bwer_speichern = FALSE;
Zum Button 'Zusammenstellen' gehört die Funktion OnZusammenstellen()
Folgenden Code tragen wir ein:
//Wir besorgen uns einen Zeiger p_Best auf die Bestellungs-ListBox.
//Diese List Box muß zuerst geleert werden für den Fall,
//daß der Benutzer die Schaltfläche "Zusammenstellen"
//mehrfach anklickt:
CListBox * p_Best = (CListBox * ) GetDlgItem ( IDC_BESTELLUNG ) ;
p_Best -> ResetContent () ;
//p_Best -> InsertString ( -1 , _T("Ihre Bestellung enthält ") ) ;
// Menge der Werkzeuge aus der ListBox abholen
CListBox * p_Werk = (CListBox *) GetDlgItem ( IDC_WERKZEUGE ) ;
int i , anzahl_werkzeuge, * p_index ;
CString werkzeug ;
anzahl_werkzeuge = p_Werk -> GetSelCount () ;
if ( anzahl_werkzeuge > 0 )
{ p_Best -> InsertString ( -1 , _T("Zur Bestellung gehören:") ) ;
p_index = (int *) malloc ( anzahl_werkzeuge * sizeof ( int ) ) ;
p_Werk -> GetSelItems ( anzahl_werkzeuge , p_index ) ;
// Übertragung der zusammengestellten Werkzeuge in die Listbox Bestellung
for ( i = 0 ; i < anzahl_werkzeuge ; i ++ )
{ p_Werk -> GetText( *(p_index+i), werkzeug ) ;
p_Best -> InsertString ( -1 , werkzeug ) ;
}
free ( p_index ) ;
}
else
p_Best -> InsertString ( -1 , _T("Sie haben keine weiteren Werkzeuge bestellt") ) ;
// Variable zur Kontrolle über das Abspeichern der Bestellung
m_Bwer_speichern = TRUE;
Die Dateiausgabe ähnelt im Ablauf der anderer Programmiersprachen wie zum Beispiel C.
Zum Button 'Speichern' gehört die Funktion OnSpeichern()
Folgenden Code tragen wir ein:
CFileDialog file_dlg ( FALSE ) ; // FALSE sagt File Save as
// 1. Parameter reicht - Rest hat default-Werte
int result = file_dlg . DoModal () ;
if ( result == IDOK )
{ CString file_name = file_dlg . GetPathName( ) ;
CStdioFile out_file ;
//out_file ist der interne (von uns im Programm benutzte)Dateiname,
//file_name enthält den (vom Betriebssystem auf der Festplatte benutzten)
//externen Dateinamen.
if ( out_file . Open( file_name , CFile::modeCreate | CFile::modeWrite ) )
{
CListBox * p_Best = (CListBox * ) GetDlgItem ( IDC_BESTELLUNG ) ;
int i, anzahl_zeilen = p_Best -> GetCount() ;
CString zeile ;
for ( i = 0 ; i < anzahl_zeilen ; i ++ )
{ p_Best -> GetText ( i , zeile ) ;
out_file . WriteString ( zeile + "\n" ) ;
}
out_file . Close () ;
MessageBox (_T("Ihre Bestellung wurde gespeichert!"),
_T("Werkzeugeversand - Wir danken für Ihre
Bestellung"),
MB_ICONINFORMATION );
// Variable zur Kontrolle über das Abspeichern der Bestellung
m_Bwer_speichern = FALSE;
}
else
MessageBox (_T("Fehler beim Open - Speichern wurde abgebrochen") ) ;
}
else
MessageBox (_T("Speichern wurde abgebrochen") ,
_T("Werkzeugeversand") , MB_ICONERROR ) ;
Nun können wir wieder 'probieren' , ob unser Projekt im Compiler
ohne Fehler durchläuft und der Linker ein ablauffähiges Progamm
herstellt:
Obere Menü-Zeile: Erstellen --> BListbox neu
erstellen . Wenn Sie jetzt alles richtig gemacht haben, erscheint im
Ausgabefenster des Studios:
========== Alles neu erstellen: 1 erfolgreich, Fehler bei 0, 0 übersprungen ==========
Dann
können Sie das erste mal Ihr Programm starten mit Obere Menüzeile
--> Debuggen --> Starten ohne Debugging und die folgende
Windows-Box erscheint: