| Autor |
Beitrag |
Johannes Maier
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Mi 08.12.04 15:14
Hallo,
ich habe eine Paradox-Tabelle, in der auf ButtonClick die markierte Zeile gelöscht werden soll. Aber falls ich mich nun am Ende der Tabelle befinde und noch einmal "ArrowDown" drücke und die entstandene Zeile markiere, oder falls ich eine Zeile in der Mitte einfüge und diese markiere, dann auf "Delete" drücke, dann löscht er die eben entstandene Zeile PLUS die Zeile darüber
Diese Zeilen, die durch Insert entstehen oder am Schluss und noch leer sind, die sind wohl temporär, solange sie nicht gefüllt werden existieren sie anscheinend gar nicht.
Wie kann ich es einstellen/hinbekommen, dass, falls solch eine (mit einem * markierte) Zeile bei Table.Delete ALLEINE gelöscht wird, und nicht noch eine wichtige Zeile darüber?
Puh, ich hoffe ich konnte mein Problem irgendwie anschaulich machen
Danke schonmal
_________________ MfG
Johannes ehem. jbmaier
|
|
Johannes Maier 
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Mi 08.12.04 16:53
Tut mir sehr leid wegen dieses Doppelpostings, aber es ist recht dringend und ich habe trotz Suche keine Lösung gefunden  habe leider keine Ahnung, nach welchen Stichworten ich da suchen muss
Wäre sehr nett, falls mir einer da einen Tipp geben könnte
Wie bekomme ich heraus, ob die Zeile, in der ich mich befinde, nur "temporär" (also mit * statt mit einem Pfeil markiert) ist oder "statisch"?
_________________ MfG
Johannes ehem. jbmaier
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 08.12.04 17:11
| Johannes Maier hat folgendes geschrieben: | [...]Stichworten[...]
Wie bekomme ich heraus, ob die Zeile, in der ich mich befinde, nur "temporär" (also mit * statt mit einem Pfeil markiert) ist oder "statisch"? |
Helfen könnten Dir z.B. TDataSet.State und TDataSet.BeforeCancel
|
|
Johannes Maier 
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Mi 08.12.04 21:10
Ah vielen Dank, wenn ich den dsCode.State = dsInsert abfrage, kann ich diese "temporäre" Zeile löschen, wenn ich vorher einen Datensatz mit tblCode.Insert einsetzen wollte.
Allerdings geht es immer noch nicht bei dem anderen Fall (ich beschreib ihn noch mal):
Ich befinde mich in der letzten Zeile der Tabelle. Jetzt drücke ich "ArrowDown" (heißt das so?) und dann erscheint solch eine "temporäre" Zeile, die mit einem * markiert ist. Wenn ich nun auf Delete drücke (tblCode.Delete wird ausgeführt), dann ist wohl nicht der Status dsInsert aktiv, denn es wird immer die temporäre + die letzte Tabellenzeile gelöscht.
Welchen Status hat die Tabelle, wenn ich mich in dieser "temporären" Zeile befinde? (bzw. diese gerade erzeugt habe)
Danke
_________________ MfG
Johannes ehem. jbmaier
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 08.12.04 23:53
| Johannes Maier hat folgendes geschrieben: | | [...] Welchen Status hat die Tabelle, wenn ich mich in dieser "temporären" Zeile befinde? [...] |
dsInsert
Aber so ganz kann ich Dein Problem nicht nachvollziehen. Gegeben ist ein Minimalprojekt: eine Form, darauf eine TTable, eine TDataSource, ein TDBGrid und ein TButton und folgende Ereignis-Methoden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Table1BeforeCancel(DataSet: TDataSet); begin if DataSet.State = dsInsert then ShowMessage('Insert'); end;
procedure TForm1.Button1Click(Sender: TObject); begin Table1.Delete; end; |
Wenn ich - wie Du beschrieben hast - im DBGrid den Cursor in die letzte Zeile bewege, dann mit "Cursor runter" einen neuen Datensatz anfüge (der dann mit einem * markiert wird) und danach den Button drücke, wird dieser neu hinzugefügte Datensatz gelöscht und die Meldung "Insert" ausgegeben.
Vielleicht solltest Du Deinen Code nochmal überprüfen oder selbigen hier auszugsweise posten.
|
|
Johannes Maier 
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Do 09.12.04 17:48
Ich mache quasi genau das Gleiche (mit deinem Code geht es), versuche allerdings mal bitte, bei BeforeCancel (wann genau tritt das eigentlich ein?) nichts hinzuschreiben, sondern erstelle mal wieder durch runterscrollen eine temporäre Zeile und markiere diese mit der Maus so, dass das Feld blau hinterlegt ist und führe dann ein einfaches Table1.Delete aus. Dann löscht er nämlich auch die vorherige Zeile
Da es mit deinem Code allerdings funktioniert, könntest du mir sagen, wann das BeforeCancel eintritt und was ich da hineinschreiben muss, damit mir das Problem nicht wieder passiert? Denn ich möchte nicht immer eine Message anzeigen
Schonmal vielen Dank!
_________________ MfG
Johannes ehem. jbmaier
|
|
greg
      
Beiträge: 119
Windows2000, WindowsXP
D5 Prof
|
Verfasst: Do 09.12.04 18:15
Hallo Johannes,
es gibt BeforeCancel und AfterCancel. Wenn Du jetzt an Dein Tabellenobjekt ein Cancel schickst
Delphi-Quelltext
dann wird zunächst der Code ausgeführt, den Du bei BeforeCancel eingetragen hast, dann wird der Cancel auf die Tabelle angewendet und anschließend das Ereignis AfterCancel ausgelöst.
Gruß
Gregor
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Do 09.12.04 23:49
| Johannes Maier hat folgendes geschrieben: | Ich mache quasi genau das Gleiche (mit deinem Code geht es), versuche allerdings mal bitte, bei BeforeCancel (wann genau tritt das eigentlich ein?) nichts hinzuschreiben, sondern erstelle mal wieder durch runterscrollen eine temporäre Zeile und markiere diese mit der Maus so, dass das Feld blau hinterlegt ist und führe dann ein einfaches Table1.Delete aus. Dann löscht er nämlich auch die vorherige Zeile
Da es mit deinem Code allerdings funktioniert, könntest du mir sagen, wann das BeforeCancel eintritt und was ich da hineinschreiben muss, damit mir das Problem nicht wieder passiert? [...] |
Tatsache  - ich weiss schon, wieso ich seit Jahren nicht mehr die BDE und die datensensitiven Komponenten von Borland benutze...
Da hilft nur ein Würgaround:
Ich benutze jetzt einmal die Tag-Eigenschaft des Datasets (wer mich kennt, weiss, dass ich normalerweise die Verwendung von Tags für unverzeihlich halte - genaugenommen gehören Tags aus der VCL entfernt, imho ) - das ging natürlich auch z.B. mit einem Feld der Fensterklasse.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Table1BeforeCancel(DataSet: TDataSet); begin if (DataSet.State = dsInsert) and (Button1.Focused = True) then begin DataSet.Tag := 1; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin if Table1.Tag = 1 then begin Table1.Tag := 0; end else begin Table1.Delete; end; end; |
Fehlerursache wird irgendwo tief in den VCL-Quellen zu suchen sein.
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Fr 10.12.04 07:51
Mal OT, aber ich muss das jetzt mal fragen: Warum gehören die Tags für Dich aus der VCL entfernt? Aber vor allem: Wenn Du sie so hast, wieso nutzt Du sie dann hier?  Dann sind sie ja wohl doch nicht so unnütz... und wenn nich Dich mal darüber aufklären darf: Selbst das .NET-Framework hat diese Tags, ist also nicht nur was das Borland verwendet 
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Fr 10.12.04 13:38
| UGrohne hat folgendes geschrieben: | | Mal OT, aber ich muss das jetzt mal fragen: Warum gehören die Tags für Dich aus der VCL entfernt? |
Warum nicht? Nein, im Ernst: Tags werden hauptsächlich für 'quick'n'dirty programming' benutzt, wenn man mal schnell was implementieren muss (siehe oben) und sind nicht selbsterklärend - sie fördern somit unsauberes Programmieren. Hätte ich direkt ein Feld in der Fensterklasse definiert, hätte ich es zumindest durch seine Benamsung ansatzweise selbsterklärend gestalten können. Merke: langweiliger Code ist guter (wartbarer) Code.
| Zitat: | Aber vor allem: Wenn Du sie so hasst, wieso nutzt Du sie dann hier?  |
Faulheit (s.o.)
| Zitat: | Dann sind sie ja wohl doch nicht so unnütz... und wenn nich Dich mal darüber aufklären darf: Selbst das .NET-Framework hat diese Tags, ist also nicht nur was das Borland verwendet  |
Danke, Du darfst mich aufklären - Du kommst nur ein paar Jahre zu spät...
Dass das .NET-Framework die verwendet, ist ja auch kein Wunder:
delphi.about.com/od/...a/conspiracydnet.htm 
|
|
Johannes Maier 
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Fr 10.12.04 15:33
@Robert: Vielen Dank, du hast mir wirklich sehr geholfen!! Da wäre ich selbst wohl kaum drauf gekommen
Aber ich glaube in deinem Code meinst du bei Button1Click doch sicher DataSet.Tag statt Table1.Tag, oder?
Noch eine kleine Frage hab ich: Oben steht zwar erklärt, wann BeforeCancel eintritt, aber in meinem Code wird doch nie Table1.Cancel aufgerufen? Wann also tritt dies noch ein?
Johannes
_________________ MfG
Johannes ehem. jbmaier
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Fr 10.12.04 16:08
| Johannes Maier hat folgendes geschrieben: | | [...]Aber ich glaube in deinem Code meinst du bei Button1Click doch sicher DataSet.Tag statt Table1.Tag, oder? |
Probier's aus - in der Ereignisprozedur Table1BeforeCancel ist DataSet = Table1, in der Prozedur Button1Click gibt es kein DataSet...
| Zitat: | | Noch eine kleine Frage hab ich: Oben steht zwar erklärt, wann BeforeCancel eintritt, aber in meinem Code wird doch nie Table1.Cancel aufgerufen? Wann also tritt dies noch ein? |
Einmal kannst Du als Benutzer (z.B. mit ESC) ein Cancel auslösen, andererseits scheint ein ButtonClick auch noch den selben Effekt zu haben.
|
|
|