Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi bei keiner Änderung "nicht speichern" (https://www.delphipraxis.net/1969-bei-keiner-aenderung-nicht-speichern.html)

Hansa 1. Jan 2003 15:04


bei keiner Änderung "nicht speichern"
 
Hi,

habe hier ein Problemchen. Beim Beenden der Bearbeitung habe ich eine Box, wo drin steht :"Soll der Datensatz gespeichert werden ?".

Wenn ich einen Datensatz ändern will und z.B. die falsche Nr. erwischt habe, verlasse ich die Form und gebe die richtige Nr. ein. Da ich nichts geändert habe ist obige Box wohl überflüssig. Wo kriege ich nun ein Entscheidungsmerkmal her, ob etwas geändert wurde oder nicht ?

Gruß
Hansa

Brüggendiek 1. Jan 2003 19:01

Hallo!

Am besten ist, den "Speichern"-Button auf inaktiv (oder unsichtbar) zu setzen und bei allen Feldern, die Daten enthalten, eine OnKeypress- oder OnChange-Ereignisroutine eintragen. Diese prüft dann Modified und aktiviert ggf. den Button.

Gruß

Dietmar Brüggendiek

Hansa 1. Jan 2003 19:37

Hi,

ich habe Forms mit 3 Seiten voler Datenfeldern. Dann müßte man aber eine globale Routine haben, die alle Felder automatisch abcheckt. Würde mich mal interessieren, wie das geht. Aber es geht einfacher : Die DataSets haben eine Funktion "modified" :

Code:
procedure Form1.Button2Click(Sender: TObject);
begin
  IF NOT LiefModul.LiefDS.IsEmpty THEN BEGIN
showmessage ('LJLÖK');
    IF LiefModul.LiefDS.Modified THEN BEGIN
      if MessageDlg('Soll der Datensatz gespeichert werden ?',
        mtInformation, [mbYes, mbNo, mbCancel], 0) = mrYes then begin
        LiefModul.LiefDS.post;
        LiefModul.TransAction.Commit;
      END
      ELSE
        LiefModul.Transaction.Rollback;
    END
    ELSE
      LiefModul.Transaction.Rollback;
  END;
  LiefStamm.FormShow (Sender);
end;
Die arbeitet intern anscheinend wie die meisten Editoren. Bei einer Änderung wird ein Flag gesetzt. Was aber den Nachteil hat, beim rückgängig machen, ist der Datensatz immer noch als geändert gekennzeichnet. Erkläre mir aber mal einer wieso bei obigem Programm das ganze Programm verlassen wird ? :evil: Steht die ShowMessage (ziemlich am Anfang) im Quelltext, wird auch das FormShow am Schluß ausgeführt, dann habe ich wieder eine leere Form. Mache ich es weg, wird das Programm beendet. Wie immer :!: Da hat man doch tatsächlich viel schneller als man dachte ein Problem gelöst und die Lösung verursacht das nächste.

Gruß
Hansa

hier ist noch das FormShow (mache ich den Showmessage Kommentar weg, ja dann geht es auch :shock: ):
Code:
procedure Form1.FormShow(Sender: TObject);
begin
// showmessage ('2Ä');
  Edit1.Enabled := true;
  Edit1.Text := '';
  Edit1.SetFocus;
  Button1.Enabled := true;
  Button2.Enabled := true;
end;

DKamps 2. Jan 2003 10:15

Drei Tipps (geile Rechtschreibung)
 
1. wenn Du DataSet.Cancel ausführts sollte DataSet.Status wieder auf dsBrowse stehen, d.h. das Modified Attruibut wird gelöscht.
2. Mit ShowMessage öffnest Du ein modales Formular, d.h. eines was Du nicht verlassen kannst ohne das Formular zu beenden. Dies wirkt sich auf darunter liegende Formulare aus. Versuche doch mal statt Form.Show folgendes: Form.ShowModal, das hat den gleichen Effekt wie ShowMessage.
3. Dein Code sieht so aus, als ob der Befehl Form.Show immer aufgerufen wird, weil Deine letzte Schleife vorher endet. Ausnahme: die RunTime Library erkennt einen Fehler, dann springt sie sofort an das Ende der Prozedur.

Hansa 2. Jan 2003 12:24

Hi,

ich glaube, ich habe das etwas irreführend erklärt. So wie es oben steht, also mit Showmessage, geht alles richtig, nur steht dann die Showmessage im Weg. Mache ich diese weg, kommt der beschriebene Effekt. Die Message kam durch Zufall ins Spiel, weil ich auf die Schnelle sehen wollte, ob ein Programmteil durchlaufen wird. Und sieh an, ohne weitere Änderung war das Programm (bis auf die ShowMessage) einwandfrei. Dann macht ich sie weg, weil ja alles lief wie es sollte und wieder springt er mir aus der Form. Aus Gaudi habe ich dann mal in eine andere Prozedur Showmessage reingeschrieben, dann ging auch alles. Es sieht so aus, daß Showmessage (mit die primitivste Prozedur) automatisch einen Fehler bereinigt. :corky:

Gruß
Hansa

DKamps 2. Jan 2003 14:41

ShowMessage
 
Das würde mich aber sehr wundern!
Lass das ShowMessage mal weg und benutze beim Aufruf des Formulars ShowModal statt Show. Ich vermute dann klappt es.

Hansa 2. Jan 2003 15:02

Hi,

jetzt kommt Exception "Cannot make visible Window modal" Ich habe FormShow durch ShowModal ersetzt.

Gruß
Hansa

MrSpock 2. Jan 2003 15:43

Hallo Hansa,

hast du tatsächlich:

Delphi-Quellcode:
LiefStamm.ShowModal;
geschrieben? Poste doch bitte noch einmal die gesamte Methode.

DKamps 2. Jan 2003 17:40

ShowModal
 
ShowModal geht nur, wenn das Formular nicht bereits mit Show geöffnet ist.
Wir haben etwas ananeinander vorbei gemailt, Formx.ShowModal soll Formx.Show ersetzen und nicht die Ereignisprozedur beim Anzeigen des Formulars FormShow.

Hansa 2. Jan 2003 18:22

Re: ShowModal
 
Zitat:

Zitat von DKamps
ShowModal geht nur, wenn das Formular nicht bereits mit Show geöffnet ist.
Wir haben etwas ananeinander vorbei gemailt, Formx.ShowModal soll Formx.Show ersetzen und nicht die Ereignisprozedur beim Anzeigen des Formulars FormShow.

ursprünglicher Code :

Code:
procedure TLiefStamm.Button2Click(Sender: TObject);
begin
  IF NOT LiefModul.LiefDS.IsEmpty THEN BEGIN
    IF LiefModul.LiefDS.Modified THEN BEGIN
      if MessageDlg('Soll der Datensatz gespeichert werden ?',
        mtInformation, [mbYes, mbNo, mbCancel], 0) = mrYes then begin
        LiefModul.LiefDS.post;
        LiefModul.TransAction.Commit;
      END
      ELSE
        LiefModul.Transaction.Rollback;
    END
    ELSE
      LiefModul.Transaction.Rollback;
  END;
//  showmessage ('1Ä');
  LiefStamm.FormShow (Sender);
end;
Ergebnis : Trotz FormShow wird Programm einfach beendet, ohne Fehlermeldung :!:
Code:
      ELSE
        LiefModul.Transaction.Rollback;
    END
    ELSE
      LiefModul.Transaction.Rollback;
  END;
  showmessage ('1Ä');
  LiefStamm.FormShow (Sender);
end;
Ergebnis: Alles klappt, Unterschied : Showmessage vor FormShow nicht auskommentiert!


Code:
ELSE
        LiefModul.Transaction.Rollback;
    END
    ELSE
      LiefModul.Transaction.Rollback;
  END;
  LiefStamm.ShowModal;
end;
Ergebnis : "Cannot make a visible window modal". Anfang der Prozedur, siehe oben, jeweils gleich.

Gruß
Hansa


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