|
Antwort |
Registriert seit: 1. Mai 2016 Ort: Berlin 419 Beiträge Delphi 10.2 Tokyo Professional |
#11
Schau doch bitt mal drüber, ob ich das so verwenden kann oder ob ich explizit hier den constructor aufrufen muss:
Delphi-Quellcode:
Bislang habe ich die Objectlist lediglich im Formular erzeugt.
unit UCustomerList;
interface uses classes, system.Types, system.SysUtils, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZAbstractConnection, ZConnection ,contnrs; type TCustomer=class private FKDNR : Integer; FName: string; FVorname: string; FFirma : string; FProdukt: string; FAnzahl : Integer; FPreis : Currency; procedure SetKDNR(const Value: Integer); procedure SetName(const Value: string); procedure SetVorname(const Value: string); procedure SetFirma (const Value : string); procedure SetProdukt(const Value : String); procedure SetAnzahl (const Value : Integer); procedure SetPreis(const Value: Currency); published property KDNR: integer read FKDNr write SetKDNR; property Name: string read FName write SetName; property Vorname: string read FVorname write SetVorname; property Firma: string read FFirma write SetFirma; property Produkt: string read FProdukt write setProdukt; property Anzahl: Integer read FAnzahl write SetAnzahl; property Preis: Currency read FPreis write SetPreis; end; TCustomerList=class(TObjectList) function getItem(index: Integer): TCustomer; virtual; procedure setItem(index: Integer; Customer: TCustomer); virtual; procedure LoadFromDB(con: TZConnection); procedure SavetoDB(con: TZConnection); public property Items[index: Integer]: TCustomer read getItem write setItem; default; procedure Insert(index: Integer; Customer: TCustomer); virtual; function Add(Customer: TCustomer): Integer; virtual; function Remove(Customer: TCustomer): Integer; virtual; function IndexOf(Customer: TCustomer): Integer; virtual; function First: TCustomer; virtual; function Last: TCustomer; virtual; function AddCustomer(KDNR: integer; Name: string; Vorname: string; Firma: string; Produkt: string; Anzahl: Integer; Preis: Currency):integer; end; implementation { TCustomer } procedure TCustomer.SetAnzahl(const Value: Integer); begin FAnzahl := Value; end; procedure TCustomer.SetFirma(const Value: string); begin FFirma := Value; end; procedure TCustomer.SetKDNR(const Value: Integer); begin FKDNR:= Value; end; procedure TCustomer.SetName(const Value: string); begin FName := Value; end; procedure TCustomer.SetPreis(const Value: Currency); begin FPreis := Value; end; procedure TCustomer.SetProdukt(const Value: String); begin FProdukt := Value; end; procedure TCustomer.SetVorname(const Value: string); begin FVorname := Value; end; { TCustomerList } function TCustomerList.Add(Customer: TCustomer): Integer; begin Result:=inherited Add(Customer); end; procedure TCustomerList.setItem(index: Integer; Customer: TCustomer); begin inherited Items[index]:=Customer; end; function TCustomerList.AddCustomer(KDNR: integer; Name, Vorname, Firma, Produkt: string; Anzahl: Integer; Preis: Currency): integer; var Customer: TCustomer; begin Customer:=TCustomer.Create; Customer.KDNR:=KDNR; Customer.Name:=Name; Customer.Vorname:=Vorname; Customer.Firma:=Firma; Customer.Produkt:=Produkt; Customer.Anzahl:=Anzahl; Customer.Preis:=Preis; self.Add(Customer); end; function TCustomerList.Remove(Customer: TCustomer): Integer; begin Result:=inherited Remove(Customer); end; function TCustomerList.First: TCustomer; begin Result:=TCustomer(inherited First()); end; function TCustomerList.getItem(index: Integer): TCustomer; begin Result:=TCustomer(inherited Items[index]); end; function TCustomerList.IndexOf(Customer: TCustomer): Integer; begin Result:=inherited IndexOf(Customer); end; procedure TCustomerList.Insert(index: Integer; Customer: TCustomer); begin inherited Insert(index, Customer); end; function TCustomerList.Last: TCustomer; begin Result:=TCustomer(inherited Last()); end; procedure TCustomerList.LoadFromDB(con: TZConnection); var zqyMain: TZQuery; Customer: TCustomer; begin zqyMain:=TZQuery.Create(nil); Try self.Clear; //Dank TObjectlist werden auch alle bereits vorhandenen Objecte automatisch freigegeben zqyMain.connection:=con; zqyMain.sql.text:='SELECT * FROM WARENVERKAUF1'; zqyMain.active:=True; while not zqyMain.eof do begin Customer:=TCustomer.Create; Customer.KDNR:=zqyMain.fieldbyname('KDNR').AsInteger; Customer.Name:=zqyMain.fieldbyname('Name').AsString; Customer.Vorname:=zqyMain.fieldbyname('Vorname').AsString; Customer.Firma:=zqyMain.fieldByName('Firma').AsString; Customer.Produkt:=zqyMain.fieldbyname('Produkt').AsString; Customer.Anzahl:=zqyMain.FieldByName('Anzahl').AsInteger; Customer.Preis:=zqyMain.fieldbyname('Preis').AsCurrency; self.Add(Customer); end; zqyMain.active:=False; Finally zqyMain.free; End; end; procedure TCustomerList.SavetoDB(con: TZConnection); var zqryMain: TZQuery; i: Integer; begin zqryMain:=TZQuery.Create(nil); try zqryMain.connection:=con; zqryMain.sql.text:='INSERT INTO WARENVERKAUF1 (KDNR, NAME, VORNAME, FIRMA, PRODUKT, ANZAHL, PREIS) VALUES (:KNR, :NAM, :VNA, :FIR, :PRO, :ANZ, :PRE)'; zqryMain.params.parseSQL(zqryMain.sql.text, True); for i:=0 to self.count-1 do begin zqryMain.params.ParamValues['KNR']:=self[i].KDNR; zqryMain.params.paramValues['NAM']:=self[i].Name; zqryMain.params.paramValues['VNA']:=self[i].Vorname; zqryMain.params.ParamValues['FIR']:=self[i].Firma; zqryMain.Params.ParamValues['PRO']:=self[i].Produkt; zqryMain.Params.ParamValues['ANZ']:=self[i].Anzahl; zqryMain.params.paramValues['PRE']:=self[i].Preis; zqryMain.ExecSQL; end; finally zqryMain.free; end; end; end. Habe zwischenzeitlich nun auch die D10.2 Tokyo prof. und könnte daher wo nachsehen? Source von objectlist ? Ich habe immer noch die Frage danach warum die Daten nicht auch in den TEdits im Hauptformular angezeigt werden.
Norbert
|
Zitat |
Registriert seit: 16. Feb 2015 Ort: Halle/S. 116 Beiträge Delphi 10.2 Tokyo Enterprise |
#12
Da du ja ein modernes Delphi hast - wieso verwendest du keine generische TObjectList. Damit würdest du dir das redeklarieren der ganzen TObjectList-Funktionalitäten sparen und deine TCustomerList sähe nur noch so aus (ohne IDE heruntergetippt kopiert und ungetestet):
Delphi-Quellcode:
Und ja, da du das Create nicht überschreibst, rufst du das Create der Vorgängerklasse (TObjectList) auf.
TCustomerList=class(TObjectList<TCustomer>)
procedure LoadFromDB(con: TZConnection); procedure SavetoDB(con: TZConnection); public function AddCustomer(KDNR: integer; Name: string; Vorname: string; Firma: string; Produkt: string; Anzahl: Integer; Preis: Currency):integer; end; Und ja, der Sourcecode könnte ebenfalls erleuchtend wirken. Ein Strg+Click auf TCustomerList.Create sollte dich an die richtige Stelle führen.
Sebastian
|
Zitat |
Registriert seit: 1. Mai 2016 Ort: Berlin 419 Beiträge Delphi 10.2 Tokyo Professional |
#13
Leider erhellt sich bei mir wenig. Sicher fehlen mir noch immer einige Grundlagen.
1.Könnte ich also die gepostete unit so verwenden, wie sie ist ohne expliziten Aufruf des constructors? 2.Das Thema generische Listen ist mir völlig neu und muss ich erst einmal recherchieren. Habe mir zwischenzeitlich die unit contnrs angesehen. Wenn ich nun den Vorschlag von SProske aufgreife scheitere ich bereits bei den < und > bei <TCustomer>. Da meckert ganz Tokyo. Nehme ich den Passus raus will er doch einiges Gedöns aus der unit contnrs. So lasse ich es erst einmal mit meinem redundanten Code, bis ich mich schlauer gemacht habe. 3. gibt es ein Tutorial zum Thema generischen Listen?
Norbert
|
Zitat |
Registriert seit: 16. Feb 2015 Ort: Halle/S. 116 Beiträge Delphi 10.2 Tokyo Enterprise |
#14
1. Ja, entscheidend ist der Aufruf von TCustomerList.Create
, wo auch immer das dann tatsächlich geschieht.
2. Du musst die unit System.Generics.Collections einbinden.
Sebastian
|
Zitat |
Registriert seit: 1. Mai 2016 Ort: Berlin 419 Beiträge Delphi 10.2 Tokyo Professional |
#15
Hallo,
Zitat:
Da du ja ein modernes Delphi hast - wieso verwendest du keine generische TObjectList. Damit würdest du dir das redeklarieren der ganzen TObjectList-Funktionalitäten sparen und deine TCustomerList sähe nur noch so aus
Doch wenn ich die Daten lade rödelt meine Maschine und teilt mir dann schlussendlich mit, "zuwenig Arbeitspeicher" obwohl ich 16 MB habe und nichts speicherfressendes läuft. Da ist doch was faul? Wo könnte ich da suchen?
Norbert
|
Zitat |
Registriert seit: 17. Sep 2006 Ort: Barchfeld 27.619 Beiträge Delphi 12 Athens |
#16
Du liest immer denselben Datensatz ein, da Du nie auf den nächsten wechselst. Soll heißen, da fehlt ein Next in Deiner Schleife.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein) Dieser Tag ist längst gekommen |
Zitat |
Registriert seit: 1. Mai 2016 Ort: Berlin 419 Beiträge Delphi 10.2 Tokyo Professional |
#17
Danke erst einmal für die Hilfe. Die Anzeige in den Edit-Feldern klappt nunmehr. Will ich jedoch einen Datensatz löschen oder bearbeiten erhalte ich die Fehlermeldung "Argument außerhalb des Bereiches". Also in beiden Fällen die gleiche Meldung. Wo sollte ich nun nach welchem Problem suchen. Blöd ist nur, dass ein F1 nicht weiterhilft und der Fehler nur beim Click auf die jeweiligen Button, also beim Aufruf der Methoden erscheint. Was möge denn gemeint sein mit "...außerhalb des Bereiches.."?
Dann habe ich mir die Methode LoadfromDB angesehen, die dazu führt, dass nicht genügend Arbeitsspeicher vorhanden sei. Da kann ich jedoch nichts feststellen.
Delphi-Quellcode:
Da hänge ich also fest.
procedure TCustomerList.LoadFromDB(con: TZConnection);
var zqyMain: TZQuery; Customer: TCustomer; begin zqyMain:=TZQuery.Create(nil); Try self.Clear; //Dank TObjectlist werden auch alle bereits vorhandenen Objecte automatisch freigegeben zqyMain.connection:=con; zqyMain.sql.text:='SELECT * FROM WARENVERKAUF1'; zqyMain.active:=True; while not zqyMain.eof do begin Customer:=TCustomer.Create; Customer.KDNR:=zqyMain.fieldbyname('KDNR').AsInteger; Customer.Name:=zqyMain.fieldbyname('Name').AsString; Customer.Vorname:=zqyMain.fieldbyname('Vorname').AsString; Customer.Firma:=zqyMain.fieldByName('Firma').AsString; Customer.Produkt:=zqyMain.fieldbyname('Produkt').AsString; Customer.Anzahl:=zqyMain.FieldByName('Anzahl').AsInteger; Customer.Preis:=zqyMain.fieldbyname('Preis').AsCurrency; self.Add(Customer); end; zqyMain.active:=False; Finally zqyMain.free; End; end;
Norbert
|
Zitat |
Registriert seit: 17. Sep 2006 Ort: Barchfeld 27.619 Beiträge Delphi 12 Athens |
#18
Ich hatte es doch geschrieben: sobald auch nur ein Datensatz enthalten ist, wird Eof nie eintreten, solange Du Deine Datenmenge nicht mit Next auf den nächsten Datensatz positionierst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein) Dieser Tag ist längst gekommen |
Zitat |
Registriert seit: 1. Mai 2016 Ort: Berlin 419 Beiträge Delphi 10.2 Tokyo Professional |
#19
Hallo zusammen, es ist mein erstes Projekt dieser Dimension und ich komme einfach nicht weiter und verzweifele, da ich bereits 2 Tage vergeblich den Fehler in diesem kleinen Übungsprogramm suche.
Nach dem Aufruf des Programms wird die SQLLite-Tabelle in einem Listview (auch mit ID!)exakt angezeigt und auch die TEdit-Felder sind parallel dazu zu sehen. Will ich jedoch einen Datensatz daraus löschen oder bearbeiten (entspr. Methoden per ButtonClick) kommt die Meldung "Argument außerhalb des Bereiches". Will ich einen Datensatz hinzufügen oder auch mit DBSpeichern kommt: "Operation bei geschlossener Datenmenge nicht ausführbar" . Nach dem Aufruf von Bearbeiten rückt die Anzeige im Listview nach links d.h. das Feld ID wird nun mit der KDNR belegt. Also die ID ist nicht mehr sichtbar und dafür in der Spalte wird die Kundennummer angezeigt und folgend Name bei KDNR usw. Ich habe bereits alles versucht, was mir eingefallen ist, doch ich kam zu keinem vernünftigen Ergebnis. Die Anzeige der Daten in den Edit-Feldern im FRMMain ist ebenfalls weg. Es wird wohl irgendwo was unterschlagen, vermutlich die ID. Wo könnte ich suchen oder was müßte ich tun? Debugger.. na ja brachte mich nicht weiter, da mir wohl die Erfahrung fehlt. Es ist für mich wirklich völliges Neuland und ich habe mich wirklich bemüht, doch jetzt stehe ich in dieser Sache vermutlich vor dem Aus, doch ich glaube es ist nur ein verdammter Denkfehler von mir. Sollte sich jemand erbarmen, mir einen Tipp zu geben, wäre ich sehr dankbar. Anbei das Programm in der jetzigen Fassung und die beiden entscheidenen units:
Delphi-Quellcode:
und weiter
unit UCustomerList;
interface uses classes, system.Types, system.SysUtils, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZAbstractConnection, ZConnection ,contnrs, System.Generics.Collections; type TCustomer=class private // FID: integer; FKDNR : Integer; FName: string; FVorname: string; FFirma : string; FProdukt: string; FAnzahl : Integer; FPreis : Currency; // procedure SetID(const Value: Integer); procedure SetKDNR(const Value: Integer); procedure SetName(const Value: string); procedure SetVorname(const Value: string); procedure SetFirma (const Value : string); procedure SetProdukt(const Value : String); procedure SetAnzahl (const Value : Integer); procedure SetPreis(const Value: Currency); published // property ID: integer read FID write SetID; property KDNR: integer read FKDNr write SetKDNR; property Name: string read FName write SetName; property Vorname: string read FVorname write SetVorname; property Firma: string read FFirma write SetFirma; property Produkt: string read FProdukt write setProdukt; property Anzahl: Integer read FAnzahl write SetAnzahl; property Preis: Currency read FPreis write SetPreis; end; TCustomerList=class(TObjectList<TCustomer>)//generische Liste (contnrs, System.Generics.Collections) procedure LoadFromDB(con: TZConnection); procedure SavetoDB(con: TZConnection); public function AddCustomer(KDNR: integer; Name: string; Vorname: string; Firma: string; Produkt: string; Anzahl: Integer; Preis: Currency):integer; end; implementation { TCustomer } procedure TCustomer.SetAnzahl(const Value: Integer); begin FAnzahl := Value; end; procedure TCustomer.SetFirma(const Value: string); begin FFirma := Value; end; {procedure TCustomer.setID(const Value: Integer); begin FID := Value; end; } procedure TCustomer.SetKDNR(const Value: Integer); begin FKDNR:= Value; end; procedure TCustomer.SetName(const Value: string); begin FName := Value; end; procedure TCustomer.SetPreis(const Value: Currency); begin FPreis := Value;
Delphi-Quellcode:
ich wäre sehr dankbar für eine Meinungsäußerung, damit ich das ganze nicht wirklich in die Tonne treten muss.
//Programm Kundenliste als ersten Versuch eine Objectlist zur Aufnahme der Daten
//für eine SQLite DB einzusetzen. //Hilfe dazu erhielt ich aus vorangegangenen Projekten in der DP vor allem von //Hobbycoder, Haentschmann und P80286, dennen ich hiermit nochmals danke. //Erstellt von EdAdvokat April 2017 unit uMainFRM; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, uFRMCustomer, uCustomerList, Vcl.ComCtrls, Data.DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZAbstractConnection, ZConnection; type TFRMMainCustomer = class(TForm) lvCustomer: TListView; btnAdd: TButton; btnMake: TButton; btnDelete: TButton; btnAutomatic: TButton; btnClose: TButton; conMain: TZConnection; zqryMain: TZQuery; btnSaveDB: TButton; btnloadDB: TButton; edtKDNR: TEdit; edtName: TEdit; edtVorname: TEdit; edtFirma: TEdit; edtProdukt: TEdit; edtAnzahl: TEdit; edtPreis: TEdit; lblKDNR: TLabel; lblName: TLabel; lblVorname: TLabel; lblFirma: TLabel; lblProdukt: TLabel; lblAnzahl: TLabel; lblPreis: TLabel; edtTestID: TEdit; procedure btnAddClick(Sender: TObject); procedure btnMakeClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); procedure btnAutomaticClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TOBject); procedure btnCloseClick(Sender: TObject); procedure btnSaveDBClick(Sender: TObject); procedure btnloadDBClick(Sender: TObject); procedure lvCustomerClick(Sender: TObject); private { Private-Deklarationen } CustomerList: TCustomerList; procedure FuelleListView; procedure connect; procedure clearAllFields; procedure saveTableData(ID,KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS:string ); public { Public-Deklarationen } end; var FRMMainCustomer: TFRMMainCustomer; implementation {$R *.dfm} procedure TFRMMainCustomer.btnAutomaticClick(Sender: TObject); var r: integer; I: Integer; KDN, KDN1, Name, Vorname, Firma, Produkt: string; KDNR, Anzahl: Integer; Preis: Currency; begin Customerlist.Clear; Randomize; for I := 0 to 999 do begin r:=Random(10); case r of 0: Name:='Lehmann'; 1: Name:='Krausnig'; 2: Name:='Karlsberg'; 3: Name:='Ludwig'; 4: Name:='Antonia'; 5: Name:='Delphenhorst'; 6: Name:='Erinig'; 7: Name:='Fiedler'; 8: Name:='Gurrlig'; 9: Name:='Henzener'; end; r:=Random(10); case r of 0: Vorname:='Dieter'; 1: Vorname:='Klaus'; 2: Vorname:='Paul'; 3: Vorname:='Helga'; 4: Vorname:='Bernd'; 5: Vorname:='Friedel'; 6: Vorname:='Gustaf'; 7: Vorname:='Heinz'; 8: Vorname:='Joachim'; 9: Vorname:='Manfred'; end; r:=Random(10); case r of 0: KDN:='11'; 1: KDN:='12'; 2: KDN:='13'; 3: KDN:='14'; 4: KDN:='15'; 5: KDN:='16'; 6: KDN:='17'; 7: KDN:='18'; 8: KDN:='19'; 9: KDN:='20'; end; r:=Random(10); case r of 0: KDN1:='21'; 1: KDN1:='22'; 2: KDN1:='23'; 3: KDN1:='24'; 4: KDN1:='25'; 5: KDN1:='26'; 6: KDN1:='27'; 7: KDN1:='28'; 8: KDN1:='29'; 9: KDN1:='30'; end; r:=Random(10); case r of 0: Firma:='Schulbedarf'; 1: Firma:='Schule&mehr'; 2: Firma:='Hausmeisterserv.'; 3: Firma:='Lernen KG'; 4: Firma:='Lehrbuch Co.'; 5: Firma:='Möbel KG'; 6: Firma:='Hefte/Bücher'; 7: Firma:='Buch4you'; 8: Firma:='Lernen4all'; 9: Firma:='Bedarf Schule'; end; r:=Random(10); case r of 0: Produkt:='Stühle'; 1: Produkt:='Tische'; 2: Produkt:='Hefte'; 3: Produkt:='Blöcke'; 4: Produkt:='Bilder'; 5: Produkt:='Kreide'; 6: Produkt:='Bücher'; 7: Produkt:='Tafeln'; 8: Produkt:='Werkzeug'; 9: Produkt:='Mappen'; end; KDNR:=strtoint(KDN[1]+KDN1[1]+format('%.6d',[i])); Anzahl:=Random(20); r:=Random(10000); Preis:=r/100; CustomerList.AddCustomer(KDNR, Name, Vorname, Firma, Produkt, Anzahl, Preis ); end; FuelleListView; end; procedure TFRMMainCustomer.btnCloseClick(Sender: TObject); begin close; end; procedure TFRMMainCustomer.btnAddClick(Sender: TObject); var Customer: TCustomer; begin //Eingabeformular mit Defaultwerten bestücken FRMCustomer.edtKDNR.Text:=''; FRMCustomer.edtName.Text:=''; FRMCustomer.edtName.Text:=''; FRMCustomer.edtVorname.text:=''; FRMCustomer.edtFirma.text:=''; FrmCustomer.edtProdukt.Text:=''; FrmCustomer.edtAnzahl.text:=''; FRMCustomer.edtPreis.text:=''; if frmCustomer.ShowModal=mrOK then begin Customer:=TCustomer.Create; //Das Object Customer erzeugen. Customer.KDNR:=strtoint(frmCustomer.edtKDNR.Text); //Customer wird befüllt Customer.Name:=FRMCustomer.edtName.Text; Customer.Vorname:=FRMCustomer.edtVorname.text; Customer.Firma:=FRMCustomer.edtFirma.text; Customer.Produkt:=FRMCustomer.edtProdukt.text; customer.Anzahl:=strtoint(FRMCustomer.edtAnzahl.text); Customer.Preis:= StrToCurr(FRMCustomer.edtPreis.Text); CustomerList.Add(Customer); //Übergabe an CustomerList FuelleListView; end; end; procedure TFRMMainCustomer.btnDeleteClick(Sender: TObject); begin if lvCustomer.Selected<>nil then begin //Hier löschen wir das Object aus der ObjectListe //Durch die Eigenschaft OwnObjects, die zu jeder TObjectList gehört, //kümmert sich die ObjectListe selber darum, das entsprechende Object Customer //frei zugehen. Brauchen wir also nicht selber mache. //Ansonsten gilt grundsätzlich, was ich selber erzeuge gebe ich auch selber wieder frei CustomerList.Delete(lvCustomer.Selected.Index); FuelleListView; end; end; procedure TFRMMainCustomer.btnloadDBClick(Sender: TObject); begin CustomerList.LoadFromDB(conMain); end; procedure TFRMMainCustomer.btnSaveDBClick(Sender: TObject); begin CustomerList.SavetoDB(conMain); end; procedure TFRMMainCustomer.btnMakeClick(Sender: TObject); begin if lvCustomer.Selected<>nil then begin //Über den Index kann man nun auf jedes Object in der ObjektListe zugreifen //Damit bestücken wir das Formular mit den Werten aus den Eigenschaften des Objects frmCustomer.edtKDNR.Text:=inttostr(CustomerList[lvCustomer.Selected.Index].KDNR); frmCustomer.edtName.Text:=CustomerList[lvCustomer.Selected.Index].Name; frmCustomer.edtVorname.Text:=CustomerList[lvCustomer.Selected.Index].Vorname; fRMCustomer.edtFirma.Text:=CustomerList[lvCustomer.Selected.Index].Firma; frmCustomer.edtProdukt.text:=CustomerList[lvCustomer.Selected.Index].Produkt; frmCustomer.edtAnzahl.Text:=IntToStr(Customerlist[lvCustomer.Selected.Index].Anzahl); frmCustomer.edtPreis.Text:=CurrToStr(Customerlist[lvCustomer.Selected.Index].Preis); if FRMCustomer.ShowModal=mrOK then begin //Object erzeugen nicht nötig, da es bereits besteht. Zugriff also möglich //für die Übertragung der Daten aus dem Formular CustomerList[lvCustomer.Selected.Index].KDNR:=strtoint(frmCustomer.edtKDNR.Text); CustomerList[lvCustomer.Selected.Index].Name:=frmCustomer.edtName.Text; CustomerList[lvCustomer.Selected.Index].Vorname:=FRMCustomer.edtVorname.Text; CustomerList[lvCustomer.Selected.Index].Firma:=FRMCustomer.edtFirma.text; CustomerList[lvCustomer.Selected.Index].Produkt:=FRMCustomer.edtProdukt.text; CustomerList[lvCustomer.Selected.Index].Anzahl:=strtoint(FRMCustomer.edtAnzahl.text); CustomerList[lvCustomer.Selected.Index].Preis:=strtocurr(FRMCustomer.edtPreis.Text); FuelleListView; end; end; end; procedure TFRMMainCustomer.clearAllFields; begin with FRMMainCustomer do begin edtKDNR.Clear; edtName.Clear; edtVorname.Clear; edtFirma.Clear; edtProdukt.Clear; edtAnzahl.Clear; edtPreis.Clear; end; end; procedure TFRMMainCustomer.connect; begin conMain.LibraryLocation:=ExtractFilePath(application.ExeName)+'sqlite3.dll'; conMain.Database:=ExtractFilePath(application.ExeName)+'WarenVK.sqlite'; conMain.Connected:=true; zqryMain.SQL.Clear; zqryMain.Params.Clear; zqryMain.SQL.Text:='SELECT * FROM WARENVERKAUF1'; zqryMain.Open; while not zqryMain.Eof do begin saveTableData(zqryMain.FieldByName('ID').AsString,zqryMain.FieldByName('KDNR').AsString,zqryMain.FieldByName('Name').AsString, zqryMain.FieldByName('Vorname').AsString,zqryMain.FieldByName('Firma').AsString,zqryMain.FieldByName('Produkt').AsString,zqryMain.FieldByName('Anzahl').AsString, zqryMain.FieldByName('Preis').AsString); zqryMain.Next end; zqryMain.Close; end; procedure TFRMMainCustomer.FormCreate(Sender: TObject); begin CustomerList:=TCustomerList.Create; connect; clearAllFields; end; procedure TFRMMainCustomer.FormDestroy(Sender: TOBject); begin CustomerList.Free; end; procedure TFRMMainCustomer.FuelleListView; var li: TListItem; I: Integer; begin lvCustomer.Items.BeginUpdate; Try //ListView mit Daten aus der ObjectList befüllen. lvCustomer.Items.Clear; for I := 0 to CustomerList.Count-1 do begin li:=lvCustomer.Items.Add; li.Caption:=inttostr(CustomerList[i].KDNR); li.SubItems.Add(CustomerList[i].Name); li.SubItems.Add(CustomerList[i].Vorname); li.SubItems.Add(CustomerList[i].Firma); li.SubItems.Add(CustomerList[i].Produkt); li.SubItems.Add(inttostr(CustomerList[i].Anzahl)); li.SubItems.Add(FormatCurr('#0.00 €', CustomerList[i].Preis)); end; Finally lvCustomer.Items.EndUpdate; End; end; procedure TFRMMainCustomer.lvCustomerClick(Sender: TObject); var CurrentCustomerID : string; begin if lvCustomer.SelCount>=1 then begin CurrentCustomerID:=lvCustomer.Selected.Caption; // zqryMain.SQL.Clear; zqryMain.Params.Clear; zqryMain.SQL.Text:='SELECT * FROM WARENVERKAUF1 WHERE ID = :CID'; // WHERE ID='+#39+ID+#39; zqryMain.ParamByName('CID').AsString := CurrentCustomerID; // zqryMain.Open; edtKDNR.text:=zqryMain.FieldByName('KDNR').AsString; edtName.text:=zqryMain.FieldByName('Name').AsString; edtVorname.Text:=zqryMain.FieldByName('Vorname').AsString; edtFirma.text:=zqryMain.FieldByName('Firma').asstring; edtProdukt.text:=zqryMain.FieldByName('Produkt').AsString; edtAnzahl.text:=zqryMain.FieldByName('Anzahl').AsString; edtPreis.Text:=zqryMain.FieldByName('Preis').AsString; zqryMain.Next; // zqryMain.close; end; end; procedure TFRMMainCustomer.saveTableData(ID, KDNR, NAME, VORNAME, FIRMA, PRODUKT, ANZAHL, PREIS: string); var item:TListItem; begin Item:=lvCustomer.Items.Add; item.Caption:=ID; // item.SubItems.Add(KDNR); // item.SubItems.Add(Name); item.SubItems.Add(Vorname); item.SubItems.Add(Firma); item.SubItems.Add(Produkt); item.SubItems.Add(Anzahl); item.SubItems.Add(Preis); end; end.
Norbert
|
Zitat |
Registriert seit: 28. Apr 2008 Ort: Stolberg (Rhl) 6.659 Beiträge FreePascal / Lazarus |
#20
Hallo EdAdvokat
nicht in die Tonne kloppen, aber den Editor schließen und mit Papier und Bleistift ein Konzept erstellen. Was willst Du? Kundendaten verwalten. was sind Kundendaten und was verstehst Du unter Verwalten? Ich würde es jetzt so angehen, das das Verwalten in Delpi programmiert wird, also Du zunächst anzeigen willst. Dann vorhandene Daten ändern und neue Daten erfassen. Benötigst Du hierfür eine Darstellung oder drei unterschiedliche? Usw. Nur solange es eben geht, vermeide es ein konkretes Feld (Name,Ort etc.) zu nutzen. Der andere, nicht der erste oder zweite, ist es die Daten zu definieren und der DB eine Struktur zu geben. Es ist für die die Daten vollkommen unerheblich wie die Benutzeroberfläche aussieht, und für die Oberfläche ist es egal wie sie an die Daten kommt. Wenn Du z.B. durch eine Datenmenge scrollen willst, ist das meiner Meinung nach eine Aufgabe der Oberfläche, genauso kannst Du aber jeden Datensatz einzeln abrufen, das wäre dann das Design der Schnittstelle. So solltest Du Dir langsam erarbeiten was Du willst, bzw. was Dein Programm leisten soll. Und wenn Du das Konzept erstellt hast, dann kannst Du daran gehen zu coden. Gruß K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |