![]() |
Sperren: Exeption wenn auf letztem Datensatz
Hallo,
meine Datenbank öffnet schreibgeschützt, also nichts ist editierbar. Nun habe ich eine Routine eingebaut, die den Schreibschutz aufhebt, damit sich ZB DBEdits editieren lassen:
Delphi-Quellcode:
Das funzt soweit auch ganz gut, es sei denn, ich stehe gerade auf dem letzten Datensatz. Wenn ich dann sperren oder entsperren will bekomme ich ein Exeption mit der Fehlermeldung:
procedure TForm1.CheckBox1Click(Sender: TObject);
var pos: TBookmark; // Lesezeichen begin pos:= Query1.GetBookmark; // Position merken Query1.Active:= false; if CheckBox1.Checked= true then Query1.RequestLive := false //sperren else Query1.RequestLive := true; // Sperre aufheben Query1.Active:= true; Query1.GotoBookmark(pos); // Position wiederherstellen end; Gitternetz außerhalb des zulässigen Bereichs. Wie kommt denn das und wie kann man dem abhelfen? Gruß Gambit |
Hi,
ich glaube nicht das Bookmarks überhaupt ein schließen der Tabelle überleben. Wenn deine Tabelle einen Primärindex auf einem Feld hat, dann merke dir doch einfach den Primärkey und nach dem öffnen machst du einfach ein Query.Locate ... Wenn locate keine übereinstimmmung findet, geht es einfach zum nächsten Datensatz. Gruß Neo |
ist das etwa eine CD?
|
Also anfangs hatte ich das Ganze mit ner TTable gemacht, da klappte das mit den Bookmarks. Obs mit der Query noch klappt probier ich morgen. Aber die Exeption kam auch bei der TTable schon. Möcht bloß wissen wieso?
Gambit P.S was meinst du denn mit CD? |
Achso, ohne Bookmarks kam die Exeption auch...
Gambit |
Hi,
wie lautet die Exception ? Wenn du eine Query über mehrere Tabellen machst, kann man diese nicht editieren und dann führt RequestLive zu einer Exeption. Und noch was, Bookmarks müssen mit Free wieder freigegeben werden, sonst hast du ein Speicherleck ! Poste doch mal die Komplette Funktion ohne Bookmark ... Gruß Neo |
Moin!
Was meinst du denn mit schick mal die ganze Funktion? Das ist doch die ganze Methode. Also ich glaube auch, RequestLive hat da unmittelbar gar nichts mit zu tun, es passiert ja auch, wenn ich Table1.ReadOnly:=False bei einer Table statt einer Query benutze. Die Exeption ist eine der Klasse EInvalidGridOperation die Fehlermeldung hatte ich ja schon gepostet. Und, es ist nur eine Tabelle. Könntest du mir denn etwas genauer erklären, wie ich mir ich mir den Primärindex merken kann, dann probier ich das mal? Gruß Gambit |
Jetzt raff ich gar nix mehr...mach die DBGrid von der Breite her kleiner, klappt alles ohne Probs. Mach ich sie breiter kommt die Exeption.
Das soll mal wer schnallen... Gambit |
Hallo,
mach das Grid unsichtbar (visible=false), dann schließ die Tabelle und öffne sie erneut, dann Grid wieder einschalten. Scheinbar stimmt die Anzahl der Spalten nicht mehr nach dem erneuten öffnen. Alternativ vorher noch Grid.Dataset :=nil und anschließend neu zuweisen. sag mal Bescheid ob das hilft... Gruß Neo |
Wie meinst du das jetzt genau? In die oben genannte Routine einbauen?
Ich bin im Moment völlig confused... Gambit P.S Vielleicht könntest du das in die Routine oben mal reinschreiben? :oops: |
Hallo,
och mann..... :lol:
Code:
so, das ganze ist aber ungetestet, F1 ist aber dein Freind ;-)
procedure TForm1.CheckBox1Click(Sender: TObject);
var //pos: TBookmark; // Lesezeichen id : Integer; begin //pos:= Query1.GetBookmark; // Position merken id :=Query1Feld1.AsInteger; // wenn du z.B. ein Feld mit einem Qunique-ID Index hast Query1.Active:= false; Grid.Visible :=False; Application.ProcessMessages; Grid1.Datasource :=nil; Application.ProcessMessages; try if CheckBox1.Checked= true then Query1.RequestLive := false //sperren else Query1.RequestLive := true; // Sperre aufheben Query1.Active:= true; finally //Query1.GotoBookmark(pos); // Position wiederherstellen Grid1.Datasource :=Query1DS; // oder wi auch immer das Dataset heißt ;-) Grid1.Visible :=True; try query1.locate ('FELD1',Variant(id),[]); // Position wiederherstellen except // hier Fehlermeldung end; end; end; Gruß Neo, der jetzt essen geht :wink: , mist dafür gibt es keinen Smiley ! |
Ich hab mal ne ganz neue Form basierend auf der Tabelle gemacht und der Fehler ist weg. Wer weiß warum...
@Neo: Vielen Dank für deine Mühe. Könntest du mir noch sagen, wie und wo genau ich die Free Methode anwenden muss? Gruß Gambit |
Hallo,
hier mal ein Codeschnipsel von mir ...
Code:
Noch ein le. Tip, du solltest dich unbedingt mit Schutzblöcken
procedure TMakeEKReForm.PosTabAfterDelete(DataSet: TDataSet);
var bm : tBookmark; p : Integer; begin PosTab.DisableControls; BM :=PosTab.GetBookmark; try p :=0; postab.first; while not postab.eof do begin inc(p); postab.edit; try postabposition.asinteger :=p; postab.post; except // Hier Fehlermeldung end; postab.next; end; PosTab.GotoBookmark (BM); finally PosTab.FreeBookmark (BM); end; PosTab.EnableControls; end; - try finally end - try except end mal auseinandersetzen, so was ist sehr wichtig, wenn man guten Code schreiben will. Gruß Neo |
also Try except ist mir aus Java, was wir in der Schule, lernen gut bekannt. Was Try Finally angeht, das kenn ich noch nicht, werde aber deinen Rat befolgen und mich damit beschäftigen.
Und wahrscheinlich muss man alle Komponenten vom Typ Pointer wieder freigeben? Also wie in C++? Oder schmeiß ich da nu wieder was durcheinander? Gruß Gambit |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz