Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Aufgaben mit LiveBindings und Delphi-DB's erledigen (https://www.delphipraxis.net/189090-aufgaben-mit-livebindings-und-delphi-dbs-erledigen.html)

Harry Stahl 2. Mai 2016 16:59

Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe jetzt mal ein paar Informationen im Delphi DOC-Wiki zu LiveBindings gelesen. Da scheinen mehr Möglichkeiten drin zu stecken, als ursprünglich von mir vermutet.

Daher meine Frage: Ist es möglich, in einem VCL-Projekt mit LiveBindings und einer (welcher?) Delphi-Datenbank eine einfache Datei mit 10 Feldern ohne viel Aufwand zu verwalten und dabei die folgenden Anforderungen zu erfüllen:

* Die Liste sollte bei Bedarf sortierbar sein, aber auch ohne Sortierung darstellbar sein
* Feldinhalte sollten mit unterschiedlichen Farben in der Liste angezeigt werden können
* Datensätze sollten gefiltert werden können und dann nur die gefilterten Sätze in der Liste angezeigt werden
* Es sollte ohne großen Aufwand eine andere Datenbank-Datei (Standard / User) gewählt werden können, gleiche Felder
* Es sollten Icons in den Spalten darstellbar sein
* Datensätze sollten in der nicht sortierten Liste eine Zeile nach oben oder eine nach unten verschiebbar sein
* Datensätze sollten in der nicht sortierten Liste per Drag und Drop verschiebbar sein.
* Wäre toll, wenn die Datenbank ohne Feldlängenbegrenzung auskommt und ich mich nicht um so was kümmern müsste
* Ein Datensatz sollte mit einem eigenständigen Dialog erzeugt / bearbeitet werden können

Ich wäre dankbar für generelle Aussagen, ob das so mit LiveBindings (incl. Expressions) RELATIV EINFACH realisierbar wäre und wenn Ja, welche Datenbank zu empfehlen wäre (bitte möglichst eine einfache, ich bin da völlig ahnungslos mit Delphi-DB's - mir steht Delphi-Enterprise 10.1 zur Verfügung).

Die Funktionalität ist derzeit im Programm mit einer Alternativlösung (einfache TStringlist, Felder getrennt durch Sonderzeichen) schon vorhanden (zur Verdeutlichung 2 anliegende Screenshots). Mich nervt aber, dass für so relativ einfache Aufgaben - Verwaltung einer einfachen Liste - (immer wieder mal) so ein großer Aufwand betrieben werden muss (Source-Zeilen in der Unit, die das bei mir erledigt, hat ca. 600 Zeilen). Daher würde ich hier gerne als "Blaupause" mal eine Umstellung auf LiveBindings testen.

Bevor ich mich jedoch an die Arbeit mache, wäre ich über einige Hinweise oder Ratschläge von Euch dankbar.

Fritzew 3. Mai 2016 10:28

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
Also ich denke nicht das Du mit den Livebindings da wirklich "schnell" zum Ziel kommst. Mein Eindruck ist eher das die LiveBindigs VCL stiefmütterlich behandelt werden. Das ganze Konzept ist sh..... (meine Meinung).
Zur Datenbank schaue dir sqlite an dass sollte Deinen Anforderungen noch am nächsten kommen.

stahli 3. Mai 2016 11:28

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
Es gab schon einige solche Versuche. Zuletzt hier: http://www.delphipraxis.net/188754-b...iskussion.html

Ist aber meiner Kenntnis nach noch nichts nachhaltiges draus entstanden.

Stevie 3. Mai 2016 12:00

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
Da die VCL spezielle DB Controls hat, würde ich das gerade bei einer Datenbank/Dataset als Backend jederzeit irgendeiner Binding Lösung bevorzugen.
Bei FMX sieht das (leider) anders aus, da es dort keine speziellen DB Controls gibt, die mit einer TDataSource zusammen arbeiten.

p80286 3. Mai 2016 15:07

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
"Wenn man's kann ist alles einfach."

Für mich sehen Deine beiden Beispiele wie eine klassische DB-Anwendung aus.
Ich würde da keinen Gedanken an LiveBindings oder DB-Controls verschwenden.
Wenn ich Dich richtig verstanden habe und die richtigen Schlüsse ziehe, dann hast Du z.Zt eine Stringlist, die Du in einer Listview anzeigst. (OK da gibt's noch etwas zum sortieren und ..)
Wahrscheinlich wird Deine Stringlist aus einer Datei gefüllt. Diese Datei würde ich durch eine Query und eine Firebird-DB ersetzen. Sprich Filtern und Sortieren z.B. wird in der SQL-Abfrage erledigt, und die Query schreibt die entsprechenden Ergebnisse in eine Stringlist. Diese wird wie gehabt angezeigt. Kombinierst Du die Query noch mit einer Connection ist der Wechsel der DB eine Kleinigkeit (ist aber ach so kein Hexenwerk!)
Was die DB angeht, bevorzuge ich Firebird, aber auch alle anderen lokalen DBs sollten erst einmal genügen. Und der Austausch sollte in zwei Schritten erledigt sein:
a) Konvertieren/Übertragen der Daten
b) Ändern der Connection-Parameter
uU. ist noch ein dritter Schritt notwendig
c) Anpassen der SQL-Texte

Und wenn Du das alles noch in ein DataModule auslagerst hast Du eine richtig pflegeleichte Anwendung.

Gruß
K-H

Harry Stahl 3. Mai 2016 18:40

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
Erst mal vielen Dank für Eure Antworten.

Habe mir mal das ClientDataset in Verbindung mit dem DBGrid angesehen, ich denke, das erfüllt bestens die gestellte Aufaben (Sortierung, Filterung). Mit meiner bisherige StringList befüllte ich das ClientDataset, wenn der Bearbeitungsdialog gestartet wird. Dann kann ich Filtern, sortieren, bearbeiten usw. und nach OK übertrage ich den Inhalt aus dem ClientDataset wieder in meine Stringliste. Einfache Sache und ich kann die bestehende Dateistruktur beibehalten.

Per LiveBindings habe ich eine Edit.Text Eigenschaft mit der Filter-Eigenschaft aus dem ClientDataset verbunden (über eine Expression), so dass ich hier ganz einfach über die Eingabe von Suchtext in das Editfeld filtern kann.

Was mir dabei auffällt:

* Nach dem Setzen des Filters aktualisiert sich das DBGrid erst, wenn ich einmal darauf klicke. Gibt einen Befehl, der das sofort nach Setzen des Filters macht?

* Wenn das Programm mit Styles arbeitet, werden Farben im DBGrid, die man über den Spalten-Editor setzt (den kannte ich noch gar nicht), nicht berücksichtigt, AUCH DANN, wenn man über StyleElements den entsprechenden Ausschluss vornimmt. Ist das ein bekannter Bug und wie kann man das umgehen?

* Wenn ich filtere, kann ich z.B. mit NameOFField = 'TTab*' mir einen gesuchten Eintrag anzeigen lassen. Gibt es eine Möglichkeit, direkt in allen Feldern zu suchen ('*' hat nicht funktioniert).

Wie gesagt, die ganze Datenbankarbeit mit den typischen Delphi-Datenbank-Komponenten ist neu für mich. Aber die Funktionalität von ClientDataset und DBGrid finde ich schon toll. Damit kann man viel Handarbeit ersparen.

Jumpy 4. Mai 2016 08:34

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
Wie setzt du denn den Filter? Ich mach das immer wie folgt und das Grid aktualisiert sich ohne das ich reinklicken muss:

Delphi-Quellcode:
//ggf.: ClientDataset.Filtered:=false;
ClientDataset.Filter:='irgendwas';
ClientDataset.Filtered:=true;

Bei deinem dritten Sternchen, hab ich die Intention nicht ganz verstanden, aber du kannst den Filterstring ja beliebeig formulieren, fast wie eine Where-Bedingung in einem SQL-Statement.

NameOFField1 = 'TTab*' Or NameOFField2 = 'TTab*' or NameOFField3 = 'TTab*'

Harry Stahl 4. Mai 2016 18:32

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
Zitat:

Zitat von Jumpy (Beitrag 1337433)
Wie setzt du denn den Filter? Ich mach das immer wie folgt und das Grid aktualisiert sich ohne das ich reinklicken muss:

Delphi-Quellcode:
//ggf.: ClientDataset.Filtered:=false;
ClientDataset.Filter:='irgendwas';
ClientDataset.Filtered:=true;

Ja mach ich jetzt auch so. Dann funktioniert das auch. Allerdings reagiere ich nun direkt auf das OnChange-Event des Edits, zuvor hatte ich den Edit.Text über LiveBindings mit einer Expression verbunden, vielleicht gibt es da ein Problem.

Zitat:

Zitat von Jumpy (Beitrag 1337433)
Bei deinem dritten Sternchen, hab ich die Intention nicht ganz verstanden, aber du kannst den Filterstring ja beliebeig formulieren, fast wie eine Where-Bedingung in einem SQL-Statement.

NameOFField1 = 'TTab*' Or NameOFField2 = 'TTab*' or NameOFField3 = 'TTab*'

Um mehrere Felder zu berücksichten, muss ich

Delphi-Quellcode:

qf := QuotedStr (bnFind.Text+'*');

cds1.Filter := 'QuellDaten = ' + qf + ' OR ' +
               'ZielDaten = ' + qf +  ' OR ' +
               'AusnahmeKomp = ' + qf + ' OR ' +
               'Wert = ' + qf;
eingeben.

Schön wäre es, wenn es ein "SearchInAnyField"-Platzhalter gäbe, so das dass ich nicht jedes einzelne Feld hier angeben muss.

Weiterer Punkt: Ist hier tatsächlich die Beschränkung gegeben, dass man nur nach

grid*

filtern kann,

aber nicht nach

*grid*?

Mit der ersten Variante wird z.B. bei der Eingabe von "grid" der gesuchte Text nicht gefunden, wenn der mit "TGrid" beginnt, die zweite Variante wird aber anscheinend nicht unterstützt.

Sir Rufo 4. Mai 2016 19:04

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
@Harry

Du kennst die Methode Delphi-Referenz durchsuchenTDataSet.OnFilterRecord?

Das kombiniert mit dem Bei Google suchenSpecification Pattern macht es sehr schlank
Delphi-Quellcode:
procedure TWhatever.DataSetOnFilterRecord( Dataset: TDataSet; var Accept: Boolean );
begin
  Accept := CurrentFilter.IsSatisfiedBy( DataSet );
end;
Delphi-Quellcode:
DataSetSpecifications = class
  class function IsInAnyField( aStr: string ): ISpecification<TDataSet>;
  // usw.
end;

Harry Stahl 4. Mai 2016 19:33

AW: Aufgaben mit LiveBindings und Delphi-DB's erledigen
 
Danke für den Hinweis. Nein, kannte ich noch nicht (mal kurz gesehen).

Aber verstehe ich das richtig, hier wird mir eine Datenmenge als Ergebnis meines Filters gegeben, die ich nun akzeptieren kann oder nicht.

D.h. ich kann nur weiter einschränken, aber nicht den Filter erweitern, oder?

Ich möchte erreichen, dass statt "TGrid" auch schon "grid" akzeptiert wird als ein valides Ergebnis des Filters, wenn ich z.B. auf ein TStringGrid treffe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr.
Seite 1 von 2  1 2      

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