2012-06-15 39 views
0

我以前從未使用Foxpro。你可以將下面的Foxpro代碼轉換成C#,以便我能理解邏輯。我主要對密碼邏輯感興趣。什麼是spac()? can_p是存儲用戶名密碼的.dbf文件。但密碼以數字形式存儲在多列(k1,k2 ... k12)中。我想系統會從密碼中計算出這12個數字並進入。Foxpro程序需要了解

proc can_01 
set colo to w/ 
@10,18 clea to 17,60 
@10,18 to 17,60 doub 
set colo to n/w 
@10,34 say ' LOG IN ' 
set colo to w/ 
@12,20 say 'Enter Name.......' 
@13,20 say 'Counter..........' 
usr=spac(18) 
cntr='*' 
x=1 
do whil .t. 
set colo to n/w 
@22,0 
@22,0 say ; 
    'Enter user name     <CR>-Exit     <ESC>-Abort ' 
set colo to n/w,w+/bg 
@12,38 get usr pict '!!!!!!!!!!!!!!!!!' 
read 
set colo to n/w 
if read()=12 .or. usr='  ' .or. x>3 
    @22,0 
    @22,0 say 'Log In aborted..Press any key..' 
    ??chr(7) 
    do can_011 
    read 
    quit 
endi 
x=x+1 
use can_p 
set exac on 
loca for user=trim(usr) 
set exac off 
@22,0 
if eof() 
    @22,0 say 'User '+usr+' does not exists..Press any key..' 
    ??chr(7) 
    use 
    read 
else 
    exit 
    endi 
endd 
do whil .t. 
@22,0 say ; 
    'Enter Counter No    <CR>-EXIT     <ESC>-Abort' 
@13,38 get cntr pict '!' 
read 
@22,0 
if read()=12 
    do can_011 
    quit 
endi 
if trim(usr)='BABU M' .and. cntr='*' 
    exit 
endi 
if .not. cntr$'ABCD' 
    @22,0 say 'Incorrect Counter..Re-enter..' 
    ??chr(7)+chr(7) 
    loop 
endi 
exit 
    endd 
    scntr=cntr 
x=1 
do whil .t. 
set colo to n/w 
@22,0 
@22,0 say ; 
    'Enter Password    <CR> - Exit    <ESC> - Abort ' 
set colo to w/ 
@14,20 say 'Enter PASSWORD :-' 
set cons off 
@14,38 say '' 
acce to ps 
set cons on 
cps=chr(k8+9)+chr(k4+7)+chr(k5-31)+chr(k1+13)+chr(k3-19)+; 
    chr(k7-35)+chr(k2-27)+chr(k6+1)+chr(k11-6)+chr(k10+6); 
    +chr(k12+11)+chr(k9-5) 
    set colo to n/w 
    @22,0 
    set exac on 
    if cps<>ps 
    @22,0 say 'Incorrect PASSWORD !! Press any key ..' 
    ??chr(7) 
    read 
    x=x+1 
    if read()=12 .or. x>3 
    do can_011 
    quit 
    endi 
    else 
    exit 
    endi 
endd 
@22,0 
@22,0 say 'Please Wait..' 
set exac off 
if user#'JV' 
    if .not. (counter=scntr .and. active) 
    @22,0 say 'Counter not activated...Access denied..Return to system..' 
    ??chr(7)+chr(7)+chr(7)+chr(7) 
    do can_011 
    quit 
    endi 
    endi 
    xr=recn() 
    loca for counter=scntr .and. li .and. recn()<>xr 
    if found() 
    @22,0 say 'Counter already Logged-In by User '+user+; 
    '..Return to system..' 
    ??chr(7)+chr(7)+chr(7)+chr(7) 
    do can_011 
    quit 
    endi 
    go xr 
    repl active with .t.,li with .t.,lidt with date(),litm with time() 
    unlo 
    do can_011 
    set colo to w/n,w+/g 
    retu 

回答

0

雖然我可以寫一個C#WinForms和WPF做到這一點,我會嘗試從FoxPro的角度解釋,通過所有的方式......你要知道...這看起來是的一個反編譯版本因爲所有的foxpro關鍵字只能顯示4個字符,而不是完整的和更容易理解的命令。此外,這是代碼,看起來像它是在VFP甚至存在之前寫的...很像舊的DOS日子,回到...... 1989天...

&& "Proc" is short for Procedure (or Func for Function) much like method in C#, 
public Can_01() 
{ do things here... } 

proc can_01 

&& "SET COLO" = Set Color to 
set colo to w/ 
&& @x,y to x2,y2 does basic drawing, such as clear screen (via CLEA TO = "clear to") 
&& from a DOS world of 24x80 as this appears to reflect, then draw a double border (via DOUB) 
@10,18 clea to 17,60 
@10,18 to 17,60 doub 

&& change "COLO"r again 
set colo to n/w 

&& At given x/y coordinate (10,34), show a string for "LOG IN", 
@10,34 say ' LOG IN ' 
&& another color change 
set colo to w/ 
&& at x,y, show string label for respective 
@12,20 say 'Enter Name.......' 
@13,20 say 'Counter..........' 

&& create variable "usr" and set it equal to 18 spaces 
usr=spac(18) 
&& create var "cntr" and default it to a single "*" 
cntr='*' 
&& create var "x" and set to 1 
x=1 

&& Loop... do while true -- continues until and "ENDDO" 
&& in C#... while(true) { do things... } 
do whil .t. 
    && more coloring and showing fixed-spacing label to the screen 
    && to give user indicator of allowed input of <CR> carriage return to exit 
    && or escape key to abort, but still show a label and more coloring. 
    set colo to n/w 
    @22,0 
    @22,0 say ; 
    'Enter user name     <CR>-Exit     <ESC>-Abort ' 
    set colo to n/w,w+/bg 

    && @/Get is actually getting user input from given x,y coordinate. 
    && the "pict" is a picture clause like an input format string. "!" means 
    && convert entered characters to upper case, and only allow as many characters 
    && as there are "!" in the picture mask. 
    && put whatever is typed into the variable "usr" 
    @12,38 get usr pict '!!!!!!!!!!!!!!!!!' 

    && stop and wait for user input until they hit enter or escape 
    read 
    && more color changing 
    set colo to n/w 

    && read() or "ReadKey()" checks input length, that otherwise is the same as mask-- 
    && redundant. OR the user name is all spaces OR the x counter is now past 3rd attempt 
    if read()=12 .or. usr='  ' .or. x>3 
     && show to screen login aborted 
     @22,0 
     @22,0 say 'Log In aborted..Press any key..' 
     && send a DOS "beep" to the user 
     ??chr(7) 
     && do another procedure or function called "can_011" (I guess is some "cancel" process) 
     do can_011 
     && read will basically wait for confirmation via simple message of "Press any key..." 
     read 
     && quit entire application 
     quit 
    endi 


    && user did provide input, increase the attempted login counter x=x+1 
    x=x+1 

    && open the table called "CAN_P" 
    use can_p 
    && set exact matching on... to prevent things like finding "Tom" = "Tom " 
    set exac on 
    && try to "LOCATE" for the specific user entered exists within the table 
    && but trimming the value entered by the user ( C# string.Trim() ) 
    loca for user=trim(usr) 
    && turn exact matching back off 
    set exac off 

    @22,0 
    && if EOF() (end of file) is reached, we did not find the user 
    if eof() 
     && show message to user at x,y position 
     @22,0 say 'User '+usr+' does not exists..Press any key..' 
     && another DOS bell 
     ??chr(7) 
     && close the "CAN_P" table 
     use 
     && wait for user to press a key to try via next loop 
     read 
    else 
     && we found the record in the table, exit the do/while loop 
     exit 
    endi 
endd && end of the do/while loop 

&& another do while true... 
&& almost identical in content, but asking for some "cntr" variable. 
&& almost same display, showing counter attempts and prompting 
do whil .t. 
    @22,0 say ; 
     'Enter Counter No    <CR>-EXIT     <ESC>-Abort' 
    && prompt user for a value to put into the "cntr" variable, single character 
    @13,38 get cntr pict '!' 
    && read input 
    read 
    @22,0 
    if read()=12 
     && again, forcing itself out via "CAN_011" procedure somewhere else 
     do can_011 
     quit 
    endi 

    && if the user name is equal to "BABU M" and t he cntr = "*", exit the do/while loop 
    if trim(usr)='BABU M' .and. cntr='*' 
     exit 
    endi 

    && "$" in VFP is like "contains" in C# 
    && in C#... string myLongString = "testing for some value to look for"; 
    &&   string myLongString.Contains(" val"); 
    && 
    && in this case, 'cntr" is a single character value. and if it is NOT 
    && and "A", "B", "C" or "D", tell user incorrect and re-enter 
    if .not. cntr$'ABCD' 
     @22,0 say 'Incorrect Counter..Re-enter..' 
     && oooo.... two DOS beeps 
     ??chr(7)+chr(7) 
     && continue the do/while loop 
     loop 
    endi 

    && leaky-boat technique... we got this far, must have had a good value, 
    && exit the do/while loop 
    exit 
endd && end of the do/while loop 

&& new variable "SCntr" = whatever "cntr" is 
scntr=cntr 

&& reset "x" var back to 1 
x=1 

&& another do/while loop 
do whil .t. 
    && more color, and show label to user to enter password 
    set colo to n/w 
    @22,0 
    @22,0 say ; 
     'Enter Password    <CR> - Exit    <ESC> - Abort ' 
    set colo to w/ 
    @14,20 say 'Enter PASSWORD :-' 
    && set console OFF so nobody can see what is being typed... 
    set cons off 
    @14,38 say '' 
    && "Accept" keyboard entry to a variable "ps" 
    acce to ps 
    && turn console back on to allow seeing typing again 
    set cons on 

    && I don't know where the "K8", "K4", "K5", etc are... I SUSPECT they 
    && are in the user's login table as some sort of mask to compare against 
    && "CHR()" is to get ASCII character equivalent based on a numeric value. 
    && ex: CHR(32) = ASCII 32 = space character... CHR(65) = "A", CHR(66)="B", etc... 
    && so the programmer was building a variable "CPS" by adding a bunch of single 
    && characters of the value of "K8" + 9 and getting its ASCII value, then adding 
    && the next character, and next until all characters processed into one long string 
    cps=chr(k8+9)+chr(k4+7)+chr(k5-31)+chr(k1+13)+chr(k3-19)+; 
     chr(k7-35)+chr(k2-27)+chr(k6+1)+chr(k11-6)+chr(k10+6); 
     +chr(k12+11)+chr(k9-5) 

    && more coloring 
    set colo to n/w 
    @22,0 
    && another exact test 
    set exac on 
    && if the data entered and "computed string" via "cps" is NOT the same 
    && as what I suspect is "ps" a column in the CAN_P table (login table) 
    if cps<>ps 
     && show message of incorrect password 
     @22,0 say 'Incorrect PASSWORD !! Press any key ..' 
     && another bell 
     ??chr(7) 
     && wait for user to hit a key 
     read 
     && add 1 to the "x" counter for failed attempts/abort 
     x=x+1 
     && is user aborting, or exceeded 3 login attempts 
     if read()=12 .or. x > 3 
     && do the cancel procedure thing again 
     do can_011 
     && quit the app 
     quit 
     endi 
    else 
     && valid password, EXIT the DO/WHILE loop 
     exit 
    endi 
endd && end of the do/while loop 

&& more display status 
@22,0 
@22,0 say 'Please Wait..' 
set exac off 

&& "#" is same as <> (not equal to) 
&& if the user is NOT "JV" 
if user#'JV' 
    && more simple boolean check... I assume checking if user is "Active" 
    && based on column in the login table 
    if .not. (counter=scntr .and. active) 
     @22,0 say 'Counter not activated...Access denied..Return to system..' 
     && wow... seriously... 4 dos BEEPs, canel process and quit application 
     ?? chr(7)+chr(7)+chr(7)+chr(7) 
     do can_011 
     quit 
    endi 
endi 

&& create var "xr" and preserve whatever the "record number" is in the user table 
xr=recn() 

&& while still in the login table, try to "LOCATE" for the given condition 
&& based on respective variables and their counterpart in the table. 
&& HOWEVER, look for value and the record is NOT the one we stored in "xr" above 
loca for counter=scntr .and. li .and. recn() <> xr 
if found() 
    && nag user that the person is already logged in message, 4 bells, cancel, quit app 
    @22,0 say 'Counter already Logged-In by User '+user+; 
     '..Return to system..' 
    ??chr(7)+chr(7)+chr(7)+chr(7) 
    do can_011 
    quit 
endi 

&& go back to the originally found record 
go xr 

&& replace the actual record with status of active = true, 
&& lidt (I suspect login date with current date() (C# DateTime.Now is closest) 
&& litm = just the time portion 
repl active with .t.,li with .t.,lidt with date(),litm with time() 
&& unlock the record 
unlo 

&& do the "CAN_011" procedure thing 
do can_011 
&& colors 
set colo to w/n,w+/g 
&& done with this routine, just return to whoever called it. 
retu 
+0

謝謝DRapp。是的,它是DOS程序的Foxpro。你真的救了我的一天。讓我嘗試獲取密碼邏輯,以便我可以計算k1 ... k12號碼並保存客戶端(丟失密碼並且他們不知道誰是開發人員) – jeff

+0

@easternwind,如果您可以轉儲我的12個價值觀,我也能爲你扭轉局面。 – DRapp

+0

雅,thnx,但我遵循你的邏輯後得到了。再次感謝您節省我的一天 – jeff