OBS/Makros und Scripting/Anwendungsbereiche/Customize Edits: Unterschied zwischen den Versionen
Böhrer (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Hello, dear friend! My name is Jonathon. I am pleased that I can join to the entire world. I live in Netherlands, in the south region. I dream to visit the dif…“) |
Thiel (Diskussion | Beiträge) |
||
(24 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Makros und Scripting}} | |||
==Methoden der Eingabemaske== | |||
Für die Customize-Scripte stehen Ihnen diverse Funktionalitäten zur Verfügung. Nachfolgend eine Liste aller Customize-Funktionen der Maske: | |||
{| class="wikitable" | |||
|- | |||
!Interne Funktionen | |||
|- | |||
|OnEdFormInit | |||
|- | |||
|OnEdInit | |||
|- | |||
|OnEdVorb | |||
|- | |||
|OnEdShow | |||
|- | |||
|OnEdStable | |||
|- | |||
|OnEdReadDirect | |||
|- | |||
|OnEdRead | |||
|- | |||
|OnEdStable | |||
|- | |||
|OnEdCheck | |||
|- | |||
|OnEdqSQL | |||
|- | |||
|OnEdSaveDirect | |||
|- | |||
|OnEdSave | |||
|- | |||
|OnEdSaveUid(cUID: String) | |||
|- | |||
|CheckIfChanged | |||
|- | |||
|OnEdClose | |||
|} | |||
{| class="wikitable" | |||
|- | |||
! 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. | |||
<syntaxhighlight lang="Delphi"> | |||
//Auslesen einer Komponente | |||
cName := FrmEdit.xGet('a_name'); | |||
//Setzen einer Komponente | |||
FrmEdit.xSet('a_name',"Meier"); | |||
</syntaxhighlight> | |||
==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: | |||
{| class="wikitable" | |||
|- | |||
!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=== | |||
<syntaxhighlight lang="Delphi"> | |||
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; | |||
</syntaxhighlight> | |||
===Aufruf von weiteren Macros innerhalb des Macros=== | |||
<syntaxhighlight lang="Delphi"> | |||
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; | |||
</syntaxhighlight> | |||
===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"> | |||
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; | |||
</syntaxhighlight> | |||
===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 [[OBS/Makros und Scripting/Developer/Sonstiges/DMS Abkürzungen|hier]].}} | |||
<syntaxhighlight lang="Delphi"> | |||
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; | |||
</syntaxhighlight> | |||
==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 [[OBS/Makros und Scripting/Benutzerdefinierte Datenbanktabellen|eigenen Datenbankfeldern]] definiert werden. | |||
[[Datei:Usertab.jpg]] | |||
===Beispiel-Userdatenbank=== | |||
<syntaxhighlight lang="Delphi"> | |||
#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 , "*" | |||
</syntaxhighlight> | |||
===Beispielscript=== | |||
<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; | |||
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;} | |||
//---------------------------------------------------------------- | |||
</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; | |||
</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.
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
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
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.
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;