Forum | | | | - Seite 1 - |
| Stephan Sonneborn | Hallo, in der LEER32.DLL habe ich testweise mit dem ResourceBuilder zwei Strings eingefügt:
einmal in der Sprache Deutsch $0407 bzw. 1031:
und einmal in der Sprache Englisch $0809 bzw. 2057:
Die DLL habe ich über USEDLL eingebunden. Den Text weise ich so zu:
DE_Text$ = RES("GetStrings", PRGDLL&, 100, $00407)
EN_Text$ = RES("GetStrings", PRGDLL&, 100, $00809)
Aber ich bekomme die Fehlermeldung "String-Ressource nicht gefunden: #100".
Was ist falsch? |
| | | XProfan X4Schöne Grüße aus Wittgenstein von Stephan Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 28.09.2020 ▲ |
| |
| | | | | - Seite 1 - |
| Georg Teles | Mir fällt auf, dass
PRGName$ = RES("GetStrings", PRGDLL&, "#100", $00407)
ein Array zurückgibt, aber ich bekomme es auch nicht hin, es auszulesen
So funktioniert es, aber ich verstehe nicht warum
Declare PRGNameN$[]'-------------------------------------#
PRGNameN$[] = RES("GetStrings", PRGDLL&, "#7", $00407)'--#
PRGName$ = PRGNameN$[4]'---------------------------------#
ganzer Code
'*******************************************************************************************************'
'* Programm: Vokabeltrainer *'
''******************************************************************************************************'
'* Version: V0.01 *'
'* Stand: 28.09.2020 *'
'* Info: Vokabeltrainer *'
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Klassendefinition *'
'*******************************************************************************************************'
CLASS Vokabel = Wort$(21), \
Uebersetzung$(21), \
Genus$(2), \
Casus$(13), \
Numerus$(11), \
Verb1$(21), \
Verb22$(21), \
Verb3$(21), \
Lektion$(13)', \
' Anlegen&, \
' Importieren@, \
' Exportieren@, \
' Vorlesen@
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Variablendeklaration *'
'*******************************************************************************************************'
'*- Programm -*'
DECLARE PRGDLL&
DECLARE PrgName$
DECLARE x!, xx!, y!, yy!
'*******************************************************************************************************'
'*- Dialog -*'
DECLARE DlgText&[5,30], DlgText$[5,30]
DECLARE DlgEdit&[5,30]
DECLARE ToolBar&, ToolbarIcons& , TabControl&[5]
'*******************************************************************************************************'
'*- Vobaln -*'
DECLARE Begriff#
DECLARE String Texte[]
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Variablendimensionierung *'
'*******************************************************************************************************'
DIM Begriff#, Vokabel
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Wertzuweisungen *'
'*******************************************************************************************************'
PRGDLL& = USEDLL("Vokabeln_32.DLL")
'PRGName$ = RES("GetStrings", PRGDLL&, "#100", $00407)
'PRGName$ = EXTSTRING$(PRGDLL&, 100)
Declare PRGNameN$[]'-------------------------------------#
PRGNameN$[] = RES("GetStrings", PRGDLL&, "#7", $00407)'--#
PRGName$ = PRGNameN$[4]'---------------------------------#
ToolbarIcons& = 0'Hier später Toolbaricon eintragen
'*******************************************************************************************************'
'*- Skalierung *'
xx! = 1.30
yy! = 1.15
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Prozedurname: MainWindow *'
''******************************************************************************************************'
'* Version: V0.01 *'
'* Stand: 28.09.2020 *'
'* Info: Baut das Hauptfenster/-dialog auf *'
'*******************************************************************************************************'
PROC MainWindow
'*******************************************************************************************************'
'*- Lokale Parameter -*'
DECLARE Handle&
DECLARE Tab&[5]
DECLARE dx%, dy%
DECLARE i%
DECLARE Ende%
'*******************************************************************************************************'
'*- Wertzuweisungen -*'
x! = 1.00
y! = 1.00
dX% = 640
dy% = 480
Ende% = 0
'*******************************************************************************************************'
'*- Fensteraufbau -*'
Handle& = CREATE("Dialog", %HWND, PrgName$, 0,0,0,0)
SETWINDOWPOS Handle& = INT((%MAXX-dx%)/2)*x!,INT((%MAXY-dy%)/2)*y! - dx%*x!, dy%*y!; 0
Toolbar& = CREATE("Toolbar", Handle&, ToolbarIcons&, 0, 0, WIDTH(Handle&), 64*y!)
TabControl&[1] = CREATE("TabCtrl", Handle&, "Vokabel", 5*x!, HEIGHT(Toolbar&) + 5*x!, WIDTH(Handle&) - 2 * 5*x!, HEIGHT(Handle&) - Height(Toolbar&)-2* 5*x! )
FOR i%, 2,5,1
TabControl&[i%] = INSERTTAB(TabControl&[1], i%,"Tab "+ STR$(i%) )
ENDFOR
'*******************************************************************************************************'
'*- Ereignishandler -*'
WHILENOT Ende%
WAITINPUT
Ende%=1
ENDWHILE
'*******************************************************************************************************'
'*- Fenster schließen -*'
DESTROYWINDOW(Handle&)
'*******************************************************************************************************'
ENDPROC
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Hauptprogramm *'
''******************************************************************************************************'
CLS
Mainwindow
DISPOSE Begriff#
FREEDLL PRGDLL&
END
Ich würde gern eine Erklärung hierfür haben
Grüße
EDIT: Da der "Deutsche Texte" in Zeile 4 steht s. ResHacker, könnte die Nummer 4 im Array was damit zutun haben ? |
| | | | |
| | Stephan Sonneborn | H.Brill (28.09.2020)
Mach doch alles mit Rolands eingebauten Funktionen.
Würde ich gerne machen, aber ich möchte gar nicht die Vokabeln in einer DLL sichern, sondern nur die Texte der Programmoberfläche. Eigentlich brauche ich das nicht für ein Vokabelprogramm, da kann die Oberfläche ja ruhig in Deutsch bleiben. Aber ich habe auf der Arbeit ein Programm entwickelt, dass in unterschiedlichen Sprachen läuft. Und da gehe ich immer noch den umständlichen Weg mit den einzelnen DLLs je Sprache und dem Auslesen mittels ExtString$(). Ich wollte einfach mal die neuen Möglichkeiten testen.
Dazu sollte ich aber schon wissen, welchen String ich auslese. Klar, ich könnte jetzt für jeden Text einen Ressourcenbereich (also den 3. Parameter in der RES("GetStrings" - Funktion) festlegen. Aber ich dachte, es geht auch einfacher, z.B. alle Texte auf Fenster 1, alle Texte auf Fenster 2, alle Hilfetexte zu Fenster 1, alle Hilfetexte zu Fenster 2 u.s.w. jeweils in einen Resourcenbereich ablegen. Damit wäre die DLL viel übersichtlicher, insbesondere dann, wenn man die Text-Nummern dann frei festlegen kann, z.B. 100-199 für die Fenstertexte, 200-299 für die zugehörigen Hilfetexte u.s.w.
Ich habe mir dafür in Excel eine Tabelle erstellt: in Spalte A die Nummer, in Spalte B ein Komma, in Spalte C der deutsche Text, in D dann der Englische. In den Spalten E und F wird dann daraus der Eintrag für die DLL generiert: Nummer & Komma & Text in der jeweiligen Sprache. Danach kann ich dann in Excel einfach die ganze Spalte kopieren und im Resource Builder einfügen. Fertig! |
| | | XProfan X4Schöne Grüße aus Wittgenstein von Stephan Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 28.09.2020 ▲ |
| |
| | Stephan Sonneborn | Georg Teles (28.09.2020)
Mir fällt auf, dass PRGName$ = RES("GetStrings", PRGDLL&, "#100", $00407) ein Array zurückgibt, aber ich bekomme es auch nicht hin, es auszulesen
Georg Teles (28.09.2020)
So funktioniert es, aber ich verstehe nicht warum Declare PRGNameN$ '-------------------------------------# PRGNameN$ = RES("GetStrings", PRGDLL&, "#7", $00407) '--# PRGName$ = PRGNameN$ '---------------------------------#
Ich hatte auch schon einen variablen Array probiert mit "#7" als 3. Parameter. Weil der ResHacker da eben eine 7 schreibt. Warum? Ich weiß es nicht...
Das macht auch nur der ResHacker. Der Resource Builder macht das nicht. Dafür kann der auch nicht mit Texten als 3. Parameter (z.B. dem "MONAT" in Rolands Beispiel) leben.
Georg Teles (28.09.2020)
EDIT: Da der "Deutsche Texte" in Zeile 4 steht s. ResHacker, könnte die Nummer 4 im Array was damit zutun haben ?
Bei mir erhalte ich als Rückgabewert für den PRGName$ den Wert "8", zumindest wird das als Fenstertitel angezeigt... Für PRGNameN$ übrigens auch...
|
| | | XProfan X4Schöne Grüße aus Wittgenstein von Stephan Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 28.09.2020 ▲ |
| |
| | E.T. | Ich nutze für sowas ohne Probleme ExtString$ , z.B. so:
SetText Status&, 0, @ExtString$(Prg_Dll& ,40)
oder
Checker&[22] = @Create("RadioButton",Static_1&[0],@ExtString$(Prg_Dll& ,24),570,305,200,20)
Der Parameter ist dann genau die Zahl, welche z.B. im ResHacker genau vor dem Texteintrag steht. Im Bsp. weiter oben also 1584 für "Januar" , 1585 für "Februar" usw... |
| | | Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 28.09.2020 ▲ |
| |
| | Stephan Sonneborn | E.T. (28.09.2020)
Ich nutze für sowas ohne Probleme ExtString$ , z.B. so: SetText Status&, 0, @ExtString$(Prg_Dll& ,40)
oder
Checker&[22] = @Create("RadioButton",Static_1&[0],@ExtString$(Prg_Dll& ,24),570,305,200,20)
Der Parameter ist dann genau die Zahl, welche z.B. im ResHacker genau vor dem Texteintrag steht. Im Bsp. weiter oben also 1584 für "Januar" , 1585 für "Februar" usw...
So mache ich das normalerweise auch. Aber damit kann man nicht mit unterschiedlichen Sprachen arbeiten. Oder man muss mit unterschiedlichen Nummernkreisen arbeiten, was ich nicht möchte... |
| | | XProfan X4Schöne Grüße aus Wittgenstein von Stephan Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 29.09.2020 ▲ |
| |
| | E.T. | Versch. Sprachen für die Programmoberfläche packe ich immer in eine "verkappte" .ini-Datei (mit "falscher" Erweiterung). Pro Sprache eine Datei. Lässt sich m.M. nach einfacher bearbeiten bzw. erweitern, als wie jedes mal die .dll zu bearbeiten. |
| | | XProfan 11Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 29.09.2020 ▲ |
| |
| | | | - Seite 2 - |
| | Georg Teles | Guten Morgen,
Stephan Sonneborn (28.09.2020)
Bei mir erhalte ich als Rückgabewert für den PRGName$ den Wert "8", zumindest wird das als Fenstertitel angezeigt... Für PRGNameN$ übrigens auch...
RES gibt ja auch einen ARRAY zurück, bei dir versucht der Befehl
PRGName$ = RES("GetStrings", PRGDLL&, "#7", $00407)
PRGNameN$ = RES("GetStrings", PRGDLL&, "#7", $00407)
den ARRAY in einen String zu zwingen, 8 vermute ich ist die Anzahl der Strings in diesem ARRAY --- du müsstest entsprechend denen String PRGNameN$ als ARRAY definieren, also PRGNameN$[] und aus diesem dann deine Strings heraussuchen
PRGNameN$[] = RES("GetStrings", PRGDLL&, "#7", $00407)
String1$ = PRGNameN$[0]
String2$ = PRGNameN$[1]
...
Ehrlich gesagt sehe ich bei dem Befehl RES auch nicht durch und habe es noch nie angewandt --- persönlich würde ich wie ET schon schrieb mit die Strings aus der EXE/DLL auslesen, wenn es so nötig sein soll
Bei meinen mehrsprachigen Programmen verwende ich einen ARRAY intern, je nach Sprache wird der ARRAY dann entsprechend gefüllt - das ist einfacher.
so nebenbei: Habe bis jetzt nur bei TrackMenüs die Ressourcen in der EXE für mehrsprachige Verwendung benutzt, das erspart dann wesentlich den Aufbau des TrackMenüs - extern laden und anzeigen [...]
das sieht im ResHacker dann so aus:
Grüße |
| | | | |
| | H.Brill | Könnte man ja auch als RC_DATA Ressource machen, zumal er ja schon eine Exceldatei hat. Die kann man ja auch als normale Textdatei in Excel speichern :
Declare string Menu[], Memory Bereich, Long groesse, anzahl, hdll, info
Def %RT_RCDATA 10
/*
Das als Textdatei speichern und mit dem Reshacker
als RC_DATA unter TEXTE einfügen :
100, Datei,File
101,Öffnen,Open
102,Schließen,Close
*/
cls
hdll = UseDLL("E:\vokabeln.dll")
info = Res("Info", hdll, %RT_RCDATA, "TEXTE", 0)
groesse = Res("Size", hdll, info)
Dim Bereich, groesse
Bereich = Res("Get", hdll, info)
anzahl = Len(String$(Bereich, 0), Chr$(13))
' Oder gleich mit
' Menu[] = Explode(String$(Bereich, 0), Chr$(13))
' ins Array transferieren.
WhileLoop 1, anzahl
Print SubStr$(String$(Bereich, 0), &LOOP, Chr$(13))
' hier kann der ganze String(Nr, deutsch, Englisch)
' nochmals untergliedert werden.
EndWhile
WaitInput
FreeDll hdll
Dispose Bereich
end
Vielleicht kommt er ja so weiter. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 30.09.2020 ▲ |
| |
| | Stephan Sonneborn | Nach etwas Überlegung und nochmaliger "genauer" Inaugenscheinnahme der Hilfe
habe ich mir folgendes Konstrukt gebaut:
StringID& = 100
Sektion$ = "#"+STR$(INT(StringID&/16)+1)
Array$[] = RES("GetStrings", PRGDLL&, Sektion$, $00407)
PRGName$ = Array$[INT(StringID&-16*(INT(StringID&/16)))]
Zunächst definiere ich in einer Hilfsvariablen die Nummer des Strings in der DLL. Dann ermittele ich die Sektion, also den 3. Parameter der RES("Getstrings" - Funktion. Dann kann ich das Array mit den maximal 16 Einträgen füllen, dabei werden nicht belegte Nummern automatisch mit Leerstrings versehen. Der eigentlichen Variablen muss ich dann nur noch den richtigen Eintrag im Array zuweisen.
Ist etwas umständlich, sollte aber funktionieren... |
| | | XProfan X4Schöne Grüße aus Wittgenstein von Stephan Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 30.09.2020 ▲ |
| |
| | E.T. | Naja, warum einfach, wenns umständlich auch geht
... aber jeden das seine
Hab solch einen Ansatz auch mal per .dll versucht, Habs aber dann aufgegeben. Hatte dann pro Sprache einfach eine sep. dll-Datei gemacht, welche bei Prog-Start geladen wurde.
Bin dann bei meiner o.g. Version mit jeweils einer Sprach-Datei pro Sprache geblieben. Das lässt sich für mich am einfachsten Bearbeiten und erweitern. |
| | | XProfan 11Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 04.10.2020 ▲ |
| |
| | Stephan Sonneborn | | | | XProfan X4Schöne Grüße aus Wittgenstein von Stephan Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 04.10.2020 ▲ |
| |
| | H.Brill | Also bei mir funktioniert das :
Declare String Menu1[], Menu2[]
Declare Memory Bereich1, Bereich2
Declare Long groesse1, groesse2, anzahl, hdll, info_d, info_e
Def %RT_RCDATA 10
/*
Das als Textdateien speichern und mit dem Reshacker
als RCDATA unter DEUTSCH und ENGLISCH einfügen :
Deutsch.txt :
Öffnen
Speichern
Schließen
Englisch.txt :
Open
Save
Close
*/
cls
hdll = UseDLL("E:\Sprachen.dll")
info_d = Res("Info", hdll, %RT_RCDATA, "DEUTSCH", 0)
info_e = Res("Info", hdll, %RT_RCDATA, "ENGLISCH", 0)
groesse1 = Res("Size", hdll, info_d)
Dim Bereich1, groesse1
groesse2 = Res("Size", hdll, info_e)
Dim Bereich2, groesse2
Bereich1 = Res("Get", hdll, info_d)
Bereich2 = Res("Get", hdll, info_e)
anzahl = Len(String$(Bereich1, 0), Chr$(13))
Menu1[] = Explode(String$(Bereich1, 0), Chr$(13))
anzahl = Len(String$(Bereich2, 0), Chr$(13))
Menu2[] = Explode(String$(Bereich2, 0), Chr$(13))
PopUp "&Datei"
AppendMenu 100, Menu1[0]
AppendMenu 101, Menu1[1]
AppendMenu 102, Menu1[2]
PopUp "&File"
AppendMenu 100, Menu2[0]
AppendMenu 101, Menu2[1]
AppendMenu 102, Menu2[2]
WaitInput
FreeDll hdll
Dispose Bereich1, Bereich2
end
Man muß nur darauf achten, die beiden Ressourcen synchron zu halten. Man könnte auch noch vor die Menütexte Zahlen schreiben, um die Menüpunkte aus den Array besser zu identifizieren. Oder halt alles zusammen (100, Öffnen, Open) . Das ganze ist ja dann leicht mit SubStr$() rauszuziehen. Da gibt es ja Möglichkeiten genug, um sowas zu realisieren. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 04.10.2020 ▲ |
| |
|
AntwortenThemenoptionen | 7.650 Betrachtungen |
ThemeninformationenDieses Thema hat 5 Teilnehmer: |