Wie virtuellen Datenzugriff gestalten?



  • Hi,

    ich würde gerne eine Datenbankkomponente gestalten, die ich bei der Compilierung über Compilerschalter je nach Bedarf entweder als Nachkomme einer vorhandenen Komponente (z.B. AdoTable oder AdoQuery) verwenden kann, oder mit der ich, ohne daß es für den Nutzer irgendwie bemerkbar ist über eigene Zugriffsmethoden auf Daten irgendwie im Speicher zugreifen kann. Das mit den Ado-Componenten ist nicht der Brüller, da kann man einfach davon ableiten. Aber wie ist es mit einem simulierten Datenbankzugriff. Irgendwie sollte das wohl mit TCustomDataset gehen oder mit TCustomClientDataset. Aber ich hab da nichts gefunden, wie man das irgendwie machen kann. Ich will einefach einen Rahmen haben in den ich die einzelnen Felder reinhänge und wo ich dann in die einzelnen Felder "von Hand" Daten reinpacke bzw. rauslese.
    Wäre schön, wenn irgend einer eine Idee oder einen Lnk oder eine buchempfehlung hat, wie man das in C++Builder oder Delphi realisieren kann.
    Schon immer vielen Dank im Voraus.

    Gruß Mümmel



  • Ich verstehe dein Anliegen nicht ganz. Du müsstest doch aber in der Lage sein ein Dataset mit einem Query-Objekt befüllen zu können. Alternativ kannst du es eben manuell befüllen, über Fields->Add / FieldDefs->Add solltest du ebenfalls eigene Spalten anfügen können, was ebenso im Designer möglich ist.
    Spezifische VCL-Literatur kenne ich nicht, falls du die ganz großen Runden plattformunabhängig implementieren willst kann ich dir den Fowler empfehlen:
    http://www.amazon.de/Patterns-Enterprise-Application-Architekturen-Martin-Fowler/dp/3826613783/ref=sr_1_1?ie=UTF8&s=books&qid=1245256403&sr=1-1



  • Hi Witte,

    das Problem ist nicht, daß ich die Felder nicht reinbekomme. Das Problem ist ganz einfach, daß ich keine "echte" Datenquelle haben möchte, sondern nur einen Rahmen in dem die Felder hängen und der so tut als wäre er z.B. eine TTable. Also eine Funktionalität, die zum Beispiel beim Scrollen irgendwoher die Daten holt und sie dann so anbietet als ständen sie in einer Datenbanks so dass man über die Fields darauf zugreifen kann. Also an der eigentlichen Funktionalität vorbei die Daten in die Felder mogeln.
    Plattformunabhängig geht leider nicht, muß schon VCL bleiben.

    Gruß Mümmel.



  • Hat er doch schon geschrieben, das du dir das über Fields->Add bzw. direkt im Objektinspektor selber "zusammenschrauben" kannst.



  • Hi Field,

    nein, darum geht es eben nicht. Das zusammenschrauben ist keinerlei Problem. Notfalls könnte man das Teil sogar im entwurf umdefinieren und die Feldliste aus einer realen Datenstruktur einlesen.

    Worum es mir geht, ist dass z.B. wenn mit Next auf den nächsten Datensatz gescrollt wird, daß dann irgendwie Daten, die ganz woanders herkommen in die einzelnen Felder reingefummelt werden müssen. Oder auch daß beim Post die neu in die Felder eingetragenen Werte in die dahinter stehende Datenstruktur übernommen werden müssen.

    Gruß Mümmel



  • Du kannst ein Dataset (z.B. TSQLClientDataSet) auch manuell befüllen, es muß nicht mit einer DB gefüttert werden. Dann verwendest du dataset->Append() und dataset->FieldByName("mycolumn")->AssignValue().
    Wenn du komplett virtuell arbeiten willst mußt du dir die entsprechenden Events mal anschauen TDataSet::OnNewRecord, TDataSet::BeforeScroll, TDataSet::AfterScroll ....
    Wenn du ein komplett manuell erstelltes Dataset dann in die DB exportieren willst kannst Du zuerst eine leere Datenmenge aus der DB anfordern damit er die manuell erstellten Zeilen als "inserted" flaggt und beim Einbringen in die DB in INSERT-Statements umformt.
    Das TSQLClientDataset z.B. kann dann mit einer TDataSource mit den UI-Controls ver bunden werden.



  • Hi Witte,

    Danke!!!, das löst doch schon die Sache in etwa. Kann ich eigentlich auch komplett auf das Befüllen verzichten und die Daten nur beim Zugriff sozusagen einblenden und beim Eingeben am Dataset vorbei in die eigentlichen Datenstrukturen füllen? Ich hab das z.B. mit nem stringgrid gemacht, wo ich leere Felder verwalte und in der OnDrwCell-Routine irgendwoher nehme und Anzeige bzw. OnGetEditText bzw. OnSetEditText zum Vorbeischummeln nehme. Hast Du da ne Ahnung ob sowas geht?

    Gruß Mümmel



  • Du könntest dir mal die Ereignisse von TDataSource anschauen. Möglicherweise läßt sich dort ein bypass legen. Viellicht gibt es auch VCL-Controls, die direkt den virtuellen Mode unterstützen. Damit habe ich mich aber nicht beschäftigt.



  • Hi Witte,

    danke, ich glaube das ist die Lösung. An DataSource hatte ich in dem Zusammenhang gar nicht gedacht.

    Gruß Mümmel


Anmelden zum Antworten