AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Bookmarks werden bei Änderungen ungültig
Thema durchsuchen
Ansicht
Themen-Optionen

Bookmarks werden bei Änderungen ungültig

Ein Thema von Coder90 · begonnen am 15. Dez 2007 · letzter Beitrag vom 16. Dez 2007
Antwort Antwort
Benutzerbild von Coder90
Coder90

Registriert seit: 8. Nov 2004
Ort: Ebhausen, BW
44 Beiträge
 
Delphi 2007 Architect
 
#1

Bookmarks werden bei Änderungen ungültig

  Alt 15. Dez 2007, 19:17
Datenbank: XML • Zugriff über: TXMLTransform
Hi
Ich arbeite mit XML-Dateien welche ich über TXMLTransform und TClientDataSet in einem VirtualTreeView darstelle.
Die Darstellung funktioniert ohne Probleme.
Aber sobald ich Daten in der XML-Datenbank ändere kommt es zu Zugriffsverletzungen da TBookmarks ungültig werden.

Ich hab ein Testprojekt erstellt um den Fehler leichter zu finden.
Hier der Quelltext:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, VirtualTrees, DB, DBClient, xmldom, Provider, Xmlxform,
  Grids, DBGrids;

type

  PNodeData = ^TNodeData;
  TNodeData = record
    FBookmark: TBookmark;
  end;

  TForm1 = class(TForm)
    VST: TVirtualStringTree;
    btnLoad: TButton;
    ClientDataSet: TClientDataSet;
    XMLTransformProvider: TXMLTransformProvider;
    DataSource: TDataSource;
    DBGrid1: TDBGrid;
    btnAdd: TButton;
    procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
    procedure btnLoadClick(Sender: TObject);
    procedure VSTNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; NewText: WideString);
    procedure btnAddClick(Sender: TObject);
    procedure VSTGetNodeDataSize(Sender: TBaseVirtualTree;
      var NodeDataSize: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnAddClick(Sender: TObject);
var
  Node: PVirtualNode;
  NodeData: PNodeData;
begin
  ClientDataSet.Append;
  ClientDataSet.FieldValues['test'] := '123';
  ClientDataSet.Post;

  Node := VST.AddChild(nil);
  NodeData := VST.GetNodeData(Node);
  NodeData^.FBookmark := ClientDataSet.GetBookmark;
end;

procedure TForm1.btnLoadClick(Sender: TObject);
var
  Node: PVirtualNode;
  NodeData: PNodeData;
begin
  XMLTransformProvider.XMLDataFile := 'test.xml';
  ClientDataSet.XMLData := XMLTransformProvider.TransformRead.Data;
  ClientDataSet.DisableControls;
  try
    ClientDataSet.First; //Auf ersten Datensatz positionieren, EOF wird dadurch auf False gesetzt
    while not ClientDataSet.Eof do // Schleife durchlaufen, bis EOF True ist.
    begin
      Node := VST.AddChild(nil);
      NodeData := VST.GetNodeData(Node);
      NodeData^.FBookmark := ClientDataSet.GetBookmark;
      ClientDataSet.Next; //EOF ist True, wenn Next scheitert, da dann der letzte Datensatz erreicht wurde
    end;
  finally
    ClientDataSet.EnableControls;
  end;
end;

procedure TForm1.VSTGetNodeDataSize(Sender: TBaseVirtualTree;
  var NodeDataSize: Integer);
begin
  NodeDataSize := SizeOf(PNodeData);
end;

procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
begin
  ClientDataSet.GotoBookmark(TBookmark(PNodeData(Sender.GetNodeData(Node)).FBookmark));
  CellText := ClientDataSet.FieldByName('test').asString;
end;

procedure TForm1.VSTNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; NewText: WideString);
var
  NodeData: PNodeData;
begin
  ClientDataSet.GotoBookmark(TBookmark(PNodeData(Sender.GetNodeData(Node)).FBookmark));
  ClientDataSet.Edit;
  ClientDataSet.FieldValues['test'] := NewText;
  ClientDataSet.Post;
  //NodeData := VST.GetNodeData(Node);
  //NodeData^.FBookmark := ClientDataSet.GetBookmark;
  ClientDataSet.GotoBookmark(TBookmark(PNodeData(Sender.GetNodeData(Node)).FBookmark));
end;

end.
Die XML-Datei wird mit klick auf "Load" geladen.
Mit "Add" werden Datensätze hinzugefügt.
Klickt man nun zweimal auf einen Knoten und ändert dessen Beschriftung kommt es zur Zugriffsverletzung:
Zitat:
Im Projekt Project1.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'ClientDataSet: Datensatz nicht gefunden' aufgetreten.
Dies passiert jedoch nur bei neu hinzugefügten Knoten und auch nicht dem zuletzt hinzugefügtem Knoten.

Entkommentiert man Zeile 104 und 105 passiert dieser Fehler nicht mehr und alles funktioniert.
Dort wird nach dem Bearbeiten das TBookmark des Datensatzes erneut dem Knoten zugewiesen.

Nun bin ich mir nicht sicher ob das eine saubere Lösung ist, nach jedem Bearbeiten den TBookmark neu zuzuweißen.
Vielleicht ist der Fehler ja auch woanders?

Hab das Projekt angehängt.
Angehängte Dateien
Dateityp: zip vstxmldb_972.zip (10,7 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Bookmarks werden bei Änderungen ungültig

  Alt 15. Dez 2007, 19:18
Zitat von Coder90:
Hab das Projekt angehängt.
Hast Du nicht
  Mit Zitat antworten Zitat
Benutzerbild von Coder90
Coder90

Registriert seit: 8. Nov 2004
Ort: Ebhausen, BW
44 Beiträge
 
Delphi 2007 Architect
 
#3

Re: Bookmarks werden bei Änderungen ungültig

  Alt 15. Dez 2007, 19:21
Zitat von Die Muhkuh:
Zitat von Coder90:
Hab das Projekt angehängt.
Hast Du nicht
Doch ;P *bäh*
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Bookmarks werden bei Änderungen ungültig

  Alt 16. Dez 2007, 08:51
Soweit ich weiss, *werden* Bookmarks ungültig, wenn man Daten des 'gebookmarkten' Records ändert.
Abhilfe: Merke Dir die Datensatznummer oder den Primary Key.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Coder90
Coder90

Registriert seit: 8. Nov 2004
Ort: Ebhausen, BW
44 Beiträge
 
Delphi 2007 Architect
 
#5

Re: Bookmarks werden bei Änderungen ungültig

  Alt 16. Dez 2007, 14:20
ich machs jetzt mit findkey.
das klappt besser.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 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