Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Datenbankanbindung in einer Klasse (https://www.delphipraxis.net/151824-datenbankanbindung-einer-klasse.html)

Jens Hartmann 2. Jun 2010 18:07


Datenbankanbindung in einer Klasse
 
Hallo zusammen,

ich hab mal wieder ein gedankliches Problem. Ich habe meine erste kleine eigene Klasse zum Parsen von Ereignissen geschrieben. Irendwie bin ich allerdings zur Zeit am Grübbeln, ob das alles so OK ist, was ich da zusammen bastel.

Eigendlich benötige ich in dieser Klasse jetzt Daten, die in einer DB gespeichert sind. Daher mal meine Frage, es ist ja keine Problem, in dieser Klasse jetzt auf meine Datenmodul zu zugreifen. Allerdings könnte ich die Klasse ja dann schon nicht mehr in einem anderen Programm verwenden.

Ist das Grundsätzlich OK, und habe ich da einen Denkfehler.

Muss ich eventuell diese Daten z.B. als StringList schon an die Klasse übergeben ? Dann wiederum weiß ich nicht, ob die Klasse noch so richtig sinnvoll ist, oder ob ich die 10 Funktion, dann besser im Programm selber als privat implementiere.

Ich hoffe ich konnte kurz beschreiben, was ich wissen möchte.

Danke und Gruß

Jens

H4ndy 2. Jun 2010 18:12

Re: Datenbankanbindung in einer Klasse
 
Du koenntest eine Grundklasse schreiben, welch die Daten verarbeitet, und dann fuer bestimmte Datenbanken einen spezifische Klasse ableiten, welche z.B. das passenden Datenmodul entgegen nehmen kann.

DeddyH 2. Jun 2010 18:13

Re: Datenbankanbindung in einer Klasse
 
Das hört sich für mich so an, als ginge das in Richtung Bei Google suchenobject persistence framework.

Jens Hartmann 2. Jun 2010 18:21

Re: Datenbankanbindung in einer Klasse
 
Hallo H4andy,

das habe ich auch schon überlegt. Die Frage ist nur, macht das alles Sinn. Ich denke, das die Klasse niemals jemand anderem was nutzen wird, da sie einfach zu speziell ist. Und ob ich Sie nochmal brauche, glaube ich nicht. Daher, hätte ich eigendlich keine Bauchschmerzen mit dem Datenmodul.

Ich habe nur überlegt, weil ich so langsam anfangen OO zu Porgrammieren und es auch so langsam verstehe und da sagt halt mein Verstand,wenn OO, dann auch nutzbar immer etc.

Allerdings, kam der Grundgedanke eine eigene Klasse einzusetzen, aus lerntechnischer Anforderung und um einige Funktion aus dem Quellcode auszulagern.

Da ich aber in diesen ausgelagerten Funktionen auch Daten aus der DB benötige, stehe ich halt jetzt vor diesem Problem.

Ich zeige mal den aktuellen Stand, vieleicht schlagt Ihr dann eh die Hände über dem Kopf zusammen....
Delphi-Quellcode:
Unit EventUtils;

interface

uses
  Windows,SysUtils,Classes,Dialogs, Datenbankanbindung;

type
  TMyEventParser = class
  private
    procedure GetParamsOfGServer(var Params : TStringList);
    procedure SetDisplayTextOn(Text : String);
  public
    function EventParseSetDisplay(EventList : TStringList; Event : String) : Boolean;
    function EventParseMakeCall(EventList : TStringList; Event : String) : Boolean;
    function EventParseClearDisplay(EventList : TStringList; Event : String) : Boolean;
  end;

implementation

{Prüft das aktuelle Ereignis auf Übereinstimmung bzw. den Inhalt der StringListe
 der gesamten Ereignisstrings des Gefahrenmeldesystems.
 Das Ergebnis führt die Funktion SetDisplayText aus}
function TMyEventParser.EventParseSetDisplay
  (EventList: TStringList; Event : String ) : Boolean;
var
  i : integer;
  DisplayText : String;
begin
  try
    Result := false;
    if EventList.IndexOf(Event) <> -1 then
      begin
        for i := 0 to EventList.Count - 1 do
          DisplayText := DisplayText + EventList[i];
        SetDisplayTextOn(DisplayText);
        Result := true;
      end;
  except
    Result := false;
  end;
end;
{Prüft das aktuelle Ereignis auf Übereinstimmung bzw. den Inhalt der StringListe
 der gesamten Ereignisstrings des Gefahrenmeldesystems.
 Das Ergebnis führt die Funktion MakeCall aus}
function TMyEventParser.EventParseMakeCall
  (EventList: TStringList; Event : String ) : Boolean;
var
  i : integer;
begin
  try
    Result := false;
    if EventList.IndexOf(Event) <> -1 then
      Result := true;
  except
    Result := false;
  end;
end;
{Prüft das aktuelle Ereignis auf Übereinstimmung bzw. den Inhalt der StringListe
 der gesamten Ereignisstrings des Gefahrenmeldesystems.
 Das Ergebnis führt die Funktion ClearDisplayText aus}
function TMyEventParser.EventParseClearDisplay
  (EventList: TStringList; Event : String ) : Boolean;
var
  i : integer;
begin
  try
    Result := false;
    if EventList.IndexOf(Event) <> -1 then
      Result := true;
  except
    Result := false;
  end;
end;

procedure TMyEventParser.SetDisplayTextOn(Text: string);
var
  slParams: TStringList;
  Cookie : String;
begin
  try
    slParams := TStringList.Create;
    GetParamsOfGServer(slParams);
    Dm_PS.idHttpGServer.Post('http://127.0.0.1:8801/login', slParams);
    Cookie:= DM_PS.idCookieGServer.CookieCollection.Items[0].CookieText;
    DM_PS.idHttpGServer.Request.CustomHeaders.Add('Cookie:' + Cookie);
    ShowMessage(Text);
  finally
    slParams.Free;
  end;
end;

procedure TMyEventParser.GetParamsOfGServer(var Params : TStringList);
begin
  Params.Add('gsUser=admin');
  Params.Add('gsPass=adminpass');
end;

end.
:gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel:

Gruß Jens

DeddyH 2. Jun 2010 18:28

Re: Datenbankanbindung in einer Klasse
 
Zum Quellcode sag ich jetzt mal nichts, aber das sieht mir nicht so aus, als ob die Klasse primär mit DB-Zugriff zu tun hat. Von daher würde ich falls notwendig einfach Properties dieser Klasse deklarieren, die die Daten aufnehmen. Woher diese Daten dann kommen, ist für die Klasse selbst irrelevant, das kann eine DB oder sonstwas sein.

Jens Hartmann 2. Jun 2010 18:35

Re: Datenbankanbindung in einer Klasse
 
Die Funktion, die Daten aus der DB benötigen, fehlen ja auch noch. In einer bislang vorhanden, habe ich die Daten zur Zeit einfach eingetragen.
Delphi-Quellcode:
procedure TMyEventParser.GetParamsOfGServer(var Params : TStringList);
begin
  Params.Add('gsUser=admin');
  Params.Add('gsPass=adminpass');
end;
Die Benutzerdaten, sind natürlich in einer DB gespeichert. Oder...

Delphi-Quellcode:
    GetParamsOfGServer(slParams);
    Dm_PS.idHttpGServer.Post('http://127.0.0.1:8801/login', slParams);
hier greife ich über DM_PS. schon auf meine Datenmodul zu. Und beim erstellen, ist mir halt dieses Problem jetzt aufgefallen.

Was heißt eigendlich, zum Code sage ich nichts. Nicht gelesen, oder Sche...?

Gruß Jens

DeddyH 2. Jun 2010 18:41

Re: Datenbankanbindung in einer Klasse
 
Nicht unbedingt Sch..., aber ein paar Flüchtigkeitsfehler sind schon drin. Und ich würde dann nicht fix auf das Datenmodul zugreifen, sondern mir ein Event samt Ereignisroutine definieren. Dann kannst Du von "außerhalb" sagen, was passieren soll, wenn das Event eintritt (siehe z.B. Komponenten, die machen das ja auch so).

Jens Hartmann 2. Jun 2010 18:45

Re: Datenbankanbindung in einer Klasse
 
Ja, aber ganau da habert es bei mir noch. Wenn Du übrigens die Exceptionbehandlungen und so meinst, die habe ich noch nicht geschrieben. Ich habe heute erst mit der Klasse angefangen.

Gruß Jens

DeddyH 2. Jun 2010 18:55

Re: Datenbankanbindung in einer Klasse
 
Nein, was ich meine (ein Beispiel):
Zitat:

Delphi-Quellcode:
procedure TMyEventParser.GetParamsOfGServer(var Params : TStringList);
begin
  Params.Add('gsUser=admin');
  Params.Add('gsPass=adminpass');
end;

TStringlist ist eine Klasse, es wird also eine Instanz übergeben. In den allermeisten Fällen macht es keinen Sinn, diese als Var-Parameter zu deklarieren, es sei denn, man wollte diese Instanz innerhalb der Routine neu zuweisen. Ich würde das so schreiben:
Delphi-Quellcode:
procedure TMyEventParser.GetParamsOfGServer(Params : TStrings);
begin
  if Assigned(Params) then
    begin
      Params.Add('gsUser=admin');
      Params.Add('gsPass=adminpass');
    end;
end;

Alfredo 2. Jun 2010 20:05

Re: Datenbankanbindung in einer Klasse
 
Zitat:

Ich habe nur überlegt, weil ich so langsam anfangen OO zu Porgrammieren und es auch so langsam verstehe und da sagt halt mein Verstand,wenn OO, dann auch nutzbar immer etc.
Mein persönlicher Rat: lass es.

Ich durfte mich ein Semester mit dem OO beschäftigen und am Ende, als ich es so richtig
verstanden hatte, hat der Professor dann zugeben müssen, dass die verwendete Sprache(Java)
nicht zu 100% für OOP geeignet ist.

Meines Erachtens steht der Aufwand für ein kleiners Unternehmen in keinen Verhältnis
zum Ertrag. Schau Dir so eine Programmierung nach ein paar Tagen wieder an. Du bekommst
die Krise. Versprochen.

Ein wirklicher EDV-Profi hat mir einmal geraten es bei einfachen Unterprogrammen zu be-
lassen und dort jede Menge an Debugcode für den Fehlerfall zu implementieren. Das geht
bei dem soweit, dass der größte Teil Debugcode ist. Er musste dafür schon etliche Kritik
vom Kunden einstecken. Die meisten sagen heute keinen Ton mehr, weil der Ernstfall einge-
treten und die Fehlerbehebung in sehr kurzer Zeit erfolgt ist.

Gruß
Alfred

H4ndy 2. Jun 2010 20:18

Re: Datenbankanbindung in einer Klasse
 
Sorry, aber wenn man komplett auf OOP verzichtet, kann man auch zurueck zu C gehen und sich nen Ast freuen und die Toolchain zum kompilieren anwerfen.

OOP hast seine Berechtigung - aber wie weit man nun abstrahieren und verpacken will, kommt immer auf die Aufgabe an. Wenns halt ein Objekt wird, was nicht unbedingt einfach wiederverwendbar ist (wie hier im Topic), aber seine Aufgabe effizient und sicher erledigt, dann isses halt so.

Und OOP haelt dich auch nicht davon ab, Debugcode hinzuzufuegen. Auch sollte man Unit-Tests und Mockups ins Auge fassen, wenn man ein komplexes Projekt anfaengt, dann sinkt die Anzahl an potentiellen Schwachstellen schonmal. Davon abgesehen, verbietet es dir Delphi auch nicht, die ein oder andere prozedurale Funktion zu implementieren. Gibt ja nicht umsonst abertausende von Tool-Units...

Alfredo 2. Jun 2010 20:36

Re: Datenbankanbindung in einer Klasse
 
Zitat:

Sorry, aber wenn man komplett auf OOP verzichtet, kann man auch zurueck zu C gehen und sich nen Ast freuen und die Toolchain zum kompilieren anwerfen.
Firmen die noch über entsprechende Mittel verfügen und unabhängig sein wollen tun dies.

Ich kann mir so etwas nicht mehr leisten. :)

Gruß
Alfred

Meta777 2. Jun 2010 20:59

Re: Datenbankanbindung in einer Klasse
 
Zitat:

Zitat von Jens Hartmann
Die Benutzerdaten, sind natürlich in einer DB gespeichert. Oder...

Delphi-Quellcode:
    GetParamsOfGServer(slParams);
    Dm_PS.idHttpGServer.Post('http://127.0.0.1:8801/login', slParams);
hier greife ich über DM_PS. schon auf meine Datenmodul zu. Und beim erstellen, ist mir halt dieses Problem jetzt aufgefallen.

Hallo,
ich weiß nett ob ich dein problem richtig verstanden habe aber du kannst ja für dein datamod eine private feldvariable nutzen die im Constructor erstellt und im Destructor freigegeben wird. die globalen datamod/form variablen sollte man nur bedingt nutzen. ggf. das datamod aus automatischen erstellung rausnehmen.

<EDIT: FDM. statt DM_PS orso nutzen />

nen bissl code: alles ohne gewähr frei hand usw getippt.
Delphi-Quellcode:
type
  TMyEventParser = class;
  private
    FDM: TDatamod;
  public
    Constructor Create; reintroduce;
    Destructor Destroy; override;
  end;

implementation

Constructor TMyEventParser.create;
begin
  FDM := TDatamod.Create(nil);
end;

Destructor Destroy;
begin
  FDM.Free;
end;
shalom

Jens Hartmann 2. Jun 2010 22:39

Re: Datenbankanbindung in einer Klasse
 
Zitat:

Zitat von Meta777
Hallo,
ich weiß nett ob ich dein problem richtig verstanden habe aber du kannst ja für dein datamod eine private feldvariable nutzen die im Constructor erstellt und im Destructor freigegeben wird. die globalen datamod/form variablen sollte man nur bedingt nutzen. ggf. das datamod aus automatischen erstellung rausnehmen.

Ich glaube schon das Du mich verstanden hast. Allerdings, wie das mit den Destructor und Constructer Sachen so geht, habe ich bislang noch nicht richtig verstanden. Auch das mit den Funktionen

Delphi-Quellcode:
 
reintroduce;
override;
Ich verstehe zwar, an Hand verschiedener Beispiele, ein wenig was override und Co so machen. allerdings das Zusammenspiel der entsprechenden Klassen/Objekt und deren Prozeduren und so weiter, da komme ich bei solchen Sachen immer durcheinander.

Wenn ich richtig verstehe, was Du mir sagen willst, würdest du eine Datamod in der Klasse erstellen um dann über dieses auf die DB zu zugreifen. Aber wie gesagt, da fehlen mir die gesamten Zusammenhänge. LEIDER. :gruebel:

Gruß Jens

Chemiker 2. Jun 2010 23:18

Re: Datenbankanbindung in einer Klasse
 
Hallo,

das TDataModule hat als Ereignisse selber OnCreate und OnDestroy kann sich also selber Erzeugen und wieder freigeben.
Zu beachten ist das es in der uses-Anweisung mit als erstes ausgeführt wird und in der Projekt-Option auf verfügbares Form gesetzt wird.

Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz