...das mit dem Event OnTranslate hat mir dann auch keine Ruhe gelassen, da ich mich erinnerte so was schon mal irgendwo gelesen zu haben. Das Lazarus-Buch war meine erste Eingebung, da (das alte?) Delphi nix mit UTF8 am Hut hat, und siehe da, für alle die Interesse am Thema haben, da steht, dass sich die Zeichensätze in Abhängigkeit von der dBase-Version unterscheiden. Die DOS-basierten Versionen III und IV benutzen CP437 (!) und ab Version VII sei der Windows-ANSI-Zeichensatz in der BDE (-> Lazarus-Buch?!?) eingestellt. Also gehe ich davon aus, dass dBase Version VII (=meine Einstellung) auch CP1252 verwendet. Weiters steht da noch, dass um DOS codierte Tabellen korrekt anzeigen und bearbeiten zu können nach dem .Open eine Zeichensatzumwandlung durchgeführt werden solle und zwar derart, dass die Eigenschaft 'Transliterate' aller Felder auf 'True' gesetzt werden soll. Vorgeschlagen wird dazu folgender Code
Code: Alles auswählen
procedure TMainForm.SetTransliterate;
var
i:Integer;
begin
for i:=0 To DBFile.Fields.Count-1 do
if DBFile.Fields[i] is TStringField then
TStringField(DBFile.Fields[i]).Transliterate:=True;
end;
Dazu soll der OnTranslate Event-Handler folgendermaßen implementiert werden:
Code: Alles auswählen
function TMainForm.DBFileTranslate(dbf:TDbf;Src,Dest:PChar;ToOem:Boolean):Integer;
var
S:String;
L:Integer;
begin
S:=StrPas(Src);
L:=Length(S);
if L>0 then begin
S:=ConvertEncoding(S,'CP437',EncodingUTF8);
if Length(S)>L then SetLength(S,L);
Move(S[1],Dest^,L+1);
end;
Result:=L;
end;
Leider geht der Text nicht weiter auf dBase VII oder höher ein, das versickert irgendwo im Äther. Somit ist, mir zumindestens, unklar, ob bei dBase VII oder höher eine entsprechende Konversion erfolgen muss oder ob Lazarus dies automatisch macht und ob, wenn Konversion, die dann nach o. g. Schema (also mit CP1252 statt CP437) ablaufen kann.
Übrigens steht da auch drin, dass eine falsche Interpretation des Zeichensatzes die Datenbanktabelle zerstört (dies für alle, die sich aufregen, dass dBase schlecht sei und bereits eine selbstgeschriebene Anwendung eine Tabelle zerstört habe)
