Hej
Hvordan hiver jeg f.eks. adresse fra den danske kolonne ind i en caption på en knap?
library Language;
uses
SysUtils;
function GetLang(LangID : Byte; TextID : Integer) : PChar; stdcall;
Var
Tekst : String;
Buffer : Array[0..355] of Char;
begin
Tekst:='';
Buffer:='';
Case LangID of
1 : Begin {DANISH}
Case TextID of
1 : Tekst:=' Firmasøgning ';
2 : Tekst:='Udfyld ét eller flere felter';
3 : Tekst:='Dobbeltklik for detaljer';
4 : Tekst:='Firmanavn';
5 : Tekst:='Adresse';
6 : Tekst:='Postnr./By';
7 : Tekst:='Land';
8 : Tekst:='Tlf.';
end;{END CASE}
End;
2 : Begin {ENGLISH}
Case TextID of
1 : Tekst:=' Company Search ';
2 : Tekst:='Fill in one or more fields';
3 : Tekst:='Doubleclick for details';
4 : Tekst:='Company';
5 : Tekst:='Address';
6 : Tekst:='Postal Code/City';
7 : Tekst:='Country';
8 : Tekst:='Phone';
end;{END CASE}
End;
GetLang:=StrCopy(Buffer,PChar(Tekst));
end;
exports
GetLang;
begin
end.
Det er en dll fil som jeg har sprogene i.
Det jeg vil det er at jeg har en knap. Hvis jeg så vælger sprog id 1 så skal der stå adresse. Håber i forstår...
Mvh
Jesper
www.zig-software.dk
jtp@zig-software.dk
Hej Jesper,
Der er 2 ting som skal gøres før at du kan bruge din funktion fra din applikation.
1. I dit DLL (.dpr) skal du tilføje :
exports
GetLang name 'GetLang';
Dette fortæller compileren at din funktion skal exporteres så andre App's kan bruge den.
Du skal også huske at for at returnere din "lang" tekst så er det "Result" i stedet for "GetLang" (sidste linie i din funktion) du skal bruge. Du skal allokere hukommelse til din PChar som returneres ellers returnere du en PChar som peger på en buffer som ligger lokalt i din funktion (altså på stacken) og som fjernes lige så snart du hopper ud af din funktion.
Gør følgende til sidst i din funktion:
Result := AllocMem(Length(Text)+1); // Husk 1 extra char for at kunne afslutte strengen(#0).
StrCopy(Result, PChar(Text)); // kopiere Lang strengen til "caller".
end;
Dog skal du huske, at der hvor du kalder GetLang, skal du huske at bruge FreeMem på den returnerede streng.
2. Du skal sørgefor at "binde" dit DLL til din applikation:
function GetLang(LangID : Byte; TextID : Integer) : PChar; external '<dit dll navn>' name 'GetLang';
Denne metode gør dog at du vil få en exception under opstart, hvis DLL'et ikke findes.
Du kunne også loade DLL'et under initialiseringen af din App. Hvis App'en så ikke kan finde DLL'et så kan du tage handling ud fra det. Her er 2 funktioner som loader/unloader dit DLL:
type
TGetLanguage = procedure (LangID : Byte; TextID : Integer) : PChar;
var
LanguageDLL : Cardinal;
GetLang : TGetLanguage;
function LoadLanguages(ADLL_Name : String) : Boolean;
begin
LanguageDLL := LoadLibrary(PChar(ADLL_Name));
if LanguageDLL <> 0 then
begin
GetLang := GetProcAddress(LanguageDLL, 'GetLang');
Result := True;
Exit;
end;
FreeLibrary(LanguageDLL);
Result := False;
end;
procedure UnloadLanguages;
begin
if LanguageDLL <> 0 then
FreeLibrary(LanguageDLL);
LanguageDLL := 0;
GetLang := nil;
end;
// Og her er et lille test så du kan se hvordan DLL funktionerne skal bruges.
procedure Test;
var
Msg : PChar;
begin
if LoadLanguage('MyLang.dll') then
begin
Msg = GetLang(1, 1);
ShowMessage(Msg);
FreeMem(Msg);
UnloadLanguages;
end
else
ShowMessage('Language dll not found.');
end;
Håber det hjælper dig.
Mvh
Michael.[Redigeret d. 12/02-03 08:14:51 af Michael Skovslund][Redigeret d. 12/02-03 08:18:09 af Michael Skovslund]