Eingabeformatierung mit PadR, PadL, PadC

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
KHKDampflok
UDF-Programmierer
UDF-Programmierer
Beiträge: 68
Registriert: Do, 14. Dez 2006 20:55
Wohnort: 22946 Trittau
Kontaktdaten:

Eingabeformatierung mit PadR, PadL, PadC

Beitrag von KHKDampflok »

Hallo Leute,

mit Xbase habe ich meine CLIPPER-Datenbank LOKLISTE auf Windows umgestellt. Diese befaßt sich mit der Erfassung von Eisenbahntriebfahrzeugen und ist komplett im GUI-Modus erstellt. Zur korrekten Darstellung müssen fast alle Eingaben formartiert werden. Ich benutze dazu die og. Funktionen, habe aber das Problem, daß ab und an das Programm abstürzt mit dem Hinweis Datensatz muß für diese Operation gesperrt sein. Leider ist der Fehler auch nicht reproduzierbar und in der Anleitung fehlt auch ein Hinweis, daß man bei den Functionen PadR, PadL, PadC den Befehl RLock() vorher anwenden muß. Ich habe zwar in den Fällen, wo dieser Fehler auftrat, RLock() vorweg angegeben, der Fehler trat an dieser Stelle auch nicht mehr auf. Ich bin aber nicht sicher, ob das wirklich geholfen hat !!

Erwähnen muß ich aber noch, daß fast alle betreffenden Eingaben noch die Bearbeitung eines Code-Blocks zur Folge haben !!!

Ein Eingabebeispiel ohne Codeblock :

oComboDir := XbpCombobox():new( oStatic1,,{275,77},{90,210} )
oComboDir:type := XBPCOMBO_DROPDOWN
oComboDir:XbpSLE:bufferLength := 12
oComboDir:XbpSLE:group := XBP_WITHIN_GROUP
oComboDir:create()
oComboDir:XbpSLE:dataLink := {|x| RLock(), ;
IIf( x==NIL, ALLTRIM(F_direkt1), ;
F_direkt1 := PadR(ALLTRIM(x),12) ) }
oComboDir:XbpSLE:setData()
oComboDir:helpLink := MagicHelpLabel():New(" Direktion für Länderbahn-Triebfahrzeuge ")
oComboDir:killInputFocus := {|| nFieldPos := FieldPos( "F_direkt1" ) }
oDlg:addEditControl( oComboDir:XbpSLE )

Vielen Dank im Voraus für Eure Hilfe

MfG Dipl.Ing. karl-Heinz Kahl
Mit xbase habe ich ein Triebfahrzeugsarchiv "LOKLISTE" erstellt. Dieses Archiv enthält Daten aller Eisenbahntriebfahrzeuge vom "ADLER" bis zum ICE. Genaueres erfährt man unter www.lokliste.de, wo man auch eine kostenlose DEMO-Version herrunterladen kann !!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Eingabeformatierung mit PadR, PadL, PadC

Beitrag von AUGE_OHR »

hi,
KHKDampflok hat geschrieben: Datensatz muß für diese Operation gesperrt sein
...
oComboDir:XbpSLE:dataLink := {|x| RLock(), ;
IIf( x==NIL, ALLTRIM(F_direkt1), ;
F_direkt1 := PadR(ALLTRIM(x),12) ) }
...
dein Problem ist das du versuchst im 2st Teil von :datalink eine Aktion
auszuführen. Da durch wird dieser aktive und evaluiert den Ausdruck :
FELD := SLEvariabel.
KHKDampflok hat geschrieben: ...
oDlg:addEditControl( oComboDir:XbpSLE )
...
ich nehme mal an das dies dein Array ist (= aEditControl) wo du auch
deine SLE aufnmmst. "Normal"erweise würdes du im "OK" Codeblock
sowas haben wie GATHER(aEditControl). In den Codeblock kannst du
ja deine eigenes GATHER() weiter um RLOCK().

Was die "formatierung" unter GUI angeht kann ich nur auf SLEPic von
James Loughner verweisen womit man wie bei Cl*pper dann PICTURE
hat. Eine Combobox gibt es auch von ihm.

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Eingabeformatierung mit PadR, PadL, PadC

Beitrag von brandelh »

KHKDampflok hat geschrieben: oComboDir:XbpSLE:dataLink := {|x| RLock(), ;
IIf( x==NIL, ALLTRIM(F_direkt1), ;
F_direkt1 := PadR(ALLTRIM(x),12) ) }
Hallo,

so geht das nicht:

1. Rlock() kann immer fehlschlagen, man muss also auf Erfolg abfragen.
Wenn es fehlschlägt gibt es diese Fehlermeldung.
2. Rlock() wird hier auch ausgeführt, wenn nur gelesen werden soll, ist das gewünscht ? (Langsam !)
3. Rlock() wird nicht wieder aufgehoben.
4. So verschachtelte Codeblöcke sind sehr fehleranfällig und nicht debugbar.

besser du lagerst das Speichern (oder beides) in eine Funktion aus:

Code: Alles auswählen

// schreiben auslagern
   oComboDir:XbpSLE:dataLink := {|x| [b]RLock()[/b], ;
                                     IIf( x==NIL, ALLTRIM(F_direkt1), ;
                                          MyReadSave("FeldName",cAlias,x }  ) }  

// alles auslagern
   oComboDir:XbpSLE:dataLink := {|x| MySave("FeldName",cAlias,x }  

je nach Auslagerungsart muss die Funktion etwas anders aussehen...
hier das Beispiel nur zum Speichern.

function MaSave(cFeld,cAlias,xVal)
    if (cAlias)->(RLock())
      replace (cAlias)->(cFeld) with xVal  
      // eventuell muss es so angegeben werden:
      // replace (cAlias)->&(cFeld) with xVal
      (cAlias)->(DbUnlock())
    else
      Fehlermeldung
    endif
return x

Gruß
Hubert
Antworten