Software Archive
Read-only legacy content
17061 Discussions

String Tables in Fortran

j_jimenez
Beginner
459 Views
How can I use StringTables in Visual Fortran 6.5, as I do in Visual C++ 6.0?
Thank you.
0 Kudos
1 Reply
Jugoslav_Dujic
Valued Contributor II
459 Views
It's easy -- just use LoadString. Most troubles, however, come from totally different treatment of string variables in two languages (null-terminated vs. fixed length). I use the following routines for manipulating strings from string tables. Actually, all language-dependent strings are stripped from the main application and placed in .dlls. Application loads appropriate dll at start (which contains also language-specific menus and dialogs) and everything is later loaded using LoadString:

 
MODULE LANGDEP 
 
USE DFWIN 
 
IMPLICIT NONE 
 
PUBLIC 
 
INCLUDE "lang.fd"                   !"Resource.fd" from dll's rc file 
 
INTEGER, PUBLIC::   hLangLib     !Handle of resource dll 
 
! PUBLIC OPERATOR (/)  !Concatenation -- Stripped for brevity 
! PUBLIC OPERATOR (//) !Concatenation -- Stripped for brevity 
 
PUBLIC OPERATOR (.S.) 
PUBLIC OPERATOR (.C.) 
PUBLIC ASSIGNMENT (=) 
 
PRIVATE StrAssign 
PRIVATE C2F 
 
INTERFACE OPERATOR (.S.) 
      MODULE PROCEDURE StrLoad 
END INTERFACE 
INTERFACE OPERATOR (.C.) 
      MODULE PROCEDURE CStrLoad 
END INTERFACE 
INTERFACE ASSIGNMENT (=) 
      MODULE PROCEDURE StrAssign 
END INTERFACE 
 
!==================================================== 
CONTAINS 
!==================================================== 
RECURSIVE CHARACTER(256) FUNCTION StrLoad(i) RESULT(sR) 
!Load a blank-terminated string 
 
INTEGER, INTENT(IN)::   i 
 
IF (LoadString(hLangLib, i, sR, LEN(sR)).GT.0) THEN 
   sR = C2F(sR) 
ELSE 
   sR = "" 
END IF 
 
END FUNCTION StrLoad 
!===================================================== 
RECURSIVE CHARACTER(256) FUNCTION CStrLoad(i) RESULT(sR) 
!Load a null-terminated string 
 
INTEGER, INTENT(IN)::   i 
 
IF (.NOT. (LoadString(hLangLib, i, sR, LEN(sR)).GT.0)) sR = CHAR(0) 
 
END FUNCTION CStrLoad 
!===================================================== 
SUBROUTINE StrAssign(s, i) 
!Operator (=) (returns Fortran string) 
 
INTEGER, INTENT(IN)::   i 
CHARACTER(*), INTENT(OUT)::   s 
 
IF (LoadString(hLangLib, i, s, LEN(s)).GT.0) THEN 
      s = C2F(s) 
ELSE 
      s="" 
END IF 
 
END SUBROUTINE StrAssign 
!===================================================== 
FUNCTION C2F(sStr) RESULT(sR) 
!C string to Fortran string conversion 
 
CHARACTER(*),INTENT(IN):: sStr 
CHARACTER(LEN=LEN(sStr)):: sR 
 
INTEGER::   nRes 
 
nRes=INDEX(sStr,CHAR(0)) 
IF (nRes.EQ.0) RETURN 
sR=sStr(1:nRes-1) 
 
END FUNCTION C2F 
!===================================================== 
           
END MODULE LANGDEP 


Few usage samples:
In WinMain.f90: hLangLib = LoadLibrary("dmdEng.dll")
When loading strings:USE LANGDEP...szString = IDS_TITLE
When working with dialogs:
USE DFLOGM 
USE LANGDEP 
iSt=DlgInit(IDD_MYDIALOG, hLangLib, Dlg) 
iSt=DlgSet(Dlg, IDC_EDIT1, .S.IDS_STRINGX) 

etc...

HTH

Jugoslav
0 Kudos
Reply