- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
How can I use StringTables in Visual Fortran 6.5, as I do in Visual C++ 6.0?
Thank you.
Thank you.
Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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:
Few usage samples:
In WinMain.f90:
When loading strings:
When working with dialogs:
etc...
HTH
Jugoslav
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
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page