Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Válasz: Hosszú ékezetek 2013 jún. 17 18:19 #1265

  • ejbenjaro
  • ejbenjaro profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 66
  • Köszönetek: 4
Persze hogy megnyitható és kezelhető is vele rekordokat tartalmazó fájl. Pont ugyan úgy, mint a példámban szereplő bájtokat tartalmazó fájl, csak ott a változód nem byte lesz, amibe olvasol, hanem egy rekord típusú változó.
Egyébként melyik Lazarus és Free Pascal verziót használod? Nálam a Lazarus 1.0.8 és 1.0.10-es verzió volt, a Free Pascal mind a két esetben 2.6.2.

Az alábbi linken van egy példaprogram a rekordokat tartalmazó fájl kezelésére filestreammel. A példában egy saját osztályt hozok létre a filestreamből.
dl.dropboxusercontent.com/u/2766266/recordfile.zip
Mottó:
"Az ember sokszor más mint aminek látszik. De ritkán jobb..."
--
Gép : Asus P5G41T-M LX, Intel Celeron DC E3400, 4GB DDR3, 320GB SATA2, minden más integrált.
OS : Ubuntu 14.04
--
web: lassuviz.blogspot.hu/

Válasz: Hosszú ékezetek 2013 jún. 17 16:23 #1263

  • brandyman
  • brandyman profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 40
  • Köszönetek: 1
Kipróbáltam, hogy átveszem az OpenDialog.Filename-t egy String-be, az UTF8ToSYS függvénnyel, de így sem megy...
Próbaképpen kiírattam (ShowMessage) a String tartalmát, ezt mutatta:
C:\...........\?rv?zt?r?.abc
Szóval már a koverzió végén sem jó a dolog...

Ha belenézek az OpenDialog.Filename változóba Showmesage(OpenDialog.Filename)-vel, akkor olvasható eredményt kapok:
C:\..........\árvíztűrő.abc
De így sem nyitja meg... :-(

Lehet, hogy tényleg az AssignFile a hunyó...

Lehet, hogy a TFileStream jó megoldás lehet, de kérdés, hogy rekordokat tartalmazó típusos fájl megnyitható-e vele valahogyan?

Válasz: Hosszú ékezetek 2013 jún. 17 15:01 #1262

  • ejbenjaro
  • ejbenjaro profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 66
  • Köszönetek: 4
És ha nem az Assign-t használnád, hanem mondjuk TFileStream-et?
Pl mint az alábbi kódban: (a form tartalmaz egy gombot, egy opendialogot és egy listboxot, a form fomrcreate eseménye, valamint a gomb onclick eseménye van megírva, semmi extra beállítás)
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    fFileName: string;
    fByteFileStream: TFileStream;
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i, db : integer;
  adat: byte;
begin
  adat:=0;
  if Opendialog1.Execute then fFileName:=UTF8toSys(OpenDialog1.FileName);
  if fFileName<>'' then
  begin
    fByteFileStream:=TFileStream.Create(fFileName,fmOpenRead);
    db:=fByteFileStream.Size div SizeOf(Byte);
    for i:=1 to db do
    begin
      fByteFileStream.Read(adat,SizeOf(Byte));
      Listbox1.Items.Add(IntToStr(Adat));
    end;
    fByteFileStream.Free;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  fFileName:='';
end;
 
end.

Windows 7-en csont nélkül beolvassa az Árvíztűrő tükörfúrógép.abc nevű fájlt, ami bájt típusú adatokat tartalmaz. Az adatokat tartalmazó fájlt az alábbi kis program hozta létre:
program general;
 
{$mode objfpc}{$H+}
 
var
  f : File of Byte;
  x : byte;
  i : integer;
begin
  randomize;
  assignfile(f,'adatok.abc');
  ReWrite(f);
  for i:=1 to 50 do
  begin
    x:=random(255);
    Write(f,x);
  end;
  CloseFile(f);
end.
A fájlt kézzel, a windows intéző segítségével, neveztem át a kívánt fájlnévre.

A teljes forráskódot letöltheted innen: dl.dropboxusercontent.com/u/2766266/ekezetes2.zip

Közben kipróbáltam XP alatt is működik és az AssignFile használatával sem volt semmi gond. Szerintem ne közvetlenül az Opendialog.Filename változót használd, hanem ennek a tartalmát tedd át egy akármilyen string típusú változóba, ahogy én is csináltam, lehet ez a probléma oka.
Mottó:
"Az ember sokszor más mint aminek látszik. De ritkán jobb..."
--
Gép : Asus P5G41T-M LX, Intel Celeron DC E3400, 4GB DDR3, 320GB SATA2, minden más integrált.
OS : Ubuntu 14.04
--
web: lassuviz.blogspot.hu/

Válasz: Hosszú ékezetek 2013 jún. 16 08:13 #1261

  • brandyman
  • brandyman profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 40
  • Köszönetek: 1
A gond az, hogy amíg két aposztróf között adod meg a fájl nevét, addig működik a dolog, ha viszont átveszed az OpenDialog-tól, már szétesik...

Assign(F,UTF8ToSys(OpenDialog.Filename));

Válasz: Hosszú ékezetek 2013 máj. 30 13:52 #1260

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 499
  • Köszönetek: 86
Előfordulhat hogy a könytár elérése nem működik megfelelően, lásd: #14467 . A csatolt TestDirEx.pas segítségével ellenőrizheted.

Ha nem ez a helyzet akkor:

Minden az operációs rendszernek átadott és onnan átvett szöveg (többnyire fájl- és könyvtárnevek) esetén használni kell a karakterkódolást átalakító eljárásokat. A fájlok belső tartalma esetén pedig ellenőrizni kell, hogy szükséges-e az átalakítás vagy már eleve a kívánt módon kódolt a szöveg.

Tehát ha egy beviteli mezőben adsz meg szöveget, amit később fájlnévként használsz akkor azt a használatkor át kell/ajánlott alakítani utf-8-ról a rendszer kódolására.
Illetve amikor beolvasod a fájlok listáját egy könyvtárból (FindNext) és azok neveit meg akarod jeleníteni egy beviteli mezőben (vagy máshol) akkor a rendszer kódolásáról utf-8 kódolásra kell alakítani őket.

Egyébként a fájlok létrehozása, írása, megnyitása, olvasása és bezárása is történhet a hagyományos módon:
Assign(F,UTF8ToSys('árvíztűrő tükörfúrógép.abc'));
ReWrite... | Reset...
BlockWrite... | BlockRead...
Close...
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Válasz: Hosszú ékezetek 2013 máj. 30 13:18 #1259

  • brandyman
  • brandyman profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 40
  • Köszönetek: 1
Vegyük ketté a dolgokat;

1. A fájl létrehozása ékezetes karakterekkel Lazarusból,
2. Az ékezetes fájl beolvasása Lazarusszal.

A második a fontosabb jelen esetben, ennek teszteléséhez egyszerűen Windows-ból kell átnevezni a fájl-t hosszú ékezetesre, ekkor garantált, hogy tényleg a rendszer karakterkódolását használja. Magam is így tesztelek, de sajnos a fájlokat nem tudom megnyitni...

Válasz: Hosszú ékezetek 2013 máj. 30 04:47 #1258

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 499
  • Köszönetek: 86
A próbléma alapvetően nem a Lazarus-ban van, hanem a windows furcsa egy kicsit. Például eltérő karakterkódolást használ a terminálban (parancssor) és a grafikus felületen (gui). Persze nem ok nélkül: ez a DOS öröksége.

A Lazarus a belső eljárásaiban használja az UTF-8 kódolást. Ha ezeket nem megfelelően alakítod át akkor nem találja majd a kívánt fájlt a rendszer. Ha a kérdésedben nem elírás történt (AnsiToUTF8 és SysToUTF8) akkor próbáld meg úgy hogy a belső (UTF-8) kódolt fájlneveket alakítod át a rendszer (SYS/ANSI) karakterkódolására:
Assign(F,UTF8ToSys('árvíztűrő tükörfúrógép.abc'));
vagy
Assign(F,UTF8ToAnsi('árvíztűrő tükörfúrógép.abc'));
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Hosszú ékezetek 2013 máj. 29 15:26 #1257

  • brandyman
  • brandyman profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 40
  • Köszönetek: 1
Adottak fájlok, amelyeket vagy "File of Byte" vagy rekordokat tartalmazó tipusos fájlként kellene megnyitnom, azaz hagyományos "ASSIGNFILE", "RESET", és "READ" utasításokkal szeretnék hozzáférni, de amint hosszú ékezetek vannak a fájl nevében, szétesik az egész. Amint a RESET()-re fut a program IOREsult=2-vel tér vissza azaz "File not found"...

Tudom, hogy a Lazarus az UTF8 kódolás miatt nehezen kezeli ezeket a fájlokat, ám mégis valahogyan meg kellen oldanom ezt a dolgot.
Az AnsiToUTF8 és SysToUTF8 függvények nem segítenek a dologban...

A példa kedvéért legyen a fájlnév: "árvíztűrő tükörfúrógép.abc", ebben minden hosszú ékezetes magánhangzó benne van.

Előre is köszi!

B.

  • Oldal:
  • 1