AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Projekt "kopieren"

Ein Thema von davar · begonnen am 1. Jul 2006 · letzter Beitrag vom 4. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#1

Projekt "kopieren"

  Alt 1. Jul 2006, 06:57
Datenbank: MySQL • Version: 4.x • Zugriff über: Zeos
Hallo Leute,

ich habe ein Projekt "Kundendatenverwaltung" geschrieben. Dieses hat drei Formulare, eine Menge Komponenten und noch eine Menge Code. Nun möchte ich diese Kundenverwaltung kopieren und daraus eine Artikelverwaltung erstellen. Gern hätte ich Ideen dazu, wie ich den Kopiervorgang vereinfachen könnte.

Eine Möglichkeit, die mir einfällt, wäre, das Projekt von Anfang anzufangen und per Copy&Paste zu arbeiten und die zweite, das Projekt komplett zu kopieren und den Inhalt ändern. Aber gibt es vielleicht eine weitere, einfachere Möglichkeit? Hat jemand da eine Idee?


MfG

davar
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Projekt "kopieren"

  Alt 1. Jul 2006, 07:10
Imho birgt die Copy and Paste Methode die Gefahr, das du eine Sache übersiehst und es nicht gleich merkst. Das Programm wird trotzdem funktionieren bis irgendwann irgendjemand diese eine Aktion macht und dann knallts.

Meiner Meinung nach ist jetzt der Zeitpunkt gekommen, wo du beginnen solltest deine Anwendung zu abstrahieren und objektorientierter zu arbeiten. Z.b. könntest du eine Klasse TEditor haben von der du später einen TEditorPersonal und einen TEditorArtikel ableitest. (Das ist jetzt nur ein ganz triviales Beispiel). Dann könntest du auch noch die Objekte der DB abstrahieren. Ein Kollege hat das Konzept neulich so angefangen: Es gibt eine Klasse vom TBuisnessLogicElement. Davon abgeleitet ist ein TBLArtikel. Wenn er jetzt einen TBLArtikel mit der richtigen Artikelnummer instanziert, geht der Artikel erstmal in die Datenbank und holt sich selbst alle Daten die er braucht. Wenn diese (zugegeben sehr umfangreiche) Struktur erstmal steht, dann programmierst du in der richtigen Anwendung nur noch mit kleinen 5-Zeilern. Und das macht dann richtig Spass.

Warum ich dir sowas rate? Weil du damit sehr zukunftsorientiert porgammierst. Stell dir vor, es kommt noch eine Modellverwaltung, eine Zeitenverwaltung, eine Bestellverwaltung, ... hinzu. Jedesmal würdest du wie "rumfrickel" müssen. Wenn du dir jetzt eine richtige Grundlage legst, sparst du dir in Zukunft viel Arbeit.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Projekt "kopieren"

  Alt 1. Jul 2006, 07:21
Also das "Was" habe ich verstanden, aber bei "Wie" hakt es..

Beispiel: ich habe ein Datenmodul mit DataSource- und Query-Komponenten, und ich habe ein Formular mit einer Menge Edits und Memos.

Ändern müsste ich jetzt:
a) die Querys (Tabellenname und Feldnamen)
b) Bezeichnungen der Komponenten (Edit, Memo usw.) und Zuweisung der Datenbankfelder zu diesen Komponenten.

Was kann ich nun wie und wovon ableiten?
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Projekt "kopieren"

  Alt 1. Jul 2006, 10:19
Zitat von davar:
Also das "Was" habe ich verstanden, aber bei "Wie" hakt es..
Im Groben so:

In meinem aktuellen Projekt gibt es z.B. eine Klasse TContact:
Delphi-Quellcode:
type
  TContact = class(TObject)
  private
    FContactID: integer;
    FSalutation: integer;
    FTitle: integer;
    FFName1: String;
    FFName2: String;
    FLName: String;
    FBirthdate: TDateTime;
    FPAddStreet: String;
    ...
    OQuery: TZQuery;
    ...
    procedure SetFCcontactID(const Value: Integer);
    procedure SetFFName1(const Value: String);
    procedure SetFSalutation(const Value: Integer);
    procedure SetFTitle(const Value: Integer);
    procedure SetFBirthdate(const Value: TDateTime);
    procedure SetFFName2(const Value: String);
    procedure SetFLName(const Value: String);
    procedure SetFPAddStreet(const Value: String);
    ...
  public
    property ContactID: Integer read FContactID write SetFCcontactID;
    property Salutation: Integer read FSalutation write SetFSalutation;
    property Title: Integer read FTitle write SetFTitle;
    property ForeName1: String read FFName1 write SetFFName1;
    property ForeName2: String read FFName2 write SetFFName2;
    property LastName: String read FLName write SetFLName;
    property Birthdate: TDateTime read FBirthdate write SetFBirthdate;
    property Street: String read FPAddStreet write SetFPAddStreet;
    ...
    procedure LoadContact(aID: Integer);
    procedure AddCustomer(aCustomer: TCustomer);
    procedure RemoveCustomer(aID: Integer);

    constructor create;
...

procedure TContact.LoadContact(aID: Integer);
var
  myCustomer: TCustomer;
begin
    OQuery.SQL.Text:='SELECT * FROM kom_ko2000 WHERE id=:id';
    OQuery.ParamByName('id').AsInteger:=aID;
    OQuery.Open;
    If OQuery.RecordCount > 0 then
    begin
      Salutation:=OQuery.fieldbyname('salutation').AsInteger;
      Title:=OQuery.fieldbyname('title').AsInteger;
      ForeName1:=OQuery.fieldbyname('fname1').AsString;
      ForeName2:=OQuery.fieldbyname('fname2').AsString;
      ForeName1:=OQuery.fieldbyname('fname1').AsString;
      LastName:=OQuery.fieldbyname('lname').AsString;
      Birthdate:=OQuery.fieldbyname('birthdate').AsDateTime;
      Street:=OQuery.fieldbyname('street').AsString;
      Postal:=OQuery.fieldbyname('postal').AsString;
      City:=OQuery.fieldbyname('city').AsString;
      Region:=OQuery.fieldbyname('region').AsString;
      Country:=OQuery.fieldbyname('country').AsInteger;
      AddNote:=OQuery.fieldbyname('addnote').AsString;
      Phone1:=OQuery.fieldbyname('phone1').AsString;
      Phone2:=OQuery.fieldbyname('phone2').AsString;
      Mobile:=OQuery.fieldbyname('mobile').AsString;
      Fax:=OQuery.fieldbyname('fax').AsString;
      EMail1:=OQuery.fieldbyname('email1').AsString;
      EMail2:=OQuery.fieldbyname('email2').AsString;
      ContactBy:=OQuery.fieldbyname('contactby').AsInteger;
      ContactDate:=OQuery.fieldbyname('contactdate').AsDateTime;
      ContactCreatedBy:=OQuery.fieldbyname('contactcreatedby').AsInteger;
      MaritalStatus:=OQuery.fieldbyname('maritalstatus').AsInteger;
      MALetter:=OQuery.fieldbyname('maletter').AsInteger;
      MAEmail:=OQuery.fieldbyname('maemail').AsInteger;
      MAFax:=OQuery.fieldbyname('mafax').AsInteger;
      MAPhone:=OQuery.fieldbyname('maphone').AsInteger;
      Note:=OQuery.fieldbyname('note').AsString;
      // Customer zu Contact laden
      CustomerList.Clear;
      OQuery.SQL.Text:='SELECT c.id FROM kom_ko3000 cc JOIN kom_ko1000 c ON c.id = cc.custid WHERE cc.contactid=:contactid ORDER BY c.name1 ASC';
      OQuery.ParamByName('contactid').AsInteger:=ContactID;
      OQuery.Open;
      While not OQuery.Eof do
      begin
        myCustomer:=TCustomer.Create;
        myCustomer.LoadCustomer(OQuery.fieldbyname('id').AsInteger);
        AddCustomer(myCustomer);
      OQuery.Next;
      end;
      // ====================================================================
    end;
    OQuery.Close;
end;
In meinem Hauptprogramme mache ich dann z.B. folgendes:
Delphi-Quellcode:
        OKONTAKT.LoadContact(iContactID);
        Edit41.Text:=OKONTAKT.ForeName1;
        Edit43.Text:=OKontakt.ForeName2;
        Edit42.Text:=OKontakt.LastName;
        DateTimePicker1.Date:=OKontakt.Birthdate;
        Edit47.Text:=OKontakt.Street;
Viele Grüße
Igotcha
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Projekt "kopieren"

  Alt 1. Jul 2006, 13:46
Also komplett verstanden habe ich es ehrlich gesagt immer noch nicht.

Ich kann jetzt eine Klasse TKunden erstellen. In dieser Klasse selbst kann ich drei Formulare erstellen und in diesen drei Formularen wiederum kann ich alle Komponenten erstellen und positionieren, und zwar alles zur Laufzeit. Das ganze soll später nämlich in eine dll-Datei ausgelagert werden. Also habe ich ein paar hundert Zeilen Quellcode für die Klasse TKunden.

Nur, wo spare ich jetzt Arbeit, wenn ich die Klasse TKunden in die Klasse TArtikel kopieren möchte? Dann muss ich doch trotzdem sämtliche Formulare, sämtliche Komponenten und sämtliche Prozeduren durchgehen und einzeln ändern oder nicht? Schließlich habe ich bei den Artikeln einen ganz anderen Tabellen-, Formular- und Komponentenaufbau.


MfG

davar
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Projekt "kopieren"

  Alt 1. Jul 2006, 17:21
Der Ansatz ist ein anderer: In meinem Beispiel sind die Klassen TContact (und andere) erstmal völlig losgelöst von irgendwelchen Forms (also Logik von GUI getrennt).

Der Vorteil daraus ist, dass ich meine grafische Ausgabe auch später gestalten, erweitern, reduzieren, etc. kann, ohne jemals wieder die Klasse TContact anfassen zu müssen, da ich durch die Benutzung eines TContact-Objekts immer und von überall auf die "Properties" und "Methoden" des Objekts zugreifen und mir so alle Informationen holen und setzen kann.

Du vermischst Form und Klassen. Bei Dir heisst eine Form z.B. TKunde, ist aber eigentlich kein "Kundenobjekt".

Was machst Du z.B., wenn Du noch in einer anderen Form Daten aus Deinem "Kundenobjekt" anzeigen lassen möchtest? Geht bei Dir gar nicht anders, als dass Du für die neue Form ebenfalls ein "Kundenobjekt" programmierst.

In meinem Fall erstelle ich einfach in der neuen Form auch ein TContact-Objekt und kann, genauso wie in der alten Form, mit diesem Objekt arbeiten. Also einmal implementiert, überall verwendbar.

Viele Grüße
Igotcha
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Projekt "kopieren"

  Alt 1. Jul 2006, 17:50
Zitat von Igotcha:
Der Ansatz ist ein anderer: In meinem Beispiel sind die Klassen TContact (und andere) erstmal völlig losgelöst von irgendwelchen Forms (also Logik von GUI getrennt).
Also gut.

Ich habe eine Klasse "TKunden". Darin habe ich sagen wir mal drei Prozeduren "Kunde auslesen", "Kunde einfügen" und "Kunde ändern". In diese Prozeduren schreibe ich jeweils den Code hinein.

Nun erstelle ich - unabhängig davon - die Oberfläche. Ich erstelle ein Formular und setze dort die Komponenten hinein. Und als Prozedur gebe ich z.B. "TKunden.Kundeauslesen" ein. Hab ich das jetzt richtig verstanden?

Wenn ja, liegt also die Arbeitsersparnis darin, dass ich (beim Kopieren zu TArtikel) die Prozeduren beibehalte und lediglich ihren Inhalt - bezogen auf die Tabellen - ändere?
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Projekt "kopieren"

  Alt 3. Jul 2006, 17:47
Zitat von Igotcha:
Delphi-Quellcode:
type
  TContact = class(TObject)
  private
    OQuery: TZQuery;
  public
    constructor create;
In meinem Hauptprogramme mache ich dann z.B. folgendes:
Delphi-Quellcode:
        OKONTAKT.LoadContact(iContactID);
        Edit41.Text:=OKONTAKT.ForeName1;
        Edit43.Text:=OKontakt.ForeName2;
        Edit42.Text:=OKontakt.LastName;
        DateTimePicker1.Date:=OKontakt.Birthdate;
        Edit47.Text:=OKontakt.Street;
Viele Grüße
Igotcha
Hallo,

so langsam komm ich jetzt wohl doch mit. Aber zwei kurze Sachen noch:

1. Wie erstelle ich die Komponenten (DataSource, Query)? Wenn ich ein neues Formular erstelle und dort zur Laufzeit die Komponenten erstelle, geht es. Wenn ich aber eine neue Unit nehme (ohne Formular) geht es nicht. Brauch ich unbedingt ein Formular dafür?

2. Wie ist es mit datensensitiven Komponenten? Was gebe ich bei einem DBGrid als DataSource an?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Projekt "kopieren"

  Alt 3. Jul 2006, 18:19
Neben der Variante des ableitens gibt es auch noch die Variante mit Compiler-Schaltern zu arbeiten.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Projekt "kopieren"

  Alt 3. Jul 2006, 23:58
Zitat von davar:
so langsam komm ich jetzt wohl doch mit. Aber zwei kurze Sachen noch:

1. Wie erstelle ich die Komponenten (DataSource, Query)? Wenn ich ein neues Formular erstelle und dort zur Laufzeit die Komponenten erstelle, geht es. Wenn ich aber eine neue Unit nehme (ohne Formular) geht es nicht. Brauch ich unbedingt ein Formular dafür?

2. Wie ist es mit datensensitiven Komponenten? Was gebe ich bei einem DBGrid als DataSource an?
Nee, noch nicht richtig verstanden

zu 1. Die erstellst Du nicht auf dem Formular, sondern in Deiner Klasse. Stell Dir mal bitte Klasse und Anzeigeformular als 2 Dinge vor, die rein gar nichts voneinander wissen.

Also in der Klasse z.B. im Create-Event:
  OQuery:=TZquery.Create Du musst das Ganze abstrakter sehen:

- "Hallo, ich bin ein Formular und habe mir gerade ein TKontakt-Objekt names 'Kontakt' erstellt"
Kontakt := TKontakt.Create; - "Kontakt, beschaffe Dir mal bitte die Kontaktdaten für die ID 4711"
Kontakt.LoadData(4711); - "Hallo Kontakt, ich brauche mal bitte den 'Nachnamen' aus Deinen Kontaktdaten, da ich diesen im Edit1 anzeigen lassen möchte"
Edit1.Text := Kontakt.Nachname; - "Hallo Kontakt, jetzt brauche ich mal bitte die Liste der Vorgänge, damit ich diese in einer Listbox anzeigen lassen kann"
Delphi-Quellcode:
For ix:=0 to Kontakt.VorgangsListe.Count -1 do
  begin
    ListBox1.Items.Add(TVorgang(Kontakt.Vorgangsliste[ix]).Bezeichnung);
  end;
zu 2. Geh bitte von den datensensitiven Komponenten weg, da diese mehr Probleme als Nutzen bereiten. Nimm stattdessen normale Edit, etc. Für Listen empfehle ich den VirtualStringTree.

Viele Grüße
Igotcha
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz