#1 19.07.2006 22:25:50

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

language class

tach smile
da ich hier im Forum auch schon das ein oder andere
aufgefangen habe smile möchte ich in der nächsten Zeit euch
etwas von meinem Source abgeben;)

so hier mal ne Language Class -
die Idee dahinter isollte klar sein smile
man schreibt ein Spiel und benutzt id's, so dass
man später für die Lokalisierung net in den Code eingreifen muss
zb Wir haben im Menu einen Button "neu"
also machen wir hier in der importfile:
(so sieht die Struktur aus.. kann man ja auch dem Source entnehmen;))
//Kommentar - bla bla bla
id_menu_new
neu

ah ja und sorry falls der Source ein bissel doof Strukturiert ist smile das war noch für meine uralt Dx9.0c Engine smile

Code: delphi

unit ulanguageunit;

interface

uses
  sysutils;

type
  tlstrings = record
    l_id      : shortstring;
    l_string  : shortstring;
  end;

  tlstring   = array of tlstrings;

  tlanguage = class
  private
    fstring: tlstring;
    function getstring(id: shortstring): string;
    procedure setstring(id: shortstring; const value: string);
  public
    constructor create;
    function  getstringidbynr(_nr: integer) : string;
    function  getstringcount : integer;
    function  checkstringid(_id: shortstring): boolean;
    procedure save_strings(filename: string);
    procedure load_strings(filename: string);
    procedure importtxt(filename:string);
    procedure exporttxt(filename:string);
    procedure removestring(_id: shortstring);
    destructor destroy; override;
    property strings[id: shortstring]: string read getstring write setstring; default;
  end;

implementation


{ TLanguage }

function tlanguage.getstringcount : integer;
var
_t:integer;
begin
_t:=length(fstring);
result:= round(_t);
end;



function tlanguage.getstringidbynr(_nr: integer) : string;
begin
  result:=fstring[_nr].l_id;
end;



function tlanguage.getstring(id: shortstring): string;
var i:integer;
   _t:integer;
begin
  if checkstringid(id)=false then
    begin
      for i := 0 to length(fstring)-1 do if fstring[i].l_id  = id then _t:=i;
      result:=fstring[_t].l_string;
    end else
    begin
      result:='error current string do not exist';
    end;
end;



procedure tlanguage.setstring(id: shortstring; const value: string);
begin
  setlength(fstring , length(fstring) + 1);
  with fstring[length(fstring)-1] do
  begin
    l_id:=id;
    l_string:=value;
  end;
end;



constructor tlanguage.create;
begin
//hab keine idee geghabt was ich hier reintuen sollte ;)
end;



function tlanguage.checkstringid(_id: shortstring): boolean;
var i:integer;
   _t:boolean;
begin
  _t:=true;
  for i := 0 to length(fstring)-1 do
  begin
  if fstring[i].l_id  = _id then _t:=false;
  result:=_t;
  end;
end;



procedure tlanguage.load_strings(filename: string);
var plik: file;
    i   : integer;
    _tmp:integer;
begin
  assignfile(plik,  filename );
  reset(plik, 1);
  blockread(plik, _tmp , sizeof(integer));
  setlength(fstring , _tmp);
  for i := 0 to  _tmp-1 do
    begin
      with fstring[i] do
      begin
        blockread(plik, l_id   , sizeof(shortstring));
        blockread(plik, l_string  , sizeof(shortstring));
      end;
    end;
  closefile(plik)
end;



procedure tlanguage.save_strings(filename: string);
var plik: file;
    i   : integer;
begin
  assignfile(plik,  filename );
  rewrite(plik, 1);
  i := length(fstring);
  blockwrite(plik, i , sizeof(integer));
  for i := 0 to  length(fstring)-1 do
    begin
      blockwrite(plik, fstring[i].l_id      , sizeof(shortstring));
      blockwrite(plik, fstring[i].l_string  , sizeof(shortstring));
    end;
  closefile(plik)
end;



procedure tlanguage.importtxt(filename:string);
var
f: textfile;
_tmp,_id,_txt:shortstring;
begin
assignfile(f, filename);
reset(f);
while not eof(f) do
begin
readln(f, _tmp);//temp -komentar:)
readln(f, _id);
readln(f, _txt);
  setlength(fstring , length(fstring) + 1);
  with fstring[length(fstring)-1] do
  begin
    l_id:=_id;
    l_string:=_txt;
  end;
end;
closefile(f);
end;


procedure tlanguage.exporttxt(filename:string);
var
f: textfile;
i:integer;
_tmp,_id,_txt:shortstring;
begin
assignfile(f, filename);
rewrite( f);
for i := 0 to length(fstring)-1 do
begin
_tmp:= '{str nr: '+ inttostr(i) +' }';
writeln(f, _tmp);//temp - to komentarz:)
  with fstring[i] do
  begin
    writeln(f, l_id);
    writeln(f, l_string);
  end;
end;
closefile(f);
end;




procedure tlanguage.removestring(_id: shortstring);
var i:integer;
   _t:boolean;
begin
  _t:=false;
  for i := length(fstring)-1 downto 0 do
    begin
      with fstring[i] do
        begin
          if _id = l_id then
            begin
              l_id        := fstring[i+1].l_id;
              l_string    := fstring[i+1].l_string;
              _t:=true;
            end;
        end;
    end;
  if _t  then setlength(fstring, length(fstring) - 1);
end;



destructor tlanguage.destroy;
begin
  fstring:=nil;
  inherited;
end;

end.


grrr

Offline

 

#2 20.07.2006 06:06:24

LarsMiddendorf
ProMember
Registriert: 24.01.2005
Beiträge: 103

Re: language class

Warum erbst du nicht von der THashedStringList ?

Offline

 

#3 20.07.2006 06:57:22

Back in Time
ProMember
Registriert: 08.04.2005
Beiträge: 130

Re: language class

Da Du UniCode/AnsiCode nicht trennst, wirst Du damit VOR ALLEM bei Lokalisierungen nicht weit kommen!

Versuch mal ne Sprache, die n paar mehr sonderzeichen hat, als wir mit unseren Umlauten, dann wirst Du allein in Europa schonmal Polnisch, Spanisch, Griechisch, Französisch, Tschechisch und die Skandinavischen Sprachen nicht bedienen können.

Zähl nach, was übrig bleibt.


If we would understand it we wouldn't call it code.

Offline

 

#4 20.07.2006 07:09:45

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: language class

Code: delphi

constructor tlanguage.create; 
begin 
//hab keine idee geghabt was ich hier reintuen sollte  
end; 



Das hier funktioniert nur rein zufällig, weil der Delphi compiler es wegoptimiert (da kein code vorhanden) - das Minimum, das du in einer Klasse die von TObject abgeleitet ist im constructor haben solltest ist ein inherited. Ach ja, wegen der Klassenableitung - wenn du nichts angibst wird implizit von TObject abgeleitet, es empfiehlt sich jedoch, dass man das explizit macht also class(TObject), da zb. pasdoc andernfalls damit nicht klar kommt.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#5 20.07.2006 10:59:23

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: language class

Ähm, also diese GetString-Methode ist verdammt ineffzient!! Stell dir mal vor du hast da 1000 oder 10000 Strings drin...

Zuerst einmal, warum durchläuft die CheckStringID-Methode das ganze Array? So wie du das implementiert hast wird bei jeder Abfrage immer das komplette Array zweimal durchlaufen! Es gibt ja nicht einmal eine Abfrage die den Durchlauf abbricht wenn die ID gefunden wurde...
Allgemein solltest du dein Array sortiert halten und eine http://www-i1.informatik.rwth-aachen.de … /algo1.php benutzen, da du wesentlich häufiger eine ID suchst und nur selten (oder gar nicht) eine ID hinzufügst.
Wenn dein Array 10000 Elemente enthält bräuchte deine Implementierung 20000 Stringvergleiche. Binäresuche braucht maximal 14 !!!!

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#6 20.07.2006 12:19:48

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: language class

Die lassen auch kein einziges gutes Haar an Dir, was?

Offline

 

#7 20.07.2006 13:39:18

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: language class

Ach ja.....hätte man vielleicht zuerst mal lesen sollen wink
http://www.delphidev.de/phpBB2/viewtopic.php?t=24


My software never has bugs. It just develops random features.

Offline

 

#8 20.07.2006 13:58:04

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: language class

Zitat:

Die lassen auch kein einziges gutes Haar an Dir, was?

Es ist lediglich ein Hinweis darauf, dass die genannte Codestelle ein potentielles Problem darstellt - eine Information, die vielleicht nicht ganz unwesentlich ist - insbesondere, wenn das in mehreren Klassen so aussehen sollte.

Was Coolcats Kritik betrifft - da hat er völlig recht, effizient ist es einfach nicht. Allerdings bietet Delphi fertige Mechanismen an, die für sowas ganz praktisch sind - zb. THashedStringList, also mit der hashfunktion kann man wirklich blitzschnell abfragen, Nachteil ist eben das relativ langsame Einfügen von Elementen, aber im konkreten Fall ist die Abfrage wohl ohnehin weitaus wichtiger.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#9 24.07.2006 14:56:04

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Re: language class

:mrgreen: ihr habt schon recht mit dem was ihr schreibt smile aber...
1.ich hab schon 2 Spiele mit dieser unit geepublished big_smile ind zwar in dt, uk, fr, italien, und drei Ländern aus dem OStblock (polen Tschechisch und ru.)
und hatte kein Problem mit der Sprache (Back in Time, ich werde das bei meiner neuen Engine berücksichtigen:) )
2. jep das mit dem getString ist nich sooo schnell hmm (das hab ich in einer neuen Unit mit assabler anders gelöst)-nun ja wie schon gesagt, dat war noch für meine alte Dx9c Engine :] die 10'er bekommt da ne andere unit.. -
ich hab diese aber trotz einiger kleiner Fehler hier reingestellt, damit die, die nicht soviel Ahnnung vom Coden haben etwas bekommen, was (meiner Meinung nach) net so schwer zu verstehen ist:)

wenn die neue Engine fertig ist, werde ich mal die nuee Unit reinstellen smile


grrr

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson