Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank (https://www.delphipraxis.net/193418-%5Btutorial%5D-laden-speichern-von-objekten-einer-normalisierten-datenbank.html)

haentschman 28. Jul 2017 06:10

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
Liste der Anhänge anzeigen (Anzahl: 2)
Moin...:P
Zitat:

Danke für das Tutorial.
Zitat:

Erst einmal vielen Dank!
...Dankeschön. :P

Zitat:

Der Spass fängt aber dann an wenn du ein Grid oder Listview scrollen und editieren möchtest,
Zitat:

Wie würdest du denn so etwas bei deinem Vorschlag lösen ?
Persönlich habe ich mich entschieden, daß niemals in der Listview editiert wird. Das hatte den Grund, daß mehr Informationen zu editieren waren als Spalten optisch zur Verfügung standen. Zum Editieren blende ich einfach eine modale Form über die Listview ein. Ich nenne sie InlineEditor. (siehe Bild 1) Damit kann ich beliebige Informationen editieren und die Controls im InlineEditor selbst, auch wegen der Optik, festlegen. Dem InlineEditor wird das Objekt, welches am Listvieweintrag hängt, übergeben...usw. (siehe Bild 2) Am Objekt kann man sehen, daß das mit dem Dataset nicht übersichtlich möglich ist. Das Objekt würde eigentlich aus mindestens 3 Datasets bestehen. 8-)
Zitat:

Das müsste ja meiner Meinung nach auch gekapselt werden, das will man nicht immer wieder neu schreiben müssen.
Der Kreativität sind keine Grenzen gesetzt. :thumb: In meinen Produktivprojekten ist einiges als gemeinsamer Code ausgelagert um nicht alles neu schreiben zu müssen. Beispiel. Der InlineEditor. Den leite ich von der Basis, mit aller Logik für die Anzeige etc., ab.
...aber das würde zu weit führen und hat nichts mit dem Thema zu tun. :wink:
Zitat:

aber das wären nur Detailänderungen, die mir pers. besser in den Kram passen würden.
Der Kreativität sind keine Grenzen gesetzt. :thumb: Du kannst das Prinzip für deine Bedürfnisse anpassen.
Zitat:

sollte immer die (formal) gleiche Liste liefern.
...das ist korrekt.
Zitat:

Mit einem TDataModule kommt man (ich) genauso weit, einziges Problem(?) für jede DB brauch ich ein eigenes Modul
1. Wenn eh keine Querykomponenten auf dem DataModule liegen kannst du dir das auch sparen. :zwinker: Prinzipiell kommst du auch mit einem DataModule für eine Datenbank zurecht. Wenn du ein neues DBMS dazunimmst, kommst du um eine Abstraktion nicht herum.
Delphi-Quellcode:
// Klassendefinition oder so ähnlich
TDataBaseAbstract = class
public
  procedure Blubb; abstract;
end;
...
TDataBase1 = class(TDataBaseAbstract)
public
  procedure Blubb; override; // die spezielle Implementierung für Blubb
end;
...
TDataBase2 = class(TDataBaseAbstract)
public
  procedure Blubb; override; // die spezielle Implementierung für Blubb
end;

// Instanz
FDatabase: TDataBaseAbstract;
...
FDatabase := TDataBase2.Create; // oder so...
...die Vorteile von Interfaces wurde schon an anderer Stelle diskutiert. http://www.delphipraxis.net/192364-t...nterfaces.html

p80286 28. Jul 2017 12:06

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
Zitat:

Zitat von haentschman (Beitrag 1377665)
Prinzipiell kommst du auch mit einem DataModule für eine Datenbank zurecht. Wenn du ein neues DBMS dazunimmst, kommst du um eine Abstraktion nicht herum.

Danke, das hätte man mir ja auch gleich so erklären können:oops:, die ODenke hab ich eben immer noch nicht ganz verinnerlicht.

Gruß
K-H

haentschman 28. Jul 2017 12:49

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
Hallöle...:P
Zitat:

Danke, das hätte man mir ja auch gleich so erklären können
8-) Das wichtige ist nicht das Interface. Ein Datenmodul tut es auch. :P Sondern die Verlagerung aller SQL Statements in eine Unit ist Voraussetzung. :thumb: Dann kann man "schnell" wechseln...

KodeZwerg 23. Mai 2018 23:41

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
Hallo, Vorweg: Das Tutorial ist gut gelungen auch wenn da mehr Code gezeigt wird als das Code erklärt wird.
Neugierig wie ich bin plus DB Neuling habe ich mir das Projekt geladen und beim Start der .exe erscheint das (gekürzt aufs wesentliche):
Zitat:

executable : Tutorial.exe
exec. date/time : 2017-07-27 14:01
version : 1.0.0.0
compiled with : Delphi 10.1 Berlin
madExcept version : 4.0.16
callstack crc : $0c5e2cf1, $23db6709, $23db6709
exception number : 1
exception class : EAccessViolation
exception message : Zugriffsverletzung bei Adresse 007FF967 in Modul 'Tutorial.exe'. Lesen von Adresse 00000008.

main thread ($11f8):
007ff967 +00b Tutorial.exe Logic.Base 143 +2 TLogic.GetCustomerList
00800a6e +026 Tutorial.exe FormMain 210 +2 TfoMain.FormShow
0065a34d +015 Tutorial.exe Vcl.Forms TCustomForm.DoShow
0065ebb9 +0a9 Tutorial.exe Vcl.Forms TCustomForm.CMShowingChanged
005a700e +2be Tutorial.exe Vcl.Controls TControl.WndProc
005abb59 +5e9 Tutorial.exe Vcl.Controls TWinControl.WndProc
0065ae0d +64d Tutorial.exe Vcl.Forms TCustomForm.WndProc
005a6c48 +024 Tutorial.exe Vcl.Controls TControl.Perform
005aaf21 +10d Tutorial.exe Vcl.Controls TWinControl.UpdateShowing
005ab030 +0bc Tutorial.exe Vcl.Controls TWinControl.UpdateControlState
005adc2a +026 Tutorial.exe Vcl.Controls TWinControl.CMVisibleChanged
005a700e +2be Tutorial.exe Vcl.Controls TControl.WndProc
005abb59 +5e9 Tutorial.exe Vcl.Controls TWinControl.WndProc
0065ae0d +64d Tutorial.exe Vcl.Forms TCustomForm.WndProc
005a6c48 +024 Tutorial.exe Vcl.Controls TControl.Perform
005a55fa +026 Tutorial.exe Vcl.Controls TControl.SetVisible
0065a629 +03d Tutorial.exe Vcl.Forms TCustomForm.SetVisible
00664897 +0b3 Tutorial.exe Vcl.Forms TApplication.Run
0080e9d9 +061 Tutorial.exe Tutorial 25 +5 initialization
77533675 +010 kernel32.dll BaseThreadInitThunk

thread $12f4:
77cd00f6 +0e ntdll.dll NtWaitForMultipleObjects
77533675 +10 kernel32.dll BaseThreadInitThunk

thread $1128:
77cd1edf +0b ntdll.dll NtWaitForWorkViaWorkerFactory
77533675 +10 kernel32.dll BaseThreadInitThunk

thread $104c:
77cd1edf +0b ntdll.dll NtWaitForWorkViaWorkerFactory
77533675 +10 kernel32.dll BaseThreadInitThunk

thread $afc:
77cd1edf +0b ntdll.dll NtWaitForWorkViaWorkerFactory
77533675 +10 kernel32.dll BaseThreadInitThunk

modules:
00400000 Tutorial.exe 1.0.0.0 \Win32
10000000 fbclient.dll 2.5.1.26351 \Win32
4a800000 icuuc30.dll 3.0.0.0 \Win32
4ad00000 icudt30.dll 3.0.0.0 \Win32

disassembling:
[...]
007ff95d mov ebp, esp
007ff95f push ecx
007ff960 push ebx
007ff961 mov [ebp-4], eax
007ff964 143 mov eax, [ebp-4]
007ff967 > mov edx, [eax+8]
007ff96a mov eax, [ebp-4]
007ff96d mov eax, [eax+4]
007ff970 mov ecx, [eax]
007ff972 call dword ptr [ecx+$3c]
007ff972
[...]
Müssen Voraussetzungen erfüllt werden um die .exe zu Starten?

haentschman 24. Mai 2018 05:46

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
Moin...:P
Da ich auf der Arbeit kein UniDAC habe, kann ich es erst am Wochenende nachschauen. Aber normalerweise gibt es keine Voraussetzungen als die EXE im "out" Ordner zu starten. :gruebel:

Nachtrag:
Zitat:

da mehr Code gezeigt wird als das Code erklärt wird.
...mit Absicht. Nicht jede Zeile muß man erklären. Für tiefsinnige Fragen ist hier der Platz dafür. :zwinker:

mkinzler 24. Mai 2018 06:54

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
Was steht den in der Zeile?

haentschman 24. Mai 2018 07:08

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
Zitat:

007ff967 +00b Tutorial.exe Logic.Base 143 +2 TLogic.GetCustomerList
Delphi-Quellcode:
procedure TLogic.GetCustomerList;
begin
  // Daten holen und in die übergebene Liste ablegen
  FDatabase.FillList(FCustomerList); // <- 143 FCustomer List ist instanziert
  DataChanged := False; // Setter
  // Liste per Event übergeben
  if Assigned(FOnFillCustomerList) then
  begin
    FOnFillCustomerList(Self, FCustomerList);
  end;
end;
Delphi-Quellcode:
constructor TLogic.Create;
begin
  FDataChanged := False;
  // Customer Liste erstellen
  FCustomerList := TCustomerList.Create(True); // Instanz
  // Datenbank Interface
  FDatabase := TDatabaseFirebird.Create; // An diesem Punkt wird das Interface gewechselt auf ein anderes DBMS z.b. entsprechend der Einstellungen in der INI/XML usw.
  // Eventhandler einhängen
  FDatabase.OnAfterConnect := DoOnAfterConnect;
  FDatabase.OnAfterDisconnect := DoOnAfterDisconnect;
  FDatabase.OnDatabaseError := DoOnDatabaseError;

  FDatabase.Connect; // ggf. Prüfung auf Rückgabewert (Connected)
end;

destructor TLogic.Destroy;
begin
  FCustomerList.Free; // die enthaltenen Objekte werden automatisch weggeräumt.
  // Keine Freigabe des Interfaces nötig. :-)
  inherited;
end;

mkinzler 24. Mai 2018 07:15

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn man das Programm ausführt, kommt der Fehler bei mir auch. Selberkompiliert funktioniert es, nachdem ich die Datenbankverbindung auf embedded umgestellt habe.

Delphi-Quellcode:
FConnection.Server := ''; //'firma-server/3025'; // Embedded

haentschman 24. Mai 2018 07:29

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
:oops: Echt jetzt? Zu meiner Verteidigung...ich arbeite nie mit Embedded. :wink:
Zitat:

'firma-server/3025'; // Embedded
...das muß logischerweise raus! Ich hatte das noch "markiert" um es nicht zu vergessen. Getreu dem Motto: Wer nichts macht, macht nichts falsch...und wer nichts falsch macht, wird befördert.

@mkinzler: Danke.

KodeZwerg 24. Mai 2018 08:13

AW: [Tutorial] Laden / Speichern von Objekten in einer normalisierten Datenbank
 
Danke mkinzler, Deine .exe kann ich Starten!
Ich habe soeben Versucht das Projekt mit Tokyo zu öffnen = Package PngComponents fehlte mir, hab das von Uwe Raabe geladen und installiert also öffnen lässt es sich jetzt ohne Probleme.
Jetzt das nächste mir fehlende, Uni.pas. Ich vermute UniDAC ist damit gemeint und hier meine Frage:
Reicht da die Express oder muss ich die Pro Version nehmen? (ich = planlos da Neuling)

Vielen Dank für Hilfe!

Das MadExcept aus der .dpr habe ich auskommentiert, reicht das aus oder muss ich MadExcept dafür auch laden und installieren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:51 Uhr.
Seite 2 von 4     12 34      

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