Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGrid verliert dsInsert-Status bei Fokus-Wechsel auf DBMemo (https://www.delphipraxis.net/85101-dbgrid-verliert-dsinsert-status-bei-fokus-wechsel-auf-dbmemo.html)

anse 26. Jan 2007 00:00

Datenbank: MySQL • Zugriff über: Zeos

DBGrid verliert dsInsert-Status bei Fokus-Wechsel auf DBMemo
 
Wie der Betreff schon sagt: In einem DBGrid kann ich einen neuen Datensatz anlegen, sodaß sich das DataSet.State in "dsInsert" befindet. Sobald ich aber zB um ein BLOB-Feld zu bearbeiten mit der Maus ein DBMemo anklicke, wird DataSet.State wieder auf dsBrowse gesetzt bzw. DataSet.Cancel intern aufgerufen.

Dieses Problem besteht nur, sofern ich nicht vorher bereits in einem anderen Feld Daten eingegeben habe, also wenn der neue Datensatz noch auf "Modified = False" steht. Daher dachte ich: setze ich doch einfach
Delphi-Quellcode:
MeinDataSet.Modified := True;
und zwar sobald ich mit der Maus ein Blob-Feld angeklickt habe. Das geht aber leider nicht, da Modified eine ReadOnly-Eigenschaft ist. Eine andere Idee war (obschon häßlich), beim Start des dsInsert-Modus alle Blob-Felder mit einem leeren String zu füllen, damit dadurch Modified auf true gesetzt wird. Aber selbst das funktioniert nicht, da Modified wohl nur bei Tastaturanschlägen oder Mausaktionen auf True gesetzt wird.

Gibt es also einen Weg bei einem Fokus-Wechsel von DBGrid auf andere Komponenten den dsInsert-Status zu behalten?

marabu 26. Jan 2007 07:41

Re: DBGrid verliert dsInsert-Status bei Fokus-Wechsel auf DB
 
Hallo Ansgar,

mir scheint, dein Problem ist hausgemacht. Zumindest die ZEOS Komponenten 6.5.1-alpha enthalten einen solchen Bug nicht. Eventuell hast du event handler geschrieben, in denen Post() oder Cancel() für den Dataset ausgeführt wird. Du könntest Breakpoints an den entsprechenden Stellen setzen um zu erfahren an welcher Stelle der dsBrowse Status gesetzt wird.

Grüße vom marabu

anse 27. Jan 2007 23:57

Re: DBGrid verliert dsInsert-Status bei Fokus-Wechsel auf DB
 
Ich habe da keinen Handler für ein Post oder Cancel eingebaut - schade sonst wär das die Lösung gewesen :)

Habe das mal genauer untersucht, indem ich eine kleine Anwendung zusammengeklickt habe mit
- TClientDataset
- TDataSource
- TDBGrid
- TDBMemo

Das Clientdataset habe ich mal stumpf zur Designzeit mit Daten gefüllt. Felder:
- 1 x ftInteger
- 1 x ftMemo

Wenn ich nun, wie in meinem erstem Posting, zur Laufzeit einen neuen Datensatz einfügen will, indem ich zB mit einem DBNavigator auf das Plus klicke, setze ich ja den TClientDataset.State auf "dsInsert". Danach:
- mit Maus in das Memo-Feld im DBGrid klicken
- in das "angeschlossene" DBMemo klicken, weil ich den Text dort reinschreiben will
- und zack: sobald ich in das DBMemo klicke, befindet sich das DBGrid wieder im dsBrowse Modus wo also der neue (bisher leere) Datensatz futsch ist.

Das Problem was ich habe, hängt also nicht mit der darunterliegenden ZEOSlib zusammen. Vielmehr frage ich mich, ob das das Standardverhalten diese DB-Komponenten sein kann oder ob ich irgendeine Propery noch setzen muß, damit der dsInsert-Modus im DBGrid behalten wird?

marabu 28. Jan 2007 07:33

Re: DBGrid verliert dsInsert-Status bei Fokus-Wechsel auf DB
 
Guten Morgen,

Zitat:

Zitat von marabu
Zumindest die ZEOS Komponenten 6.5.1-alpha enthalten einen solchen Bug nicht.

das war die Kurzfassung. Getestet hatte ich so, wie du es in deinem letzten Beitrag beschreibst.

Zitat:

Zitat von anse
Das Problem was ich habe, hängt also nicht mit der darunterliegenden ZEOSlib zusammen.

Wer bin ich, dass ich dir zu widersprechen wage?

Freundliche Grüße

Sharky 28. Jan 2007 07:46

Re: DBGrid verliert dsInsert-Status bei Fokus-Wechsel auf DB
 
Zitat:

Zitat von anse
... Gibt es also einen Weg bei einem Fokus-Wechsel von DBGrid auf andere Komponenten den dsInsert-Status zu behalten?

Hai anse,

ich habe mir eben mal den Code vom TCustomDBGrid angesehen. Dort gibt es ein OnExit das zumindest bei BDS 2006 ein Cancel des TDataSet aufruft.

Aber es gibt bei den Optionen des DBGrid die Einstellung dgCancelOnExit. Setze dieses doch einfach mal auf False.

anse 28. Jan 2007 10:10

Re: DBGrid verliert dsInsert-Status bei Fokus-Wechsel auf DB
 
Zitat:

Zitat von Sharky
Aber es gibt bei den Optionen des DBGrid die Einstellung dgCancelOnExit. Setze dieses doch einfach mal auf False.

Man bin ich dumm... Du hast recht, damit ist das Problem behoben und ich habe einen Bug weniger! :)

Vielen Dank!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:18 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