Die Antwort, mein Freund, geht mit dem parameter


Der ewige Newbie Journaleintrag #2.1
Dieser Artikel erschien zuerst auf https://www.undu.com
Jeder von uns hat das Code-Wiederverwendung-Mantra gehört. Einige von uns sind ein wenig langsamer, neue Praktiken anzunehmen, wenn alte Praktiken so komfortabel wie eine alte Melodie sind. Aber die Zeiten sind sie a-changin ' und es ist höchste Zeit, eine Zehe in Wiederverwendung, Tauchen, selbst wenn es nur ein Formular wiederverwenden.
Vor kurzem hatte ich die Ursache ein modales Formular hierzu einige Bearbeitung eines Datensatzes aus einem Raster erstellen. Es machte Sinn zu machen ein modales Formular, so dass der Benutzer die Informationen auf einmal ganz sehen konnte. Kein Problem. Ich verwiesen die MainForm-Datasource. AutoEdit: = False, und alles war in Ordnung. Das modale Formular bestand aus einigen Eingabefeldern, ein Post-Button, eine Schaltfläche 'Abbrechen' und drei Ereignishandler. Neben der Post und 'Abbrechen' Handler gab ein Keypress-Ereignishandler, die gedreht tritt in Tabs. Ich schaltete auch die Titelleiste Exit-Taste. Bearbeitung wurde durch einen Button in der Leiste Aussichtspunkt auf dem Hauptformular initiiert. Das Konzept funktionierte sehr gut bei der Überwachung von Änderungen während der Sitzung in ein Verlaufsfeld.
So gut funktionierte das modale Formular, dass ich beschloss mithilfe für das Hinzufügen eines neuen Datensatzes in der Datenbank zu verdoppeln bei Verwendung des Formulars. Alles, was ich tun musste, war einigen Runtime-Änderungen, wie die Beschriftung geändert und zwickend wenigen andere Einstellungen vor der Öffnung als ein modales Formular auszuüben. Während das Feld Kunden-ID nur das modale Formular gelesen wurde, wurde es in der Form hinzufügen deaktiviert. Zumindest ich dachte, das war alles zu gab es.
Ich ist ein Problem aufgetreten, weil die betreffende Datenbank einer Detail-Datenbank, die im Zusammenhang mit einem Meister war. Kein Problem. Ich würde einfach die DataSource-Eigenschaft und die Tabelle in einen anderen Namen (d. h. Kunde, CustEdit) kopieren. Dann könnte ich die Zeiger auf die Kopie Datasource zurücksetzen. Die Bearbeitungsprozedur musste einfach beinhalten eine GotoCurrent-Funktion, um die beiden Kopien zu harmonisieren und enden mit einer Aktualisierung auf dem Original um sicherzustellen, dass alle Änderungen festgestellt wurden.
Die Edit-Funktion war einfach zu ändern:
beginnen
FrmCustomer: = TFrmCustomer.Create(nil);
mit FrmCustomer fangen
fldCustNum.readonly: = True; NEUE Stellen Sie das Schlüsselfeld ändern nicht möglich
Caption: = 'Edit Customer'; NEW machen die Beschriftung Funktion anzugeben
TblCustEd.gotoCurrent(FrmMain.TblCustomer); Die Schattentabelle neu zu harmonisieren, mit dem master
Wenn nicht (sourceCustEd.state in DsEditModes)
dann TblCustEd.edit; Eingabe-Bearbeiten-Modus zu gewährleisten
versuchen Sie ShowModal; Form zu bringen, zum verwenden und dann zu verlieren
endlich frei;
Ende;
Ende;
TblCustomer.refresh; NEUES Update der Daten anzeigen, mit der hinter die Kulissen ändert
Ende;
Dinge mit der Add funktionierte nicht, sobald ich die Schaltfläche während der Ausführung. Es produziert eine Beschwerde, die das Dataset nicht im Bearbeiten-Modus wurde. Ich habe in Haltepunkte. Ich wechselte von Append, Insert und zurück wieder zu verwenden. Das Programm gehalten am TblCustEdit.append, brechen, auch wenn ich unmittelbar vor der Hand geltend gemacht, dass die Quelle unmittelbar vor im Bearbeiten-Modus war. d. h.
beginnen
FrmCustomer: = TFrmCustomer.Create(nil);
mit FrmCustomer fangen
fldCustNum.readonly: = False;
Caption: = 'Add A Customer';
versuchen Sie TblCustEd.Append; BOMBE!!!
außer Showmessage ('Editing problematisch');
Ende;
versuchen Sie ShowModal;
endlich frei;
Ende;
Ende;
TblCustomer.refresh;
Ende;
Wenn ich gelegt und ich auf DsEditModes über die Append-Anweisung überprüft und dann mit einen Haltepunkt markiert, würde der Debugger nicht, es wird optimiert oder geändert in Lage vom Compiler ausführen. UND der Code wurde zurück an das Buttonclick-Ereignis der Schaltfläche zeigte, wenn Sie antwortenden Dialogfelder abgeschlossen habe. Ich war ein Welpe verwirrt.

Ich wurde mit dem Internet geleitet, als ich endlich sah, was das Problem war. Die Newrecord-Methode für 'tblCustomer' enthalten, vier Feld-Standardeinstellungen. Es war im Verfahren zum Beispiel als formuliert:
TblCustomer.fieldByName, ('Carrier') .asString: = 'FEDEX';
Diese wurde kopiert VERBATIM zum Feld NewRecord der kopierten Datasource. Ich sah dies stundenlang vor merken, die 'tblCustomer' und TblCustEdit waren nicht ein und dasselbe [Schafe-gegenübergestelltes Grimasse]! Zunächst war das Problem gelöst, indem einfach die Namen Diskrepanz korrigiert. Jedoch habe ich zu dem Schluss kommen, dass ich viel zu apt bin, diese Fehler wieder zu machen. also...
Das neue Konzept soll den aufrufenden Parameter im Stil 'mit' zu verwenden. D. h.
beginnen
mit Dataset kann beginnen
FieldByName('Carrier').asString: = 'FEDEX';
FieldByName('GST').asBoolean: = True;
FieldByName('PST').asBoolean: = True;
FieldByName('Approved').asBoolean: = False;
Ende;
Ende;
Ich habe beschlossen, ich werde den aufrufenden Parameter häufiger verwenden. Es möglicherweise erforderlich, einen Kommentar oder zwei werden ganz klare auf schnellen Lesen, aber ich gelobe mit Cover My Butt gegen die Dummheit, wie ich heute gegen meine Frist hier verübt haben.
Hoffe, das hilft, eine Stirn gefurcht oder zwei künftig zu vermeiden.
Weitere Informationen über sichere Codierung Ideen
von Gary Mugford - [email protected]
Die oben genannten Artikel Antworten von Ramon Prick und Andy Robinson generiert. Hier ist meine Follow-:
Dank (Ramon Prick der Niederlande) für das Konzept hinter meinem Artikel ergänzen. Es ist die Art von Dialog, der oft erhellend und hilfreich für Programmierer überhaupt sein kann, aber die Experten-Niveau. Es stimmt, dass die Idee hinter Tresor-Codierung, Störungen der Auslassung so weit wie möglich zu beseitigen. Feld Name ändern geht auf öfter als ich möchte. Ramon vorgeschlagen gonna einige Länge zu vermeiden Feldnamen von hartcodierten Namen, lieber Konstanten oder Feldebene Definitionen in Datenmodule zu erwähnen.
Noch habe ich gefunden die FBN Verweise einfach zu finden und mit einer Norm Grep-Utility ändern. Liegt auf der Hand, dass die Konstanten Anregung Anwenderfreundlichkeit Ersatz zum Kinderspiel macht. Aber diese Leichtigkeit kommt zu einem Preis, Speicherplatz. In einer Anwendung von angemessenen Komplexität könnte die Anzahl der Feldnamen beträchtliche sein. Und diese Einheit auf globale Konstanten haben jeden Wert sein und sein anwendungsweiten globale Konstanten sein so viel Wert wie Sie wünschen. Datenmodule haben die Auslastung, vorschlagen, sondern eine andere Ebene an den Programmcode hinzuzufügen. Sie sind nicht alles, was notwendig in einer korrekt geführt, wo die untergeordneten Formulare das aufrufende Formular Datasets verwenden gegebenenfalls, SDI-Schnittstelle.
Alles in allem finde ich, dass die Inzidenz der geänderten Feldnamen (als negative hinzugefügten Namen) tritt selten genug, nicht zu zahlen von den Aufwand zum auswählen. In Gruppe Programmieraufwand oder in MDI-Anwendungen ich kann leicht erkennen, den Wert in Ihren ersten Vorschlag und seiner Annahme empfehlen.
In eine andere Emailadresse angegeben Andy Robinson aus Südafrika, dass er Probleme in der Vergangenheit mit geschachtelten Verwendung von Dataset-Parametern hatte. Sein Problem war mit unendlichen Schleifen: '.. .in diese Art von Struktur es scheint, dass Sie bestimmte Anweisungen nicht vertrauen können. zB. Ich versuche dies nicht mehr...
mit dataset1 fangen
mit Datensatz2 fangen
.....
weiter;
Ende;
Ende;
Ende;
Dies ist eine andere Situation dann diejenige, die ich postuliert, die einen einzelnes Dataset-Parameter von einer automatischen Methode wie AfterInsert durchlaufen hatte. Während er nicht hatte, hat die Zeit, um das Problem zu untersuchen und es festzunageln, hat diese Art von Heads-up jetzt mir sehr sorgfältig in allen geschachtelten mit Anweisungen.
Übrigens ermöglicht Verwendung von Code-Vorlage für das häufigste Problemlösung für die Schleife von Andy bemerkt. Ich habe eine WithEOF-Vorlage, die Typen:
mit | fangen
erste;
während nicht eof fangen
...
weiter;
Ende;
Ende;
Auch, FBNS, um fieldbyName('|') zu erweitern. AsString und FBNI, um fieldByName('|') zu erweitern. AsInteger wirklich Wunder in Bezug auf Genauigkeit und Geschwindigkeit der Codeeingabe wirken. Diese Geschwindigkeit Gewinne verdienen letztlich als ein-Mann-Shop, die weitere Nutzung der Codierung Praxis, die in Ihrer Organisation nicht annähernd so gut funktionieren würde.
Gary Mugford
Idee-Mechaniker Inc
Bramalea ON Kanada









Die Antwort, mein Freund, geht mit dem parameter


Die Antwort, mein Freund, geht mit dem parameter : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Der ewige Newbie Journaleintrag #2.1
Dieser Artikel erschien zuerst auf https://www.undu.com
Jeder von uns hat das Code-Wiederverwendung-Mantra gehört. Einige von uns sind ein wenig langsamer, neue Praktiken anzunehmen, wenn alte Praktiken so komfortabel wie eine alte Melodie sind. Aber die Zeiten sind sie a-changin ' und es ist höchste Zeit, eine Zehe in Wiederverwendung, Tauchen, selbst wenn es nur ein Formular wiederverwenden.
Vor kurzem hatte ich die Ursache ein modales Formular hierzu einige Bearbeitung eines Datensatzes aus einem Raster erstellen. Es machte Sinn zu machen ein modales Formular, so dass der Benutzer die Informationen auf einmal ganz sehen konnte. Kein Problem. Ich verwiesen die MainForm-Datasource. AutoEdit: = False, und alles war in Ordnung. Das modale Formular bestand aus einigen Eingabefeldern, ein Post-Button, eine Schaltfläche 'Abbrechen' und drei Ereignishandler. Neben der Post und 'Abbrechen' Handler gab ein Keypress-Ereignishandler, die gedreht tritt in Tabs. Ich schaltete auch die Titelleiste Exit-Taste. Bearbeitung wurde durch einen Button in der Leiste Aussichtspunkt auf dem Hauptformular initiiert. Das Konzept funktionierte sehr gut bei der Überwachung von Änderungen während der Sitzung in ein Verlaufsfeld.
So gut funktionierte das modale Formular, dass ich beschloss mithilfe für das Hinzufügen eines neuen Datensatzes in der Datenbank zu verdoppeln bei Verwendung des Formulars. Alles, was ich tun musste, war einigen Runtime-Änderungen, wie die Beschriftung geändert und zwickend wenigen andere Einstellungen vor der Öffnung als ein modales Formular auszuüben. Während das Feld Kunden-ID nur das modale Formular gelesen wurde, wurde es in der Form hinzufügen deaktiviert. Zumindest ich dachte, das war alles zu gab es.
Ich ist ein Problem aufgetreten, weil die betreffende Datenbank einer Detail-Datenbank, die im Zusammenhang mit einem Meister war. Kein Problem. Ich würde einfach die DataSource-Eigenschaft und die Tabelle in einen anderen Namen (d. h. Kunde, CustEdit) kopieren. Dann könnte ich die Zeiger auf die Kopie Datasource zurücksetzen. Die Bearbeitungsprozedur musste einfach beinhalten eine GotoCurrent-Funktion, um die beiden Kopien zu harmonisieren und enden mit einer Aktualisierung auf dem Original um sicherzustellen, dass alle Änderungen festgestellt wurden.
Die Edit-Funktion war einfach zu ändern:
beginnen
FrmCustomer: = TFrmCustomer.Create(nil);
mit FrmCustomer fangen
fldCustNum.readonly: = True; NEUE Stellen Sie das Schlüsselfeld ändern nicht möglich
Caption: = 'Edit Customer'; NEW machen die Beschriftung Funktion anzugeben
TblCustEd.gotoCurrent(FrmMain.TblCustomer); Die Schattentabelle neu zu harmonisieren, mit dem master
Wenn nicht (sourceCustEd.state in DsEditModes)
dann TblCustEd.edit; Eingabe-Bearbeiten-Modus zu gewährleisten
versuchen Sie ShowModal; Form zu bringen, zum verwenden und dann zu verlieren
endlich frei;
Ende;
Ende;
TblCustomer.refresh; NEUES Update der Daten anzeigen, mit der hinter die Kulissen ändert
Ende;
Dinge mit der Add funktionierte nicht, sobald ich die Schaltfläche während der Ausführung. Es produziert eine Beschwerde, die das Dataset nicht im Bearbeiten-Modus wurde. Ich habe in Haltepunkte. Ich wechselte von Append, Insert und zurück wieder zu verwenden. Das Programm gehalten am TblCustEdit.append, brechen, auch wenn ich unmittelbar vor der Hand geltend gemacht, dass die Quelle unmittelbar vor im Bearbeiten-Modus war. d. h.
beginnen
FrmCustomer: = TFrmCustomer.Create(nil);
mit FrmCustomer fangen
fldCustNum.readonly: = False;
Caption: = 'Add A Customer';
versuchen Sie TblCustEd.Append; BOMBE!!!
außer Showmessage ('Editing problematisch');
Ende;
versuchen Sie ShowModal;
endlich frei;
Ende;
Ende;
TblCustomer.refresh;
Ende;
Wenn ich gelegt und ich auf DsEditModes über die Append-Anweisung überprüft und dann mit einen Haltepunkt markiert, würde der Debugger nicht, es wird optimiert oder geändert in Lage vom Compiler ausführen. UND der Code wurde zurück an das Buttonclick-Ereignis der Schaltfläche zeigte, wenn Sie antwortenden Dialogfelder abgeschlossen habe. Ich war ein Welpe verwirrt.

Ich wurde mit dem Internet geleitet, als ich endlich sah, was das Problem war. Die Newrecord-Methode für 'tblCustomer' enthalten, vier Feld-Standardeinstellungen. Es war im Verfahren zum Beispiel als formuliert:
TblCustomer.fieldByName, ('Carrier') .asString: = 'FEDEX';
Diese wurde kopiert VERBATIM zum Feld NewRecord der kopierten Datasource. Ich sah dies stundenlang vor merken, die 'tblCustomer' und TblCustEdit waren nicht ein und dasselbe [Schafe-gegenübergestelltes Grimasse]! Zunächst war das Problem gelöst, indem einfach die Namen Diskrepanz korrigiert. Jedoch habe ich zu dem Schluss kommen, dass ich viel zu apt bin, diese Fehler wieder zu machen. also...
Das neue Konzept soll den aufrufenden Parameter im Stil 'mit' zu verwenden. D. h.
beginnen
mit Dataset kann beginnen
FieldByName('Carrier').asString: = 'FEDEX';
FieldByName('GST').asBoolean: = True;
FieldByName('PST').asBoolean: = True;
FieldByName('Approved').asBoolean: = False;
Ende;
Ende;
Ich habe beschlossen, ich werde den aufrufenden Parameter häufiger verwenden. Es möglicherweise erforderlich, einen Kommentar oder zwei werden ganz klare auf schnellen Lesen, aber ich gelobe mit Cover My Butt gegen die Dummheit, wie ich heute gegen meine Frist hier verübt haben.
Hoffe, das hilft, eine Stirn gefurcht oder zwei künftig zu vermeiden.
Weitere Informationen über sichere Codierung Ideen
von Gary Mugford - [email protected]
Die oben genannten Artikel Antworten von Ramon Prick und Andy Robinson generiert. Hier ist meine Follow-:
Dank (Ramon Prick der Niederlande) für das Konzept hinter meinem Artikel ergänzen. Es ist die Art von Dialog, der oft erhellend und hilfreich für Programmierer überhaupt sein kann, aber die Experten-Niveau. Es stimmt, dass die Idee hinter Tresor-Codierung, Störungen der Auslassung so weit wie möglich zu beseitigen. Feld Name ändern geht auf öfter als ich möchte. Ramon vorgeschlagen gonna einige Länge zu vermeiden Feldnamen von hartcodierten Namen, lieber Konstanten oder Feldebene Definitionen in Datenmodule zu erwähnen.
Noch habe ich gefunden die FBN Verweise einfach zu finden und mit einer Norm Grep-Utility ändern. Liegt auf der Hand, dass die Konstanten Anregung Anwenderfreundlichkeit Ersatz zum Kinderspiel macht. Aber diese Leichtigkeit kommt zu einem Preis, Speicherplatz. In einer Anwendung von angemessenen Komplexität könnte die Anzahl der Feldnamen beträchtliche sein. Und diese Einheit auf globale Konstanten haben jeden Wert sein und sein anwendungsweiten globale Konstanten sein so viel Wert wie Sie wünschen. Datenmodule haben die Auslastung, vorschlagen, sondern eine andere Ebene an den Programmcode hinzuzufügen. Sie sind nicht alles, was notwendig in einer korrekt geführt, wo die untergeordneten Formulare das aufrufende Formular Datasets verwenden gegebenenfalls, SDI-Schnittstelle.
Alles in allem finde ich, dass die Inzidenz der geänderten Feldnamen (als negative hinzugefügten Namen) tritt selten genug, nicht zu zahlen von den Aufwand zum auswählen. In Gruppe Programmieraufwand oder in MDI-Anwendungen ich kann leicht erkennen, den Wert in Ihren ersten Vorschlag und seiner Annahme empfehlen.
In eine andere Emailadresse angegeben Andy Robinson aus Südafrika, dass er Probleme in der Vergangenheit mit geschachtelten Verwendung von Dataset-Parametern hatte. Sein Problem war mit unendlichen Schleifen: '.. .in diese Art von Struktur es scheint, dass Sie bestimmte Anweisungen nicht vertrauen können. zB. Ich versuche dies nicht mehr...
mit dataset1 fangen
mit Datensatz2 fangen
.....
weiter;
Ende;
Ende;
Ende;
Dies ist eine andere Situation dann diejenige, die ich postuliert, die einen einzelnes Dataset-Parameter von einer automatischen Methode wie AfterInsert durchlaufen hatte. Während er nicht hatte, hat die Zeit, um das Problem zu untersuchen und es festzunageln, hat diese Art von Heads-up jetzt mir sehr sorgfältig in allen geschachtelten mit Anweisungen.
Übrigens ermöglicht Verwendung von Code-Vorlage für das häufigste Problemlösung für die Schleife von Andy bemerkt. Ich habe eine WithEOF-Vorlage, die Typen:
mit | fangen
erste;
während nicht eof fangen
...
weiter;
Ende;
Ende;
Auch, FBNS, um fieldbyName('|') zu erweitern. AsString und FBNI, um fieldByName('|') zu erweitern. AsInteger wirklich Wunder in Bezug auf Genauigkeit und Geschwindigkeit der Codeeingabe wirken. Diese Geschwindigkeit Gewinne verdienen letztlich als ein-Mann-Shop, die weitere Nutzung der Codierung Praxis, die in Ihrer Organisation nicht annähernd so gut funktionieren würde.
Gary Mugford
Idee-Mechaniker Inc
Bramalea ON Kanada


Die Antwort, mein Freund, geht mit dem parameter

Die Antwort, mein Freund, geht mit dem parameter : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Die Antwort, mein Freund, geht mit dem parameter
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung