OBS/Makros und Scripting/Anwendungsbereiche/Customize Edits: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(22 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 5: Zeile 5:
{| class="wikitable"
{| class="wikitable"
|-
|-
!Interne Funktionen !! Tastatur-Funktionen
!Interne Funktionen  
|-
|-
|OnEdFormInit || OnF1
|OnEdFormInit  
|-
|-
|OnEdInit || OnF2
|OnEdInit  
|-
|-
|OnEdVorb || OnF3
|OnEdVorb  
|-
|-
|OnEdShow || OnF4
|OnEdShow  
|-
|-
|OnEdStable || OnF5
|OnEdStable  
|-
|-
|OnEdReadDirect || OnF6
|OnEdReadDirect  
|-
|-
|OnEdRead || OnF7
|OnEdRead  
|-
|-
|OnEdStable || OnF8
|OnEdStable  
|-
|-
|OnEdCheck || OnF9
|OnEdCheck  
|-
|-
|OnEdqSQL || OnF10
|OnEdqSQL  
|-
|-
|OnEdSaveDirect || OnF11
|OnEdSaveDirect  
|-
|-
|OnEdSave || OnF12
|OnEdSave  
|-
|-
|CheckIfChanged || OnPGDN
|OnEdSaveUid(cUID: String)
|-
|-
|OnEdClose || OnPGUP
|CheckIfChanged
|-
|-
| || OnReturn
|OnEdClose
|}
{| class="wikitable"
|-
! Tastatur-Funktionen
|-
| OnF1
|-
| OnF2
|-
| OnF3
|-
| OnF4
|-
| OnF5
|-
| OnF6
|-
| OnF7
|-
| OnF8
|-
| OnF9
|-
| OnF10
|-
| OnF11
|-
| OnF12
|-
|-
| || OnESC
| OnPGDN
|-
| OnPGUP
|-
| OnReturn
|-
| OnESC
|}
|}
Die hier aufgeführten '''internen Funktionen''' sind in der Reihenfolge aufgelistet, wie sie vom OBS beim Öffnen (OnEdFormInit bis OnEdStable) und Schließen (OnEdCheck bis OnEdClose) von Eingabemasken auch abgearbeitet werden.
Die hier aufgeführten '''internen Funktionen''' sind in der Reihenfolge aufgelistet, wie sie vom OBS beim Öffnen (OnEdFormInit bis OnEdStable) und Schließen (OnEdCheck bis OnEdClose) von Eingabemasken auch abgearbeitet werden.  
{{Hinweis|Bei der Verwendung der Funktionen in Customize-Scripten ist die Reihenfolge der Abarbeitung der Masken-Funktion und der Customize-Funktion von Bedeutung. Grundsätzlich gilt: Interne Funktionen werden vor dem Customize ausgeführt und Tastatur-Funktionen nach der Customize-Funktion. Um ein Customize vor der internen Funktion auszuführen, muss dem Funktionsnamen der Präfix '''Before_''' gegeben werden. Für Tastatur-Funktionen gilt dies nur für '''OnESC'''.}}
{{Hinweis|Bei der Verwendung der Funktionen in Customize-Scripten ist die Reihenfolge der Abarbeitung der Masken-Funktion und der Customize-Funktion von Bedeutung. Grundsätzlich gilt: Interne Funktionen werden vor dem Customize ausgeführt und Tastatur-Funktionen nach der Customize-Funktion. Um ein Customize vor der internen Funktion auszuführen, muss dem Funktionsnamen der Präfix '''Before_''' gegeben werden. Für Tastatur-Funktionen gilt dies nur für '''OnESC'''.}}
{{Achtung|Für eine erweiterte Prüfung der Maskeneingabe und einen Abbruch des Speicherns bei bestimmten Bedingungen bitte die Before-Methode '''Before_OnEdCheck statt OnEdCheck''' verwenden! Da in einigen Eingabemaske im EdCheck zusätzliche Funktionalitäten enthalten sind, die bei "gleichzeitiger" Ausführung (z. B. zwei Sachbearbeiter legen einen Auftrag an) zu Problemen führen können, haben Sie so die Möglichkeit auch diese Funktionlitäten zu blockieren.}}
==Zugriff auf Komponenten==
==Zugriff auf Komponenten==
Um auf Komponenten der Maske zuzugreifen, sollten Sie die Funktionen '''xGet''' (Daten lesen) und '''xSet''' (Daten schreiben) verwenden.
Um auf Komponenten der Maske zuzugreifen, sollten Sie die Funktionen '''xGet''' (Daten lesen) und '''xSet''' (Daten schreiben) verwenden.
Zeile 51: Zeile 87:


==Globale Variablen der Eingabemaske==
==Globale Variablen der Eingabemaske==
Über die Variable FrmEdit kann auf alle Felder und auf die Property des Edit Objekt zugegriffen werden. Folgende Property's stehen zu Verfügung:
Über die Variable FrmEdit kann auf alle Felder und auf die Property des Edit Objekt zugegriffen werden. Folgende Property's stehen zu Verfügung:  
 
{| class="wikitable"
{| class="wikitable"
|-
|-
Zeile 74: Zeile 111:
|lInsert || Edit Felder im Insert/Überschreibemodus (zur zeit keine Funktion)
|lInsert || Edit Felder im Insert/Überschreibemodus (zur zeit keine Funktion)
|}
|}
==Beispiele Eingabemaske==
==Beispiele Eingabemaske==
===Button F12 anzeigen und mit Funktionalität versehen===
===Button F12 anzeigen und mit Funktionalität versehen===
Zeile 116: Zeile 154:


===Eingaben prüfen===
===Eingaben prüfen===
{{Hinweis|Beim Prüfen der Eingabe und einem bedingten Abbruch des Speichervorgangs sollte immer die Funktion '''Before_OnEdCheck''' verwendet werden. In einigen Masken stecken bestimmte Funtionalitäten im Check, welche bei mehrfacher Ausführung zu Probleme führen können. Dies betrifft z. B. die Generierung und Prüfung der Vorgangsnummer in den Vorgangsmasken (Auftrag, Lieferschein, Rechnung usw.).}}
<syntaxhighlight lang="Delphi">
<syntaxhighlight lang="Delphi">
function OnEdCheck():string;
function Before_OnEdCheck():string;
var oSte    : TEdit;
var oSte    : TEdit;
     cEdit    : String;
     cEdit    : String;
Zeile 192: Zeile 231:
===Beispielscript===
===Beispielscript===
<syntaxhighlight lang="Delphi">
<syntaxhighlight lang="Delphi">
//------------------------------------------------------------------------------------
// Reiter Demo
//------------------------------------------------------------------------------------
type dummy = class   
    class procedure CBLMail_Enter(Sender: TObject);
    class procedure OnAngebotsNrChange(Sender: TObject);
end;
var oCBL : TCombiListe;
//------------------------------------------------------------------------------------
function OnEdInit(): String;
function OnEdInit(): String;
var oTab : TTabSheet;
var oTab : TTabSheet;
     oStr : TStringEdit;     
     oStr : TStringEdit;
     oMed : TMaskEdit; 
     oLbl : TLabel;   
     oLbl : TLabel;   
     oNEd : TNumericEdit;     
     oNEd : TNumericEdit;     
     oDVE : TDateValEdit;   
     oDVE : TDateValEdit;   
     oChB : TxCheckBox;  
     oChB : TxCheckBox;      
     oCBL : TCombiListe;    
     oTRE : TTextRichEdit;                                
     oTRE : TTextRichEdit;
     oCBLAng : TCombiListe;
begin
begin
     oTab := frmEdit.AddUserTab();              // Erstellt neuen User-Tab auf dem Edit
     oTab := frmEdit.AddUserTab();              // Erstellt neuen User-Tab auf dem Edit
Zeile 206: Zeile 259:
      
      
         oLbl        := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
         oLbl        := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
         oLbl.Caption := 'Textzeile:';   
         oLbl.Caption := 'Fahrstuhl vorhanden:';   
         oLbl.Top    := 10;         
         oLbl.Top    := 10;         
         oLbl.Left    := 10;
         oLbl.Left    := 10;
        oLbl.Parent  := oTab;                  // Damit die Anzeige korrekt funktioniert   
       
        oChB        := TxCheckbox.Create(frmEdit);
        oChB.Name    := 'cb_db_user_a_fahrstuhl';
        oChB.Caption := 'ja';
        oChB.TOP    := 10;
        oChB.Left    := 150;
        oChB.Parent  := oTab;       
       
        oLbl        := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'Geschoss:'; 
        oLbl.Top    := 40;       
        oLbl.Left    := 10;     
         oLbl.Parent  := oTab;                  // Damit die Anzeige korrekt funktioniert
         oLbl.Parent  := oTab;                  // Damit die Anzeige korrekt funktioniert
          
          
         oStr        := TStringEdit.Create(frmEdit);
         oStr        := TStringEdit.Create(frmEdit);
         oStr.Name    := 'stred_db_user_bemerk'; // Damit automatisches Speichern/Laden von Datenbankfeldern funktioniert, muss im Komponentennamen '_db_' und der Feldname stehen.
         oStr.Name    := 'stred_db_user_a_geschoss';
         oStr.Top    := 10;      
         oStr.Top    := 40;
         oStr.Left    := 130;
         oStr.Left    := 150;    
         oStr.Parent  := oTab;
         oStr.Width   := 20;
 
         oStr.Parent  := oTab;    
        //------------------------------------------------------------------
 
        oLbl        := TLabel.Create(frmEdit);
        oLbl.Caption := 'Summe:';    
        oLbl.Top    := 40;      
         oLbl.Left    := 10;
        oLbl.Parent  := oTab;
          
          
         oNEd         := TNumericEdit.Create(frmEdit);
         oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oNEd.Name    := 'numed_db_user_betrag';
         oLbl.Caption := 'geplante Fahrzeit:';   
        oNEd.Top    := 40;       
        oNEd.Left    := 130;
        oNEd.Parent  := oTab;
 
        //------------------------------------------------------------------
   
        oLbl        := TLabel.Create(frmEdit);
         oLbl.Caption := 'Datum:';   
         oLbl.Top    := 70;         
         oLbl.Top    := 70;         
         oLbl.Left    := 10;
         oLbl.Left    := 10;
         oLbl.Parent  := oTab;
         oLbl.Parent  := oTab;                  // Damit die Anzeige korrekt funktioniert
       
        oMed        := TMaskEdit.Create(frmEdit);
        oMed.Name    := 'stred_db_user_a_fahrzeit';
        oMed.Caption := 'Std.';
        oMed.Top    := 70;
        oMed.Left    := 150;   
        oMed.Width  := 40;                   
        oMed.EditMask:= '00:00';             
        oMed.Text    := '00:00';
        oMed.Parent  := oTab;
          
          
         oDVE         := TDateValEdit.Create(frmEdit);
         oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oDVE.Name    := 'datev_db_user_datum';
         oLbl.Caption := 'geplante Montagezeit:';   
        oDVE.Top    := 70;       
        oDVE.Left    := 130;
        oDVE.Parent  := oTab;
 
        //------------------------------------------------------------------
   
        oLbl        := TLabel.Create(frmEdit);
         oLbl.Caption := 'Schalter:';   
         oLbl.Top    := 100;         
         oLbl.Top    := 100;         
        oLbl.Left    := 10;   
        oLbl.Parent  := oTab;                  // Damit die Anzeige korrekt funktioniert
       
        oMed        := TMaskEdit.Create(frmEdit);
        oMed.Name    := 'stred_db_user_a_montagezeit';
        oMed.Caption := 'Std.';
        oMed.Top    := 100;
        oMed.Left    := 150;
        oMed.Width  := 40;
        oMed.EditMask:= '00:00';
        oMed.Text    := '00:00';
        oMed.Parent  := oTab;
       
        oLbl        := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'Anzahl Monteure:'; 
        oLbl.Top    := 130;       
         oLbl.Left    := 10;
         oLbl.Left    := 10;
         oLbl.Parent  := oTab;
         oLbl.Parent  := oTab;                  // Damit die Anzeige korrekt funktioniert
   
        oStr        := TStringEdit.Create(frmEdit);
        oStr.Name    := 'stred_db_user_a_anzahl_monteure';
        oStr.Top    := 130;
        oStr.Left    := 150;
        oStr.Width  := 20;
        oStr.Parent  := oTab;
          
          
         oChB         := TxCheckBox.Create(frmEdit);
         oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
         oChB.Name    := 'cb_db_user_toggle';   
         oLbl.Caption := 'Wiedervorlage:';   
         oChB.Caption := 'Schalter';
         oLbl.Top    := 160;         
        oChB.Top    := 100;         
         oLbl.Left    := 10;
         oChB.Left    := 130;
         oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert
         oChB.Parent  := oTab;
 
        //------------------------------------------------------------------     
      
      
         oLbl        := TLabel.Create(frmEdit);  
        oChB        := TxCheckbox.Create(frmEdit);
         oLbl.Caption := 'Suchliste:';   
        oChB.Name    := 'cb_db_user_a_wiedervorlage';
         oLbl.Top    := 130;         
        oChB.Caption := 'ja';
        oChB.TOP    := 160;
        oChB.Left    := 150;
        oChB.Parent  := oTab;
       
         oLbl        := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
         oLbl.Caption := 'EMail für AB:';   
         oLbl.Top    := 190;       
        oLbl.Left    := 10;
        oLbl.Parent  := oTab;                  // Damit die Anzeige korrekt funktioniert
       
        oCBL        := FrmEdit.AddCombiliste();
        oCBL.Name    := 'cbl_db_user_a_email';
        oCBL.Top    := 190;
        oCBL.Left    := 130;
        oCBL.Width  := 200;
        oCBL.Parent  := oTab;                 
        oCBL.TextModus := true; 
        InitCBLMail();         
        oCBL.OnEnter := dummy.CBLMail_Enter; 
       
        oLbl        := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'Sonstige Bemerkungen:'; 
        oLbl.Top    := 220;         
         oLbl.Left    := 10;
         oLbl.Left    := 10;
         oLbl.Parent  := oTab;
         oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert
           
        oCBL        := FrmEdit.AddCombiliste(); 
        oCBL.Name    := 'cbl_db_user_wgr';   
        oCBL.Top    := 130;               
        oCBL.Left    := 130;           
        oCBL.Parent  := oTab;   
                                     
        oCBL.GetSuli.Tablename        := 'WARENGR';          // Verknüpfte Tabelle 
        oCBL.GetSuli.CompareField      := 'wg_nr';            // Feld mit eindeutiger ID zur Zuordnung
        oCBL.GetSuli.ShowField        := 'wg_name';          // Feld, das als Bezeichnung in der Kombiliste angezeigt wird
        oCBL.GetSuli.Caption          := ML('Warengruppe');  // Fenstertitel der Suchliste, die sich beim Klick auf # öffnet
        oCBL.GetSuli.SQLOrder          := 'wg_nr';            // Feld, nach dem die Suchliste sortiert werden soll
        oCBL.GetSuli.SQlWhere          := '';                // Filter für Daten in der Suchliste, z. bsp. 'az_nr like "5%"'
 
        oCBL.GetSuli.Width            := 500;                // Weite des Suchlistenfensters
        oCBL.GetSuli.Height            := 400;                // Höhe des Suchlistenfensters
             
        oCBL.GetSuli.InitColumn('Nr',  'wg_nr',  30, nil, '', System.Classes.TAlignment.taLeftJustify);
        oCBL.GetSuli.AddColumn('Name', 'wg_name', 30, nil, '', System.Classes.TAlignment.taLeftJustify);
 
        // Die erste Spalte der Suchliste muss mit InitColumn erstellt werden, alle weiteren mit AddColumn.
        // Parameter:
 
        // Anzeigename        : String,
        // Feldname          : String,
        // relative_Breite    : Integer,
        // Anzeigefunktion    : Function of String, vorerst immer nil,
        // Anzeigenmaskierung : String = '', Beispiel: '##9,99': Es werden immer eine Vorkommastelle und immer zwei Nachkommastellen angezeigt, und optional zwei zusätzliche Vorkommastellen, wenn vorhanden.
        // Ausrichtung        : System.Classes.TAlignment.[taLeftJustify, taRightJustify, taCenter]
 
        //------------------------------------------------------------------
          
          
         oTRE        := TTextRichEdit.Create(frmEdit);
         oTRE        := TTextRichEdit.Create(frmEdit);
         oTRE.Name    := 'riced_db_user_langtext';
         oTRE.Name    := 'riced_db_user_a_memo';
         oTRE.Top    := 170;
         oTRE.Top    := 240;
         oTRE.Left    := 10;
         oTRE.Left    := 10;
         oTRE.Height  := 300;
         oTRE.Height  := 200;
         oTRE.Width  := 400;   
         oTRE.Width  := 600;   
         oTRE.RulerH  := false;  
         oTRE.RulerH  := false;  
         oTRE.Parent  := oTab;      
         oTRE.Parent  := oTab;                
       
        oCBLAng := TCombiListe(FrmEdit.Findcomponent('cbl_db_a_angnr'));
        if (assigned(oCBLAng)) then begin
          oCBLAng.OnExit := dummy.OnAngebotsNrChange;
        end;


         //------------------------------------------------------------------
         //------------------------------------------------------------------


     end;     
     end;     
end;
//------------------------------------------------------------------------------------
procedure InitCBLMail();
begin
    oCBL.GetSuLi.Tablename    := 'ANSP';
    oCBL.GetSuLi.CompareField := 'AP_EMAIL';
    oCBL.GetSuLi.Caption      := ML('EMail-Adresse');
    oCBL.GetSuli.SQLOrder    := 'ap_name';
    oCBL.GetSuli.SQLWhere    := 'ap_email>"" and ap_pnr='+DB_SQLVal(FrmEdit.xGet('a_knr'));
    //oCBL.GetSuli.SQLWhere    := 'ap_email>"" and ap_pnr='+DB_SQLVal('1200005');
    oCBL.GetSuli.Width        := 600;
    oCBL.GetSuli.Height      := 300;
    oCBL.GetSuli.InitColumn('Vorname', 'ap_vorname', 15,nil,'',System.Classes.Talignment.taLeftJustify);
    oCBL.GetSuli.AddColumn ('Name', 'ap_name', 20,nil,'',System.Classes.Talignment.taLeftJustify);
    oCBL.GetSuli.AddColumn ('EMail', 'ap_email', 40,nil,'',System.Classes.Talignment.taLeftJustify);               
end;
//------------------------------------------------------------------------------------
class procedure dummy.CBLMail_Enter(Sender: TObject);
begin
    InitCBLMail();
end;
//------------------------------------------------------------------------------------
class procedure dummy.OnAngebotsNrChange(Sender: TObject);
var cAngebot : String;
    cBuffer  : String;         
    cWhere  : String;
begin
    cAngebot := FrmEdit.xGet('a_angnr');
    cWhere  := 'a_nr='+DB_SQLVal(cAngebot);
    cBuffer  := DB_ReadSQLValue(oDB,'auftrag','a_angnr',cWhere);   
   
    Debugline (cBuffer);                   
    if (cAngebot <> cBuffer) and FrmEdit.lEditMode then begin           
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_fahrstuhl',cWhere);         
            FrmEdit.xSet('user_a_fahrstuhl',cBuffer);
                   
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_geschoss',cWhere);         
            FrmEdit.xSet('user_a_geschoss',cBuffer);
                   
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_fahrzeit',cWhere);         
            FrmEdit.xSet('user_a_fahrzeit',cBuffer);
                   
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_montagezeit',cWhere);         
            FrmEdit.xSet('user_a_montagezeit',cBuffer);
                   
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_anzahl_monteure',cWhere);         
            FrmEdit.xSet('user_a_anzahl_monteure',cBuffer);
       
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_email',cWhere);         
            FrmEdit.xSet('user_a_email',cBuffer);
           
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_wiedervorlage',cWhere);         
            FrmEdit.xSet('user_a_wiedervorlage',cBuffer);
                   
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_memo',cWhere);         
            FrmEdit.xSet('user_a_memo',cBuffer);
       
    end;
end;
//----------------------------------------------------------------
{function OnEdRead():String
begin
    if (FrmEdit.xGet('user_a_wiedervorlage')='1') then begin
        Meldung(frmEdit.xGet('user_a_memo'));
    end;
end;}
//----------------------------------------------------------------
</syntaxhighlight>
==Beispiel: Rechnung per Mail/Fax==
<syntaxhighlight lang="Delphi">
function OnEdSave():string;
begin
end; 
function OnEdInit():string;
var oAutoMail        : TxCheckBox;
    oFaxEMailDrucken  : TxCheckBox;
    oOldDate          : TxCheckBox;
begin
  oAutoMail        := NIL;
  oFaxEMailDrucken  := NIL;
  oOldDate          := NIL;
  if (Assigned(FrmEdit)) then begin
      oAutoMail        := TxCheckBox(FrmEdit.FindComponent('cb_automail'));
      oFaxEMailDrucken := TxCheckBox(FrmEdit.FindComponent('cb_FaxEMailDrucken'));
      oOldDate        := TxCheckBox(FrmEdit.FindComponent('cb_OldDate'));
  end;
   
  if (Assigned(oAutoMail)) then begin
      oAutoMail.checked := True;
      Meldung('oAutoMail'); 
  end;
 
  if (Assigned(oFaxEMailDrucken)) then begin
      oFaxEMailDrucken.checked := True; 
      Meldung('oFaxEMailDrucken'); 
  end;
 
  if (Assigned(oOldDate)) then begin
      oOldDate.checked := True; 
      Meldung('oOldDate'); 
  end;
 
end;
</syntaxhighlight>
==Beispiel: OnExit Funktion beim Verlassen des An-Feldes der E-Mail Maske löst AutoReplace in Richtext aus==
<syntaxhighlight lang="Delphi">
type
    TEventHandler = class
        procedure onMyExit(Sender: TObject);
    end;
   
var OnExit      : TNotifyEvent;
    oEventHandler: TEventHandler;
procedure TEventHandler.onMyExit(Sender: TObject);
var oRich: TTextRichEdit;
begin
    if Assigned(OnExit) then begin
        OnExit(Sender);
        Debugline('TEST');
        oRich := TTextRichEdit(frmEdit.FindComponent('riced_e_memofeld'));
        if (Assigned(oRich)) then begin
            oRich.RichAutoReplace(True, False);
        end;
    end;
end;
function XOnCreate():string;
var oAn: TStringEdit;
begin
    OnExit := Nil;
    oAn := TStringEdit(frmEdit.FindComponent('stred_db_e_an'));
    Debugline('TEST1');
    if (Assigned(oAn)) then begin
        oEventHandler := TEventHandler.Create();
       
        OnExit := oAn.OnExit;
        oAn.OnExit := oEventHandler.onMyExit;
        Debugline('TEST2');
    end;     
end;
end;
</syntaxhighlight>
</syntaxhighlight>
==Besonderheiten==
{{Hinweis|Sämtliche Tastatur-Funktionen haben noch eine Variante mit dem Präfix '''Before_'''.}}
{{Achtung|Wird bei den '''Before_'''-Funktionen "READY" zurückgegeben, so werden die internen Funktionen nicht mehr ausgeführt. Damit kann der natürliche Ablauf des Programmes verändert werden. Dies kann schwere Programmfehler verursachen!}}
{{Achtung|Das Überschreiben von nicht zugewiesenen Funktionstasten (F1 - F11) sollte vermieden werden, da diese von uns jederzeit mit Funktionen belegt werden können. F12 steht immer zur Verfügung.}}

Aktuelle Version vom 9. Februar 2024, 12:51 Uhr


Methoden der Eingabemaske

Für die Customize-Scripte stehen Ihnen diverse Funktionalitäten zur Verfügung. Nachfolgend eine Liste aller Customize-Funktionen der Maske:

Interne Funktionen
OnEdFormInit
OnEdInit
OnEdVorb
OnEdShow
OnEdStable
OnEdReadDirect
OnEdRead
OnEdStable
OnEdCheck
OnEdqSQL
OnEdSaveDirect
OnEdSave
OnEdSaveUid(cUID: String)
CheckIfChanged
OnEdClose
Tastatur-Funktionen
OnF1
OnF2
OnF3
OnF4
OnF5
OnF6
OnF7
OnF8
OnF9
OnF10
OnF11
OnF12
OnPGDN
OnPGUP
OnReturn
OnESC

Die hier aufgeführten internen Funktionen sind in der Reihenfolge aufgelistet, wie sie vom OBS beim Öffnen (OnEdFormInit bis OnEdStable) und Schließen (OnEdCheck bis OnEdClose) von Eingabemasken auch abgearbeitet werden.

HINWEIS: Bei der Verwendung der Funktionen in Customize-Scripten ist die Reihenfolge der Abarbeitung der Masken-Funktion und der Customize-Funktion von Bedeutung. Grundsätzlich gilt: Interne Funktionen werden vor dem Customize ausgeführt und Tastatur-Funktionen nach der Customize-Funktion. Um ein Customize vor der internen Funktion auszuführen, muss dem Funktionsnamen der Präfix Before_ gegeben werden. Für Tastatur-Funktionen gilt dies nur für OnESC.
ACHTUNG: Für eine erweiterte Prüfung der Maskeneingabe und einen Abbruch des Speicherns bei bestimmten Bedingungen bitte die Before-Methode Before_OnEdCheck statt OnEdCheck verwenden! Da in einigen Eingabemaske im EdCheck zusätzliche Funktionalitäten enthalten sind, die bei "gleichzeitiger" Ausführung (z. B. zwei Sachbearbeiter legen einen Auftrag an) zu Problemen führen können, haben Sie so die Möglichkeit auch diese Funktionlitäten zu blockieren.

Zugriff auf Komponenten

Um auf Komponenten der Maske zuzugreifen, sollten Sie die Funktionen xGet (Daten lesen) und xSet (Daten schreiben) verwenden.

//Auslesen einer Komponente
cName := FrmEdit.xGet('a_name');
//Setzen einer Komponente
FrmEdit.xSet('a_name',"Meier");

Globale Variablen der Eingabemaske

Über die Variable FrmEdit kann auf alle Felder und auf die Property des Edit Objekt zugegriffen werden. Folgende Property's stehen zu Verfügung:

Property Erläuterung
lCheckOK Kann bei der Überprüfung von F2 benutzt werden ob die Eingabewerte korrekt eingegeben wurden sind. Bei False wird nicht abgespeichert.
lEditMode True = Insertmodus False = Editmodus
lDataUpdate True = Daten des Edits wurden verändert
lDataChecked False=Daten werden auf gültigkeit überprüft (lCheckok)
lCloseInsert Edit-Fenster wird (lEditMode = True) nach F2 geschlossen
lCloseEdit Edit-Fenster wird (lEditMode = False) nach F2 geschlossen
lDataESC Soll bei einer Änderung im Edit eine Abfrage beim Verlassen der Maske erscheinen
lCanLock Ob bei der Eingabe nur eine Person den Datensat editieren darf
lInsert Edit Felder im Insert/Überschreibemodus (zur zeit keine Funktion)

Beispiele Eingabemaske

Button F12 anzeigen und mit Funktionalität versehen

function OnEdInit():string;
begin
    frmEdit.cmdF12.Enabled := True;
    frmEdit.cmdF12.Caption := 'F12 Test';
    frmEdit.InitButtons(frmEdit);
    frmEdit.PaintButtons(frmEdit);   
end;                         
       
procedure OnF12();  
begin                          
    Meldung('Test');
end;

Aufruf von weiteren Macros innerhalb des Macros

function OnEdInit():string;
begin
    frmEdit.cmdF12.Enabled := True;
    frmEdit.cmdF12.Caption := 'F12 Test';
    frmEdit.InitButtons(frmEdit);
    frmEdit.PaintButtons(frmEdit);   
end;                         
       
procedure OnF12();  
var oParams: TStringlist; //Parameter für Aufruf
begin
    //Aufruf ohne Parameter
    RunMacroFile('data\MACRO\Spezial\Test123.pmac');

    //Aufruf mit Parameter
    oParams := TStringlist.Create;
    oParams.Add('TEST456');      
    RunMacroFile('data\MACRO\Spezial\Test123.pmac', frmEdit, oParams);  
    MyFreeAndNil(oParams);
end;

Eingaben prüfen

HINWEIS: Beim Prüfen der Eingabe und einem bedingten Abbruch des Speichervorgangs sollte immer die Funktion Before_OnEdCheck verwendet werden. In einigen Masken stecken bestimmte Funtionalitäten im Check, welche bei mehrfacher Ausführung zu Probleme führen können. Dies betrifft z. B. die Generierung und Prüfung der Vorgangsnummer in den Vorgangsmasken (Auftrag, Lieferschein, Rechnung usw.).
function Before_OnEdCheck():string;
var oSte     : TEdit;
    cEdit    : String;
    cVorname : String;
begin
    if (FrmEdit.lEditMode) then begin
        Meldung('Edit Mode True');
    end else begin
        Meldung('Edit Mode False');
    end;
    Meldung(FrmEdit.stred_db_a_name.Text);
    oSte := FrmEdit.FindComponent('stred_db_a_name');
    Meldung(oSte.Text);
    cVorname:= FrmEdit.xGet('a_vorname');
    Meldung(cVorname);
    if (Empty(cVorname)) then begin
        FrmEdit.lCheckOk := False;
        Meldung('Bitte Vorname eingtragen');
    end;
end;

Positionen in Vorgängen blockieren

Mit dem folgendem Beispiel kann entschieden werden ob Positionen eines Vorgangs geöffnet werden sollen.

Name: AN_VORGANG_EDIT Function OpenClose

HINWEIS: Der Prefix "AN" steht für den DMS-Typ Angebot. Eine Übersicht aller DMS-Typen finden Sie hier.
function OpenClose(cVgNr:String; lInsertMode:Boolean):Boolean;
begin
   //DebugLine('cVgNr'+cVgNr);

    //02 = Möbel
    Result := oOBS.cBenutzergruppe <> '02';  
    
    if (Result) then begin  
        //Wenn Positionen vorhanden dann kein Positions-Edit
        if (DB_LSeek(oDB,'ANGPOS','az_nr='+DB_SqlVal(cVGNr))) then begin
            Result := False;
        end;
    end;
                          
    if (Result) then begin
                
        //DebugLine(iif(lInsertMode,'True','False'));
        
        //Bei nicht Insert immer False
        if (lInsertMode = False) then begin
            Result := False;
        end;
    end;
    
end;


User-Reiter

In OBS ab Version 003191 können Edit-Masken per Customizing-Script um eigene Reiter erweitert werden. Diese darin verwalteten Felder können mit eigenen Datenbankfeldern definiert werden.

Usertab.jpg

Beispiel-Userdatenbank

#DBNAME TODO

  #FELDNAME USER_BEMERK           , C  ,    8 ,  0 , "CCCCCCCC"
  #FELDNAME USER_WGR              , C ,     3 ,  0 , "*"
  #FELDNAME USER_TOGGLE           , C ,     1 ,  0 , "C"
  #FELDNAME USER_BETRAG           , N  ,   11 ,  0 , "NNNNNNNN.NNNN"
  #FELDNAME USER_DATUM            , D  ,    4 ,  0 , "TT.MM.JJ"
  #FELDNAME USER_LANGTEXT         , M  , 2000 ,  0 , "*"

Beispielscript

//------------------------------------------------------------------------------------
// Reiter Demo
//------------------------------------------------------------------------------------

type dummy = class     
    class procedure CBLMail_Enter(Sender: TObject);
    class procedure OnAngebotsNrChange(Sender: TObject);
end;

var oCBL : TCombiListe; 

//------------------------------------------------------------------------------------

function OnEdInit(): String;
var oTab : TTabSheet;
    oStr : TStringEdit;  
    oMed : TMaskEdit;   
    oLbl : TLabel;   
    oNEd : TNumericEdit;    
    oDVE : TDateValEdit;  
    oChB : TxCheckBox;        
    oTRE : TTextRichEdit;                                 
    oCBLAng : TCombiListe;
begin
    oTab := frmEdit.AddUserTab();               // Erstellt neuen User-Tab auf dem Edit
    if assigned(oTab) then begin
    
        oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'Fahrstuhl vorhanden:';   
        oLbl.Top     := 10;        
        oLbl.Left    := 10;
        oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert    
        
        oChB         := TxCheckbox.Create(frmEdit);
        oChB.Name    := 'cb_db_user_a_fahrstuhl';
        oChB.Caption := 'ja';
        oChB.TOP     := 10;
        oChB.Left    := 150;
        oChB.Parent  := oTab;        
        
        oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'Geschoss:';   
        oLbl.Top     := 40;        
        oLbl.Left    := 10;       
        oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert
        
        oStr         := TStringEdit.Create(frmEdit);
        oStr.Name    := 'stred_db_user_a_geschoss';
        oStr.Top     := 40;
        oStr.Left    := 150;      
        oStr.Width   := 20;
        oStr.Parent  := oTab;      
        
        oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'geplante Fahrzeit:';   
        oLbl.Top     := 70;        
        oLbl.Left    := 10;
        oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert
        
        oMed         := TMaskEdit.Create(frmEdit);
        oMed.Name    := 'stred_db_user_a_fahrzeit';
        oMed.Caption := 'Std.';
        oMed.Top     := 70;
        oMed.Left    := 150;    
        oMed.Width   := 40;                    
        oMed.EditMask:= '00:00';               
        oMed.Text    := '00:00';
        oMed.Parent  := oTab;
        
        oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'geplante Montagezeit:';   
        oLbl.Top     := 100;        
        oLbl.Left    := 10;     
        oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert
        
        oMed         := TMaskEdit.Create(frmEdit);
        oMed.Name    := 'stred_db_user_a_montagezeit';
        oMed.Caption := 'Std.';
        oMed.Top     := 100;
        oMed.Left    := 150;
        oMed.Width   := 40;
        oMed.EditMask:= '00:00';
        oMed.Text    := '00:00';
        oMed.Parent  := oTab;
        
        oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'Anzahl Monteure:';   
        oLbl.Top     := 130;        
        oLbl.Left    := 10;
        oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert
    
        oStr         := TStringEdit.Create(frmEdit);
        oStr.Name    := 'stred_db_user_a_anzahl_monteure';
        oStr.Top     := 130;
        oStr.Left    := 150;
        oStr.Width   := 20;
        oStr.Parent  := oTab;
        
        oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'Wiedervorlage:';   
        oLbl.Top     := 160;        
        oLbl.Left    := 10;
        oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert
    
        oChB         := TxCheckbox.Create(frmEdit);
        oChB.Name    := 'cb_db_user_a_wiedervorlage';
        oChB.Caption := 'ja';
        oChB.TOP     := 160;
        oChB.Left    := 150;
        oChB.Parent  := oTab;
        
        oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'EMail für AB:';   
        oLbl.Top     := 190;        
        oLbl.Left    := 10;
        oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert
        
        oCBL         := FrmEdit.AddCombiliste();
        oCBL.Name    := 'cbl_db_user_a_email';
        oCBL.Top     := 190;
        oCBL.Left    := 130;
        oCBL.Width   := 200;
        oCBL.Parent  := oTab;                   
        oCBL.TextModus := true;  
        InitCBLMail();           
        oCBL.OnEnter := dummy.CBLMail_Enter;  
        
        oLbl         := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
        oLbl.Caption := 'Sonstige Bemerkungen:';   
        oLbl.Top     := 220;        
        oLbl.Left    := 10;
        oLbl.Parent  := oTab;                   // Damit die Anzeige korrekt funktioniert
        
        oTRE         := TTextRichEdit.Create(frmEdit);
        oTRE.Name    := 'riced_db_user_a_memo';
        oTRE.Top     := 240;
        oTRE.Left    := 10;
        oTRE.Height  := 200;
        oTRE.Width   := 600;   
        oTRE.RulerH  := false; 
        oTRE.Parent  := oTab;                  
        
        oCBLAng := TCombiListe(FrmEdit.Findcomponent('cbl_db_a_angnr'));
        if (assigned(oCBLAng)) then begin
           oCBLAng.OnExit := dummy.OnAngebotsNrChange;
        end;

        //------------------------------------------------------------------

    end;    
end;

//------------------------------------------------------------------------------------

procedure InitCBLMail();
begin
    oCBL.GetSuLi.Tablename    := 'ANSP';
    oCBL.GetSuLi.CompareField := 'AP_EMAIL';
    oCBL.GetSuLi.Caption      := ML('EMail-Adresse');
    oCBL.GetSuli.SQLOrder     := 'ap_name';
    oCBL.GetSuli.SQLWhere     := 'ap_email>"" and ap_pnr='+DB_SQLVal(FrmEdit.xGet('a_knr'));
    //oCBL.GetSuli.SQLWhere     := 'ap_email>"" and ap_pnr='+DB_SQLVal('1200005');
    oCBL.GetSuli.Width        := 600;
    oCBL.GetSuli.Height       := 300;
    oCBL.GetSuli.InitColumn('Vorname', 'ap_vorname', 15,nil,'',System.Classes.Talignment.taLeftJustify);
    oCBL.GetSuli.AddColumn ('Name', 'ap_name', 20,nil,'',System.Classes.Talignment.taLeftJustify);
    oCBL.GetSuli.AddColumn ('EMail', 'ap_email', 40,nil,'',System.Classes.Talignment.taLeftJustify);                
end;

//------------------------------------------------------------------------------------

class procedure dummy.CBLMail_Enter(Sender: TObject);
begin
    InitCBLMail();
end;

//------------------------------------------------------------------------------------

class procedure dummy.OnAngebotsNrChange(Sender: TObject);
var cAngebot : String;
    cBuffer  : String;          
    cWhere   : String;
begin
    cAngebot := FrmEdit.xGet('a_angnr');
    cWhere   := 'a_nr='+DB_SQLVal(cAngebot); 
    cBuffer  := DB_ReadSQLValue(oDB,'auftrag','a_angnr',cWhere);     
    
    Debugline (cBuffer);                     
    if (cAngebot <> cBuffer) and FrmEdit.lEditMode then begin            
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_fahrstuhl',cWhere);          
            FrmEdit.xSet('user_a_fahrstuhl',cBuffer);
                    
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_geschoss',cWhere);          
            FrmEdit.xSet('user_a_geschoss',cBuffer);
                    
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_fahrzeit',cWhere);          
            FrmEdit.xSet('user_a_fahrzeit',cBuffer);
                    
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_montagezeit',cWhere);          
            FrmEdit.xSet('user_a_montagezeit',cBuffer);
                    
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_anzahl_monteure',cWhere);          
            FrmEdit.xSet('user_a_anzahl_monteure',cBuffer);
        
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_email',cWhere);          
            FrmEdit.xSet('user_a_email',cBuffer);
            
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_wiedervorlage',cWhere);          
            FrmEdit.xSet('user_a_wiedervorlage',cBuffer);
                    
            cBuffer := DB_ReadSQLValue(oDB,'angebot','user_a_memo',cWhere);          
            FrmEdit.xSet('user_a_memo',cBuffer);
        
    end;
end;

//----------------------------------------------------------------

{function OnEdRead():String
begin
    if (FrmEdit.xGet('user_a_wiedervorlage')='1') then begin
        Meldung(frmEdit.xGet('user_a_memo'));
    end;
end;}
//----------------------------------------------------------------

Beispiel: Rechnung per Mail/Fax

function OnEdSave():string;
begin 
end;  

function OnEdInit():string;
var oAutoMail         : TxCheckBox;
    oFaxEMailDrucken  : TxCheckBox;
    oOldDate          : TxCheckBox;
begin 
   oAutoMail         := NIL;
   oFaxEMailDrucken  := NIL; 
   oOldDate          := NIL;

   if (Assigned(FrmEdit)) then begin
       oAutoMail        := TxCheckBox(FrmEdit.FindComponent('cb_automail')); 
       oFaxEMailDrucken := TxCheckBox(FrmEdit.FindComponent('cb_FaxEMailDrucken')); 
       oOldDate         := TxCheckBox(FrmEdit.FindComponent('cb_OldDate')); 
   end;
    
   if (Assigned(oAutoMail)) then begin
       oAutoMail.checked := True;
       Meldung('oAutoMail');   
   end;
   
   if (Assigned(oFaxEMailDrucken)) then begin
       oFaxEMailDrucken.checked := True;   
       Meldung('oFaxEMailDrucken');   
   end;
   
   if (Assigned(oOldDate)) then begin
       oOldDate.checked := True;   
       Meldung('oOldDate');   
   end;
   
end;


Beispiel: OnExit Funktion beim Verlassen des An-Feldes der E-Mail Maske löst AutoReplace in Richtext aus

type
    TEventHandler = class
        procedure onMyExit(Sender: TObject);
    end;
    
var OnExit       : TNotifyEvent;
    oEventHandler: TEventHandler;

procedure TEventHandler.onMyExit(Sender: TObject);
var oRich: TTextRichEdit;
begin
    if Assigned(OnExit) then begin
        OnExit(Sender);
        Debugline('TEST');
        oRich := TTextRichEdit(frmEdit.FindComponent('riced_e_memofeld'));
        if (Assigned(oRich)) then begin
            oRich.RichAutoReplace(True, False);
        end;
    end;
end;


function XOnCreate():string;
var oAn: TStringEdit;
begin
    OnExit := Nil;
    oAn := TStringEdit(frmEdit.FindComponent('stred_db_e_an'));
    Debugline('TEST1');
    if (Assigned(oAn)) then begin
        oEventHandler := TEventHandler.Create();
        
        OnExit := oAn.OnExit;
        oAn.OnExit := oEventHandler.onMyExit;
        Debugline('TEST2');
    end;       
end;

Besonderheiten

HINWEIS: Sämtliche Tastatur-Funktionen haben noch eine Variante mit dem Präfix Before_.
ACHTUNG: Wird bei den Before_-Funktionen "READY" zurückgegeben, so werden die internen Funktionen nicht mehr ausgeführt. Damit kann der natürliche Ablauf des Programmes verändert werden. Dies kann schwere Programmfehler verursachen!
ACHTUNG: Das Überschreiben von nicht zugewiesenen Funktionstasten (F1 - F11) sollte vermieden werden, da diese von uns jederzeit mit Funktionen belegt werden können. F12 steht immer zur Verfügung.