![]() |
prozeduren auslagern
Ich weis das dieses Thema schon oft behandelt wurde, habe auch etwas hier schon nach gelesen.
Aber ich komme nicht auf die Lösung. Wie bekomme ich meine Procedure ausgelagert in eine andere Unit. Und wie Rufe ich Sie wieder auf. Habe das soweit geschrieben damit erzeuge ich eine Datenbank ich habe davon noch mehr und würde sie gerne alles auslagern. Die Komponenten sitzen aber auf der Form1 geht das so überhaupt??
Delphi-Quellcode:
unit Datenbankerzeugen;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls,DB, DBTables, ComCtrls, Buttons, ColorGrd; type TDatenbankerzeugen = class(TForm) procedure tabelleerst; private pfad : string; end; implementation Uses Unit1,unit10; //======================Benutzertabelle erstellen=============================== procedure TDatenbankerzeugen.Tabelleerst; begin Form1.Table1.close; getdir(0,Pfad); With Form1.Table1 Do //Tabelle erzeugen begin DatabaseName:= Form1.Serverpfad + 'Datenbank\'; //Pfad zur Tabelle Form10.Table1.DatabaseName:= Form1.Serverpfad + 'Datenbank\'; TableName:= 'Benutzerverwaltung.DB'; TableType:= ttParadox; end; if not FileExists( Form1.Serverpfad + 'Datenbank\Benutzerverwaltung.DB') then begin With Form1.Table1 Do begin with FieldDefs Do //Datenfelder erzeugen begin Clear; Add('Nr.',ftAutoInc,0,True); Add('Benutzername',ftString,30,True); Add('Passwort',ftString,30,False); Add('Administrator',ftboolean,0,False); Add('Versuche',ftInteger,0,False); Add('Gesperrt',ftString,5,False); end; with IndexDefs do //Index Schlüssel erzeugen begin Clear; Add('Nr','Nr.',[ixPrimary, ixUnique]); // Primär Index end; CreateTable; begin //User erzeugen Form1.Table1.Open; //Tabelle öffnen zum Schreiben Form1.Table1.Edit; Form1.Table1['Benutzername']:= 'Admin'; Form1.Table1['Passwort']:= '123'; Form1.Table1['Administrator']:= True; Form1.Table1['Versuche']:= 0; Form1.Table1['Gesperrt']:= 'Nein'; //Table1['Versuche']:= 'Nein'; Form1.Table1.Post; //Eintrag übernehmen Form1.Table1.Close; //Tabelle schließen end; end; end; Form1.Table1.Active:= True; //Tabelle1 auf Form1 aktivieren Form10.Table1.Active:= True; //Tabelle1 auf Form10 aktivieren end; end. |
Re: prozeduren auslagern
Übergebe die Form als Parameter.
BTW. Man sollte vermeiden feste Instanzen zu adressieren!!!! |
Re: prozeduren auslagern
Zitat:
|
Re: prozeduren auslagern
meinst du etwa so??
Delphi-Quellcode:
unit Datenbankerzeugen;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls,DB, DBTables, ComCtrls, Buttons, ColorGrd; procedure tabelleerst; implementation Uses Unit1,unit10; //======================Benutzertabelle erstellen=============================== procedure Tabelleerst; Var pfad : string; begin Form1.Table1.close; getdir(0,Pfad); With Form1.Table1 Do //Tabelle erzeugen begin DatabaseName:= Form1.Serverpfad + 'Datenbank\'; //Pfad zur Tabelle Form10.Table1.DatabaseName:= Form1.Serverpfad + 'Datenbank\'; TableName:= 'Benutzerverwaltung.DB'; TableType:= ttParadox; end; if not FileExists( Form1.Serverpfad + 'Datenbank\Benutzerverwaltung.DB') then begin With Form1.Table1 Do begin with FieldDefs Do //Datenfelder erzeugen begin Clear; Add('Nr.',ftAutoInc,0,True); Add('Benutzername',ftString,30,True); Add('Passwort',ftString,30,False); Add('Administrator',ftboolean,0,False); Add('Versuche',ftInteger,0,False); Add('Gesperrt',ftString,5,False); end; with IndexDefs do //Index Schlüssel erzeugen begin Clear; Add('Nr','Nr.',[ixPrimary, ixUnique]); // Primär Index end; CreateTable; begin //User erzeugen Form1.Table1.Open; //Tabelle öffnen zum Schreiben Form1.Table1.Edit; Form1.Table1['Benutzername']:= 'Admin'; Form1.Table1['Passwort']:= '123'; Form1.Table1['Administrator']:= True; Form1.Table1['Versuche']:= 0; Form1.Table1['Gesperrt']:= 'Nein'; Form1.Table1.Post; //Eintrag übernehmen Form1.Table1.Close; //Tabelle schließen end; end; end; Form1.Table1.Active:= True; //Tabelle1 auf Form1 aktivieren Form10.Table1.Active:= True; //Tabelle1 auf Form10 aktivieren end; end. |
Re: prozeduren auslagern
Da deine Funktion so eng mit deinem Programm verbunden ist, macht eine Auslagerung wenig sinn.
Mit festen Instanzen meine ich Form1, Form19 usw. |
Re: prozeduren auslagern
Ich wollte halt nur den Quelltext für die Datenbanken in eine Unit schreiben, da demnächst so an die 20 Dadtenbanken noch dazu kommen.
Und Deshalb wollte ich das etwas sotiert haben und übersichtlicher. Ist das den Falsch wenn ich das so mach rein vom Programmieren her. Habe es auch schon wie ich dann die Procedure in einer anderen Unit aufrufe.
Delphi-Quellcode:
War ja garnet so schwer
Datenbankerzeugen.tabelleerst;
|
Re: prozeduren auslagern
Ich würde auf alle Fälle versuchen, das allgemeiner zu programmieren, sicher hast du durch OOP auch einige Vorteile, wobei ich nicht weiß, welche 20 Dinge dazu kommen.
Sonst übergibt lieber im Parameter ein TTable-Objekt und arbeite mit diesem dann, damit die Funktion unabhängig von Formularen und den darauf sitzenden Controls ist:
Delphi-Quellcode:
Nur um eine Verbesserung zu nennen.
procedure Tabelleerst(MyTable: TTable);
|
Re: prozeduren auslagern
Ich kpier das nicht so ganz.
Wie bekomme ich die Verbindung zur Komponete her?? |
Re: prozeduren auslagern
In dem du diese der Prozedur übergibst:
Delphi-Quellcode:
Tabelleerst( Form1.Table);
|
Re: prozeduren auslagern
Das Beispiel zu Form1.Table könnte grob so aussehen:
Delphi-Quellcode:
Der Aufruf der Prozedur erfolgt aus Form1 dann so:
procedure Tabelleerst(MyTable: TTable);
var pfad : string; begin MyTable.Close; // ...
Delphi-Quellcode:
Tabelleerst(Table1);
|
Re: prozeduren auslagern
Ok wäre es so richtig?
Delphi-Quellcode:
Aufruf in der anderen Unit:
unit Datenbankerzeugen;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls,DB, DBTables, ComCtrls, Buttons, ColorGrd; procedure tabelleerst(Table1: TTable); implementation Uses Unit1,unit10; //======================Benutzertabelle erstellen=============================== procedure Tabelleerst(Table1: TTable); Var pfad : string; begin Table1.close; getdir(0,Pfad); With Table1 Do //Tabelle erzeugen begin DatabaseName:= Form1.Serverpfad + 'Datenbank\'; //Pfad zur Tabelle Form10.Table1.DatabaseName:= Form1.Serverpfad + 'Datenbank\'; TableName:= 'Benutzerverwaltung.DB'; TableType:= ttParadox; end; if not FileExists( Form1.Serverpfad + 'Datenbank\Benutzerverwaltung.DB') then begin With Table1 Do begin with FieldDefs Do //Datenfelder erzeugen begin Clear; Add('Nr.',ftAutoInc,0,True); Add('Benutzername',ftString,30,True); Add('Passwort',ftString,30,False); Add('Administrator',ftboolean,0,False); Add('Versuche',ftInteger,0,False); Add('Gesperrt',ftString,5,False); end; with IndexDefs do //Index Schlüssel erzeugen begin Clear; Add('Nr','Nr.',[ixPrimary, ixUnique]); // Primär Index end; CreateTable; begin //User erzeugen Table1.Open; //Tabelle öffnen zum Schreiben Table1.Edit; Table1['Benutzername']:= 'Admin'; Table1['Passwort']:= '123'; Table1['Administrator']:= True; Table1['Versuche']:= 0; Table1['Gesperrt']:= 'Nein'; Table1.Post; //Eintrag übernehmen Table1.Close; //Tabelle schließen end; end; end; Table1.Active:= True; //Tabelle1 auf Form1 aktivieren Form10.Table1.Active:= True; //Tabelle1 auf Form10 aktivieren end; end.
Delphi-Quellcode:
Datenbankerzeugen.tabelleerst(Table1);
|
Re: prozeduren auslagern
Das sieht schon besser aus. Nur die anderen paar Formx. stören etwas.
Versuche es immer möglichst allgemein zu halten, dass du, falls du etwas am Programm änderst, nicht den kompletten Quelltext überarbeiten musst, sondern nur einen kleinen Teil. |
Re: prozeduren auslagern
-Warum Table1?
- Zitat:
Zitat:
Zitat:
-was macht
Delphi-Quellcode:
?
getdir(0,Pfad);
|
Re: prozeduren auslagern
Delphi-Quellcode:
Kann ich rauswerfen überbleibsel vom Anfang hab ich übersehen.
getdir(0,Pfad);
Delphi-Quellcode:
Weil auf der Form10 auch die Table sitzt nur ich habe sie auch so genant
Warum Table1
Form10.Table1.DatabaseName:= Form1.Serverpfad + 'Datenbank\'; Kann man den Serverpfad auch auslagern ohne das er Fest ist. Muss ich mir dazu den Code auf die Unit holen?? |
Re: prozeduren auslagern
Du könntest ihn als weiteren Parameter übergeben.
|
Re: prozeduren auslagern
Würde es nicht langen diese Variable als published zu veröffentlichen
|
Re: prozeduren auslagern
Dann wäre sie eine Eigenschaft einer bestimmten Formularklasse und keine allgemeinen. Deshalb besser als Parameter.
|
Re: prozeduren auslagern
Ok ich glaube ich habe das mit den Parametern icht ganz verstanden.
Ich Schreibe Jetzt einfach eine neue Procedure in die ich das Aktivieren der Table1 auf Form10 also
Delphi-Quellcode:
lege und übergebe diese als Parameter??
Form10.Table1.Active:= True; //Tabelle1 auf Form10 aktivieren
|
Re: prozeduren auslagern
Nein:
Delphi-Quellcode:
procedure Tabelleerst(MyTable: TTable; Pfad: string);
|
Re: prozeduren auslagern
EInfach so erweitern:
Delphi-Quellcode:
Der Aufruf:
procedure Tabelleerst(FirstTable: TTable, SecondTable: TTable);
Delphi-Quellcode:
Wobei ich fast denke, das grundlegende Konzept sollte komplett überarbeitet werden. Aber besser als so, wie du's bisher hast, ist es.
Tabelleerst(Table1, Form10.Table10);
|
Re: prozeduren auslagern
Ok dann glaube ich hab ich das Konzept verstanden
Delphi-Quellcode:
Danke für den kleinen Crashkurs ist ganz einfach wenn man es so gezeigt bekommt.
unit Datenbankerzeugen;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls,DB, DBTables, ComCtrls, Buttons, ColorGrd; procedure tabelleerst(F1Tabelle1: TTable; Serverpfad: string; F10Tabelle1 :TTable); implementation //======================Benutzertabelle erstellen=============================== procedure Tabelleerst(F1Tabelle1: TTable; Serverpfad:String; F10Tabelle1 :TTable); Var pfad : string; begin F1Tabelle1.close; With F1Tabelle1 Do //Tabelle erzeugen begin DatabaseName:= Serverpfad + 'Datenbank\'; //Pfad zur Tabelle F10Tabelle1.DatabaseName:= Serverpfad + 'Datenbank\'; TableName:= 'Benutzerverwaltung.DB'; TableType:= ttParadox; end; if not FileExists( Serverpfad + 'Datenbank\Benutzerverwaltung.DB') then begin With F1Tabelle1 Do begin with FieldDefs Do //Datenfelder erzeugen begin Clear; Add('Nr.',ftAutoInc,0,True); Add('Benutzername',ftString,30,True); Add('Passwort',ftString,30,False); Add('Administrator',ftboolean,0,False); Add('Versuche',ftInteger,0,False); Add('Gesperrt',ftString,5,False); end; with IndexDefs do //Index Schlüssel erzeugen begin Clear; Add('Nr','Nr.',[ixPrimary, ixUnique]); // Primär Index end; CreateTable; begin //User erzeugen F1Tabelle1.Open; //Tabelle öffnen zum Schreiben F1Tabelle1.Edit; F1Tabelle1['Benutzername']:= 'Admin'; F1Tabelle1['Passwort']:= '123'; F1Tabelle1['Administrator']:= True; F1Tabelle1['Versuche']:= 0; F1Tabelle1['Gesperrt']:= 'Nein'; F1Tabelle1.Post; //Eintrag übernehmen F1Tabelle1.Close; //Tabelle schließen end; end; end; F1Tabelle1.Active:= True; //Tabelle1 auf Form1 aktivieren F10Tabelle1.Active:= True; //Tabelle1 auf Form10 aktivieren end; end. Was wären den dies Überarbeitungen ich bin nämlich dabei den Code zu verbessern Zitat:
|
Re: prozeduren auslagern
Ich finde es unlogisch, dass du gleichzeitig auf TTable verschiedener Formulare zugreifen musst.
Aber da ich dein Programm nicht kenne, kann ich auch nichts genaues dazu sagen, zumal mir dazu auch die Zeit fehlen würde. |
Re: prozeduren auslagern
Ja das habe ich mitleiweile aus diesem Post mitbekommen und bin gerade dabei die die Komponenten von Form10 einafch auf die Table1 von Form1 zugreifen zulassen.
Somit spare ich mir einpaar Zeilen Code und Komponenten. Wie gesagt danke nochmals |
Re: prozeduren auslagern
Dann hast du uns wohl missverstanden.
|
Re: prozeduren auslagern
Wie meinst du das???
Also dadurch das ich jetzt die Table und die Datasource von der Form10 entfernt habe und alles auf die Form1 umgeleitet (Datasource und Table von Form1) habe. Ist es jetzt eindeutiger auf welche Table ich zugreife und der Code sieht jetzt so aus
Delphi-Quellcode:
Oder hab ich wirklich was falsch verstanden
unit Datenbankerzeugen;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls,DB, DBTables, ComCtrls, Buttons, ColorGrd; procedure tabelleerst(F1Tabelle1: TTable; Serverpfad: string);// hier ist es auch kürzer implementation //======================Benutzertabelle erstellen=============================== procedure Tabelleerst(F1Tabelle1: TTable; Serverpfad:String); begin F1Tabelle1.close; With F1Tabelle1 Do //Tabelle erzeugen begin DatabaseName:= Serverpfad + 'Datenbank\'; //Pfad zur Tabelle // hier fällt die Zeile weg TableName:= 'Benutzerverwaltung.DB'; TableType:= ttParadox; end; if not FileExists( Serverpfad + 'Datenbank\Benutzerverwaltung.DB') then begin With F1Tabelle1 Do begin with FieldDefs Do //Datenfelder erzeugen begin Clear; Add('Nr.',ftAutoInc,0,True); Add('Benutzername',ftString,30,True); Add('Passwort',ftString,30,False); Add('Administrator',ftboolean,0,False); Add('Versuche',ftInteger,0,False); Add('Gesperrt',ftString,5,False); end; with IndexDefs do //Index Schlüssel erzeugen begin Clear; Add('Nr','Nr.',[ixPrimary, ixUnique]); // Primär Index end; CreateTable; begin //User erzeugen F1Tabelle1.Open; //Tabelle öffnen zum Schreiben F1Tabelle1.Edit; F1Tabelle1['Benutzername']:= 'Admin'; F1Tabelle1['Passwort']:= '123'; F1Tabelle1['Administrator']:= True; F1Tabelle1['Versuche']:= 0; F1Tabelle1['Gesperrt']:= 'Nein'; F1Tabelle1.Post; //Eintrag übernehmen F1Tabelle1.Close; //Tabelle schließen end; end; end; F1Tabelle1.Active:= True; //Tabelle1 auf Form1 aktivieren // hier fällt die Zeile weg end; |
Re: prozeduren auslagern
Noch besser wäre es die Datenbankobjekte und die Prozedur in eine Datenmodul auszulagern.
|
Re: prozeduren auslagern
Was ist den ein Datenmodul??
Sorry das ich so dumm Frage aber wer nicht fragt, lehrnt auch nichts dazu. |
Re: prozeduren auslagern
Datei - Neu - Datenmodul
Da kommen alle nicht-visuellen DB-Controls rein. |
Re: prozeduren auslagern
Ein Datenmodul ist eine nichtvisuelle formularänhliche Klasse, die dazu dient Datenbankobjekte aufzunehmen.
|
Re: prozeduren auslagern
Was ist den der vorteil vom Datenmodul
|
Re: prozeduren auslagern
Dort kannst du alles was mit Datenbanken zu tun hast sammeln. Man kann so (zumindest theoretisch) durch den Austausch dieses Moduls ein Programm für eine andere Datenbank umstellen
|
Re: prozeduren auslagern
Ein Blick in die Hilfe (die wird bei Delphi mitgeliefert!) bringt folgenden Text hervor:
Zitat:
|
Re: prozeduren auslagern
na das schein ja ne feine sache zusein.
Das heißt das was ich bis jetzt gemacht habe lege ich besser auf diese Datenmodul um und bin dann für die Zukunft besser gerüstet. |
Re: prozeduren auslagern
Ja.
|
Re: prozeduren auslagern
Danke für den Tipp werde das dann besser machen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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