Sziasztok!
Delphihez a TDBF nevű ingyenes komponenst használok, egy DBF fájl eléréshez.
Kérdésem az lenne, hogy TDBF-el hogy tudok kódlapot váltani?
Egy DOS alatt készült dbf fájlt kellene megjeleníteni egy Delphiben írt alkalmazásban.
Nem csak egyszeri "konverzióról" lenne szó, mert mindig változik az adatbázis tartalma, ezért mindenképpen a TDBF-et szeretném rávenni arra, hogy helyesen jelenítse meg.
Sőt, a 11. oldalon: 6.4 Translate
{ $ifdef DELPHI_4}
function Translate(Src , Dest: PChar ; ToOem: Boolean): Integer;
override; { virtual}
{ $else}
procedure Translate(Src , Dest: PChar; ToOem: Boolean); override; {
virtual}
{ $endif }
The data stored in a DBF file is written in a specific codepage, the \OEM" codepage. Windows uses the \ANSI" codepage to display data. This function translates between these codepages.
Specifying true for ToOem translates from Windows to DBF. Specifying false for ToOem translates from DBF to Windows.
Azt írják, a level IV dBase IV-et jelent, III és III+-hoz level3 tartozik. Ez viszont azt jelentheti, hogy a LanguageID módosítása nem fog eredményt hozni, de a Translate metódus attól még jó lehet.
Tulajdonképpen két karaktertömb (buffer); Src-ben vannak az adatbázisból kiolvasott karakterek, Dest-be kerülnek Translate után a konvertált karakterek. Ha a két buffer ugyanaz, akkor "helyben" történik a konverzió (legalábbis nem írták, hogy ilyet nem lehet).
Jól értelmezem, hogy a programomból mondjuk egy esemény hatására meghívom a dbf.Translate(); -ot?
És utána már a konvertált táblának kellene megjelennie?
Én úgy értelmezném, hogy megnyitsz egy táblát, kiolvasol belőle valamit, és azt konvertálod, de ki tudja... Neten alig van róla valami. Van OnTranslate eseménye is, de hogy az mikor kerül meghívásra, nem tudom. Egy orosz oldalon ezt az eseményt használták a cirill betűs konverzióra, karakterenként iteráltak a forrás-bufferen, és átírták annak byte-jait.
Mindenesetre, a TDBF fórumán ezt találtam: a tábla megnyitása előtt, tablelevel = 3 esetén (ami elvileg neked kell), a DefaultOpenCodePage paramétert a használandó kódlap számára, jelen esetben 852-re kell állítani:
Szia!
Köszönöm szépen a segítséged, de sajnos nem akar jó lenni sehogy.
Úgy tűnik más megoldás után kell néznem, csak nem tudom mi után.
A BDE meg tudná ezt oldani szerinted?
Kipróbálni nem tudom, de állítólag a BDE 4.0 és afölöttiek kezelik a dBase III-as táblákat is.
Az, hogy nem sikerült, amúgy mit jelent? Elég kevés info az, hogy valami nem megy.
A TDBF AfterOpen eseményébe megadtam a következőt:
DbfGlobals.DefaultOpenCodePage := 852; Dbf1.Open;
Ez nem hozott semmi eredményt, pedig elvileg lefutott, próbaként az OnTranslate eseményhez megadtam egy Beep;-et, minden sornál szépen végig csipog, majd betölti a táblát, de semmi változás.
Köszönöm, de így se könnyítettétek meg a dolgomat, mindenki a másiknak adná :)
A téma címénél maradva, TBDF komponenst használva, miként tudnék új rekordot hozzáadni a táblához?
Próbáltam az InsertRecord();-ot, de arra hibaüzenetet kapok, miszerint: "cannot modify read-only dataset".
Pedig nem read only a tábla, írás jogom is van a fájlra.