Entwickler-Ecke

Datenbanken - Nur 10 Einträge in die Datenbank eingeben, dannach ende!


m-werk - Di 02.07.02 10:06
Titel: Nur 10 Einträge in die Datenbank eingeben, dannach ende!
Hi, nun ist mein Programm fertig, und jetzt möchte ich eine DEMO-VERSION machen. Ich habe mir da folgendes vorgestellt:

Ist es möglich, dass ich, da ich eine Access-DB habe, nur 10 ode 20 Einträge machen kann und sobald diese erreicht sind, dass ich dann KEINE weiteren einträge erstellen kann?

Es soll aber, wenn die 10 einträge erreicht wurden, dann ein Info-Fenster erscheinen wo drinn steht, 'Bitte fordern Sie jetzt die Original-Software an'

Der User soll aber innerhalb der 10 Einträge trotzdem ändern, navigieren usw. können.

Ist das überhaupt möglich? Wenn ja, wie?


Klabautermann - Di 02.07.02 10:21

Hi,

du könntest das z.B. im Befor Insert Ereignis deiner Tabelle abfragen:


Quelltext
1:
2:
3:
4:
IF (Demo AND (DataSet.Count > 10)) THEN BEGIN
      ShowMessage('Der neue Datensatz kann nicht angelegt werden, da bereits mehr als 10 Datensätze angelegt wurden.');
      Dataset.Cancel;
END;


Gruß
Klabautermann


m-werk - Di 02.07.02 14:20

Hi, was bedeutet eigentlich 'demo'

If (Demo AND .....


Chris1308 - Di 02.07.02 14:24

Das ist eine Variable oder eine Funktion, des Typs Boolean, die hergibt, ob es eine Demo ist.

Chris1308

PS: Ich hab' mal die Antwort übernommen... :lol:


Klabautermann - Di 02.07.02 14:45

Danke Chris1308,

genau so ist es. (Kann auch 'ne Konstante sein)
Das sollte andeuten, dass dieser Code nur in der Demo Version ausgefürt werden darf. Wie du festlegst ob das Aktuelle Compilat eine Demo- oder Vollversion wird ist natürlich dir überlassen.

Gruß
Klabautermann


m-werk - Di 02.07.02 14:46

Und wie sieht der Code für die funktion von DEMO aus?


Klabautermann - Di 02.07.02 14:53

Sowas,
fast gleichzeitig gepostet.

Also nocheinmal. Wie du das machstr ist dir überlassen.

Die einfachste möglichkeit ist es an einer Zentralen Stelle (z.B. in einer Konstantenunit uConst) eine entsprechende Constante zu definiern.

Quelltext
1:
2:
CONST
  Demo = TRUE {FALSE};

und dann überall wo du eine Demoeinschränkung haben willst eine Abfage ala

Quelltext
1:
IF Demo THEN                    

zu machen. Du must natürlich jeweiws uConst (um bei dem vorschlag zu bleiben) einbinden. Je nachdem ob du True oder False auskommentiert hast Compiliertst du dann eine Demoversion oder nicht.

Ein halbwegserfahrener Cracker macht dir aber in ein paar Minuten wieder eine Vollversion aus deinem Demo.

Sich vor den Jungs und Mädels zu schutzen ist aber ein Thema für sich, das sehr viel Diskusionspotential bietet.

Gruß
Klabautermann


m-werk - Di 02.07.02 16:29

Hi, ich hab noch nicht ganz kapiert, wo ich diesen Code hinsetzen muß


Quelltext
1:
2:
CONST 
  Demo = TRUE {FALSE};


Alles andere dürfte anundfürsich klar sein.
Danke vorerst einmal


Steffer - Di 02.07.02 17:12

Demo solle eine Function sein...

if DemoVersion
then ...nur 10 Datensätze
else ... leg soviele an wie du willst

Du must doch irgendwo angeben/erkennen ob es sich um eine Demoversion handelt, oder?


Klabautermann - Di 02.07.02 17:48

Hallo,

m-werk hat folgendes geschrieben:
Hi, ich hab noch nicht ganz kapiert, wo ich diesen Code hinsetzen muß

Quelltext
1:
2:
CONST 
  Demo = TRUE {FALSE};


also ich habe in meinen Projekten immer eine Unit uConst, in welcher ich (wie der name sagt) Konstanten speichere.

Wenn du dieses Prinzip übernehmen willst, dann lege eine neue Unit an (Datei->Neu->Unit) und füge deine Zeile und gegebenenfalls weitere Konstanten ein:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
unit uConst;

interface

CONST
  // Liegt eine Demoversion vor
  Demo = TRUE {FALSE};

  // Zeitkonstanten zur einfacheren Arbeit mit tDateTime (nur als Beipiel für weitere Konstanten)
  zei_hour = 1/24;
  zei_min = Zei_Hour / 60;
  zei_Sec = Zei_Min / 60;

implementation

end.


Das ganze Speicherst du unter einem sinvollen Namen (z.B. uConst).
Jetzt musst du in den uses einer jeden Unit den Namen deiner eben neu erstellten schreiben.

Quelltext
1:
2:
3:
4:
implementation
{$R *.DFM}
uses
  uConst;


Danach kannst due Demo wie gezeigt verwenden.

Gruß
Klabautermann

PS: @Steffer lass uns die Sache mal langsam angehen. Verbesserungen kann man leichter ansetzen wenn das Grundprinziep verstanden wurde.


Steffer - Di 02.07.02 18:40

@Klabautermann
Wobei das Grundprinzip ja nicht SOOO schwierig ist.

Aber du hast Recht.
Ich verzichte auch auf alle Einwände hinsichtlich der Verwendung von Konstanten als Angabe zur Demoversion :wink:


Klabautermann - Di 02.07.02 20:48

Hi,

aufgeschoben ist ja nicht aufgehoben ;).
Ich habe nur das Gefühl, dass wir hier für m-werk einige neue Dinge bringen (z.B. den Datentyp Boolean ?!?), da sollten wir es nicht überteiben damit er nicht die Lust verliert (und es ihm nicht zu einfach machen, damit er was lernt :twisted:).

Also m-werk, du bist am Zug. Verstehst du alles oder sollen wir dir noch etwas erklären.

Erwartungsvoll
Klabautermann


m-werk - Mi 03.07.02 08:11

Hi, das mit dem 'Const' als eine eigene Unit ist eine sehr gute Idee. Das werd ich gleich mal ausprobieren.

Man kann ja dann theoretisch für einige Funktionen, die auf einigen forms gleich sind ja immer eine eigene Unit machen, damit auch eine gewisse ordnung und übersicht herscht, oder?

Danke für den vorschlag.


Klabautermann - Mi 03.07.02 09:54

m-werk hat folgendes geschrieben:
Man kann ja dann theoretisch für einige Funktionen, die auf einigen forms gleich sind ja immer eine eigene Unit machen, damit auch eine gewisse ordnung und übersicht herscht, oder?


Ja, dafür wurden die Units ursprünglich "erfunden". Wenn einige proceduren und Funktionen Thematisch zusammenhängen, kannst du diese auch in Objekten-Zusammenfassen - aber das ist ein anderes Thema.

Wenn du das prinzip der Demo Geschichte und warum die bedingung

Quelltext
1:
IF DEMO THEN                    

funktioniert, verstanden hast, dann kann Steffer dir ja erklären, warum eine funktion besser ist als eine Konstante.

Gruß
Klabautermann


m-werk - Mi 03.07.02 10:30

Ja, das mit der funktion habe ich schon verstanden.

If Demo then....

Wenn das Programm eine Demoversion ist, dann soll diese Funktion oder Procedure ausgeführt werden ansonsten soll eine andere Funktion oder Procedure ausgeführt werden.

(Dies ist jetzt eingedeutscht)

Ich bin aber gerade drauf gekommen, dass aber eigentlich das gar nicht nötig bei meinem Programm ist.

Ich habe ja 2 Versionden davon. Eine Version ist die Vollversion und die andere Version ist die Demo Version.

Dann bräuchte ich ja eigentlich die funktion von demo überhaupt nicht. Ich kann ja direkt bei der Demoversion sagen:


Quelltext
1:
2:
3:
4:
IF (DataSet.Count > 10) THEN BEGIN 
      ShowMessage('Der neue Datensatz kann nicht angelegt werden, da bereits mehr als 10 Datensätze angelegt wurden.'); 
      Dataset.Cancel; 
END;


Das müßte ja eigentlich reichen, oder?


Tino - Mi 03.07.02 11:04

m-werk hat folgendes geschrieben:
Dann bräuchte ich ja eigentlich die funktion von demo überhaupt nicht. Ich kann ja direkt bei der Demoversion sagen:
Aber dann entwickelst Du ja 2 Programme getrennt von einander. Mach es so wie es oben vorgeschlagen wurde. Also eine Funktion die etwas so aufgebaut ist:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Funtion IsDemo: Boolean;
Begin
{$IFDEF DEMOEDITION}
  IsDemo := True;
{$ELSE}
  IsDemo := False;
{$ENDIF}
End;

Und überall wo es einen Unterschied zwischen Demo und Vollversion gibt machst Du halt die o. g. Prüfung rein.

Dadurch hast Du nur ein Projekt das du Pflegen musst und kannst dann beim Compilieren einfach per Conditional-Define festlegen welche Version Compilert werden soll.

Gruß
TINO


*Dawson* - Fr 05.07.02 14:14
Titel: Conditional-Define ?!
Hallöchen...

jetzt wird es Interessant.. wie bekommt denn meine Demo Variable beim Compilieren mit, ob ich eine Demo oder Full Version Compiliere ?

Ich kenne zwar in den Optionen die möglichkeit TESTVERSION zu aktivieren, aber ist es auch damit möglich im Programm darauf zu reagieren ?

Grüße Marcus


Tino - Fr 05.07.02 14:16
Titel: Re: Conditional-Define ?!
*Dawson* hat folgendes geschrieben:
wie bekommt denn meine Demo Variable beim Compilieren mit, ob ich eine Demo oder Full Version Compiliere ?

Habe ich doch oben geschrieben: per IFDEF!


*Dawson* - Fr 05.07.02 14:26
Titel: upps übersehen...
Na das hab ich ja voll nicht gesehen... sorry.

Also reagiert die Abfrage: {$IFDEF DEMOEDITION}
auf das Optionsfeld: Testversion ?!

Spielt es eine rolle, ob Deutsche oder Englische Delphi Version, oder ist dies bei beiden gleich ?

Marcus


Tino - Fr 05.07.02 14:38

Wo gibt es denn die Option Testversion?

Wenn Du in den Projektoptionen -> Verzeichnisse/Bedingungen -> Bedinungen z. B. DEMOEDITION angibst kannst Du halt im Code prüfen ob dieser Coditional-Define gesetzt ist.

Also: Ob das Conditional-Define DEMOEDITION gesetzt ist (in den Projektoptionen [s. 2. Absatz] oder direkt im Code) oder nicht kannst Du dann halt im Code mit
{$IFDEF DEMOVERSION} ... {$ENDIF}prüfen!

Gruß


*Dawson* - Fr 05.07.02 14:46

Dachte Du meintest die Option unter den Projektoptionen -> Versionsinfo -> Modulattribute
so das Delphi dieses Modulattribut ausliest und in DEMOVERSION speichert... aber jetzt ist es klar.

Danke und gruß

Marcus