Autor Beitrag
Johannes Maier
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119

Windows2000, WindowsXP
D5 Prof
BeitragVerfasst: Do 09.12.04 18:15 
Hallo Johannes,

es gibt BeforeCancel und AfterCancel. Wenn Du jetzt an Dein Tabellenobjekt ein Cancel schickst
ausblenden Delphi-Quelltext
1:
Table1.Cancel;					

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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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 :gruebel: - 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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 :twisted:
Johannes Maier Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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.