// Lösungen zu "Richard Kaiser: C++ mit dem Borland C++Builder 2007", ISBN: 978-3-540-69575-2
// Copyright Richard Kaiser, 2007. http://www.rkaiser.de. All rights reserved.
// Diese Quelltexte dürfen in eigenen Programmen verwendet werden, wenn sie einen Hinweis auf die Quelle (die ersten beiden Zeilen) enthalten. In keinem Fall wird eine Haftung für direkte, indirekte, zufällige oder Folgeschäden übernommen, die sich aus der Nutzung ergeben.
// It is permitted to use this source text in programs of your own, provided that it contains a reference to the source (the first two lines above). All liabilities for use of the code are disclaimed.

#include <vcl\vcl.h>
#pragma hdrstop
#include "VecDVU.h"
#pragma resource "*.dfm"

TKBForm1 *KBForm1;
//---------------------------------------------------------------------------
__fastcall TKBForm1::TKBForm1(TComponent* Owner)
    : TForm(Owner)
{
}


// --------------- Aufgabe 1 a) ----------------------------

// Damit die Datenstruktur CKontobewegung auch noch in anderen
// Programmen verwendet werden können, in eine eigene Datei:
#include "..\..\CppUtils\KBDecl.h"

// Damit die Funktionen FormToKB und KBToForm auch noch in anderen
// Programmen verwendet werden können, in eine eigene Datei:
#include "..\..\CppUtils\KBForms.h"
// Für die Funktionen KBToForm und FormToKB muß das Formular
// den Namen "KBForm1" haben (im Objektinspektor setzen).


#include<vector>
#include<deque>
#include<list>
using namespace std;

typedef vector<Kontobewegung> Container;
// typedef list<Kontobewegung> Container; // geht nicht
// typedef deque<Kontobewegung> Container; // das geht auch

typedef Container::iterator Iterator;
Container c;
Iterator pos=c.begin();


// --------------- Aufgabe 1 g) ----------------------------

void EnableButtons()
{
KBForm1->first->Enabled =!c.empty();
KBForm1->last->Enabled  =!c.empty();

KBForm1->prev->Enabled=(!c.empty()) && (pos>c.begin());
KBForm1->next->Enabled=(!c.empty()) && (pos<c.end()-1);
KBForm1->Loeschen->Enabled =(!c.empty()) ;//&& (pos<=c.end()-1);
// Speichern ist immer enabled und muss nie geändert werden

// i)
if (c.empty())
  KBForm1->Label1->Caption="Container leer";
else
  KBForm1->Label1->Caption="Satz Nr. "+IntToStr(pos-c.begin()+1)+
                           " von "+IntToStr(c.end()-c.begin());
}

void __fastcall TKBForm1::FormCreate(TObject *Sender)
{
ClearKBForm(KBForm1); // nur zum Testen, damit man nicht so viele Werte
                      // eingeben muss

EnableButtons();
}

// --------------- Aufgabe 1 b) ----------------------------

void __fastcall TKBForm1::SpeichernClick(TObject *Sender)
{
c.push_back(FormToKB(KBForm1));

/* h) */ // Durch das Einfügen wird pos ungültig. Deshalb
/* h) */ // auf eine Position (z.B. die des angezeigten
/* h) */ // Datensatzes, also des letzten - wegen push_back) setzen.
/* h) */ pos=c.end()-1;

EnableButtons();
}

// --------------- Aufgabe 1 c) ----------------------------

void __fastcall TKBForm1::prevClick(TObject *Sender)
{ // Da dieser Button nur unter der Bedingung 'pos>c.begin()' enabled
  // ist, braucht diese Bedingung hier nicht mit 'if' geprüft werden.
  // Damit der Button immer im richtigen Zustand ist, muss die Funktion
  // EnableButtons nach jeder Veränderung des Containers oder von 
  // pos aufgerufen werden.
if (pos>c.begin()) // überflüssig, falls die Buttons immer richtig
  {                // enabled sind.
    pos--;
    KBToForm(*pos,KBForm1);
    EnableButtons();
  }
}

// --------------- Aufgabe 1 d) ----------------------------

void __fastcall TKBForm1::nextClick(TObject *Sender)
{
if (pos<c.end()-1) // Siehe den Kommentar in 'prevClick'
  {
    pos++;
    KBToForm(*pos,KBForm1);
  }
EnableButtons();
}

// --------------- Aufgabe 1 e) ----------------------------

void __fastcall TKBForm1::firstClick(TObject *Sender)
{
if (!c.empty())
  {
    pos=c.begin();
    KBToForm(*pos,KBForm1);
  }
else ClearKBForm(KBForm1); // Container leer
EnableButtons();
}

void __fastcall TKBForm1::lastClick(TObject *Sender)
{
if (!c.empty())
  {
    pos=c.end()-1;
    KBToForm(*pos,KBForm1);
  }
else ClearKBForm(KBForm1); // Container leer
EnableButtons();
}

// --------------- Aufgabe 1 f) ----------------------------

void __fastcall TKBForm1::LoeschenClick(TObject *Sender)
{
/* h) */ // Durch das Löschen wird pos ungültig. Deshalb 'pos' auf
/* h) */ pos=c.erase(pos); // eine Position setzen, damit der Iterator
                           // auch nach dem Löschen wieder gültig ist.
if (pos!=c.end())
  KBToForm(*pos,KBForm1);
else // pos == c.end(), d.h. das letzte Element wurde gelöscht
  {
    if (!c.empty())
      {
        pos--;
        KBToForm(*pos,KBForm1);
      }
    else // das einzige Element wurde gelöscht
      ClearKBForm(KBForm1);
  }
EnableButtons();
}

// --------------- Aufgabe 1 h) ----------------------------

// In den Lösungen von b) und f) enthalten

// --------------- Aufgabe 1 i) ----------------------------

// In EnableButtons() enthalten.
