Autor Téma: Zápis do súboru  (Přečteno 371 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Zápis do súboru
« kdy: 27-07-2020, 12:58:31 »

Vytváram súbor a chem doň zapísať tento obsah (dva riadky)
{
}
Kód: Delphi [Vybrat]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   F: File;
  4. begin
  5.   if FileCreate('D:\bla.json') = INVALID_HANDLE_VALUE then
  6.   begin
  7.     ShowMessage('chyba vytvorenia');
  8.     Exit;
  9.   end;
  10.  
  11.  
  12.   AssignFile(F, 'D:\bla.json');
  13.   Writeln(F, '{, }');  //  alebo
  14.   Write(F, '{, }');
  15.   CloseFile(F);
  16. end;
ale dostávam chybu.
Unit1.pas(83): E2054 Illegal type in Write/Writeln statement
Veď to mám podľa návodu.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2840
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zápis do súboru
« Odpověď #1 kdy: 27-07-2020, 14:27:42 »
  F: File;
No nejspis proto, ze pises do textoveho souboru, takze ten typ musi byt TextFile  ve starych Delphi tusim jen Text.

Ale silne bych doporucoval tyhle archaicke pristupy jednou pro vzdy zapomenout a pouzit treba TStringBuilder a jeho obsah na disk zapsat treba pomoci streamu -> zadne zastarale IO operace, zadne low level platformove zavisle API funkce atd.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2840
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zápis do súboru
« Odpověď #2 kdy: 27-07-2020, 14:30:43 »
Nehlede na to, ze JSON bys nemel prasit rucne, ale pomoci trid, ktere pro praci s nim Delphi nabizi.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zápis do súboru
« Odpověď #3 kdy: 27-07-2020, 14:57:15 »
Kód: Delphi [Vybrat]
  1. No nejspis proto, ze pises do textoveho souboru, takze ten typ musi byt TextFile  ve starych Delphi tusim jen Text.
V návode to nejako zvýraznené nie je.
Kód: Delphi [Vybrat]
  1. Ale silne bych doporucoval tyhle archaicke pristupy jednou pro vzdy zapomenout a pouzit treba TStringBuilder a jeho obsah na disk zapsat treba pomoci streamu -> zadne zastarale IO operace, zadne low level platformove zavisle API funkce atd.
Ja som si myslel, že pre taký prípad je to kanón na vrabce. Zmením to.
Kód: Delphi [Vybrat]
  1. Nehlede na to, ze JSON bys nemel prasit rucne, ale pomoci trid, ktere pro praci s nim Delphi nabizi.
Tu mi ide len o založenie prázdneho JSON súboru. Celá manipulácia s ním je pomocou SuperObject. Založeniu súboru predchádza:
  • Ak neexistuje, tak ho vytvor skopírovaním šablóny
  • Ak sa to nepodarí, tak ho vytvor skopírovaním záložného súboru. Je to vlastne šablóna
  • Ak sa to nepodarí, tak vytvor prázdny JSON súbor.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1145
  • Karma: 43
    • Verze Delphi: 7, 2010
Re:Zápis do súboru
« Odpověď #4 kdy: 27-07-2020, 19:31:35 »
A proč nevytvoříš JSON objekt a neuložíš ho přímo přes metodu?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zápis do súboru
« Odpověď #5 kdy: 27-07-2020, 19:56:10 »
Určite by to išlo aj tak.
Najprv kontrolujem licenciu a spol. Potom prítomnosť dôležitých súborov. Po úspechu zobrazím prihlasovacie okno a až po úspešnom prihlásení v ňom si vytváram objekt pre prácu s JSON. Tam už musím mať k dispozícii json súbor.
Takto tomu rozumiem a nemotám sa v tom. Pritom ide iba o vytvorenie jednoduchého, z pohľadu json prázdneho súboru. Nepredpokladám, žeby sa to v praxi uplatnilo, keď mám dve zálohy.
Mám obavu, že keď do toho siahnem, tak si to rozhodím. Každý užívateľ má vlastný súbor. Stačí hociktorý nepoškodený skopírovať a premenovať. Mám tam len informácie o formulároch. Takže nič dôležité. No bez toho súboru sa aplikácia nedá spustiť.
Hlavne ma to už prestáva baviť a ani náhodou si nechcem komplikovať situáciu.
Už som to zvládol dvoma riadkami. Našiel som to tu vo vlastnej diskusii. Len mi to hľadanie dlho trvalo.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zápis do súboru
« Odpověď #6 kdy: 27-07-2020, 19:57:45 »
procedure TSupObjJson.CreateEmptyJSON;
const
  s = '{' + sLineBreak + '}';
var
  FS: TFileStream;
begin
  FS := TFileStream.Create(IdentificationData.JsonFileName, fmCreate);

  try
    FS.Write(s[1], Length(s) * StringElementsize(s));
  finally
    FS.Free;
  end;
end;
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2840
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zápis do súboru
« Odpověď #7 kdy: 27-07-2020, 21:02:39 »
No ja bych na to pouzil JSON tridy, napr.
Kód: Delphi [Vybrat]
  1.   StreamWriter := TStreamWriter.Create(IdentificationData.JsonFileName);
  2.   try
  3.     try
  4.       Writer := TJsonTextWriter.Create(StreamWriter);
  5.       Writer.Formatting := TJsonFormatting.Indented;
  6.       Writer.WriteStartObject;
  7.       Writer.WriteEndObject;
  8.       StreamWriter.Flush;
  9.     finally
  10.       Writer.Free;
  11.     end;
  12.   finally
  13.     StreamWriter.Free;
  14.   end;
  15.  
  16.  
  17.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zápis do súboru
« Odpověď #8 kdy: 27-07-2020, 21:28:21 »
To sú veci, ktoré vidím prvýkrát  v živote! O JSON triedach neviem vôbec nič.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2840
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zápis do súboru
« Odpověď #9 kdy: 28-07-2020, 08:47:54 »
To sú veci, ktoré vidím prvýkrát  v živote! O JSON triedach neviem vôbec nič.
Nestaci jen nakupovat nove verze Delphi, ale obcas je dobre se podivat, co noveho prinaseji  ;)
http://docwiki.embarcadero.com/RADStudio/Rio/en/JSON
« Poslední změna: 28-07-2020, 08:55:08 od pf1957 »

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1027
  • Karma: 47
    • Verze Delphi: 10.3
Re:Zápis do súboru
« Odpověď #10 kdy: 28-07-2020, 08:55:00 »
Já si podpory všimnul, když jsem potřeboval .json načíst, ale přišlo mi to nějaké kostrbaté (což byla možná spíš chyba u klávesnice). Nakonec jsem použil Neslib.Json.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zápis do súboru
« Odpověď #11 kdy: 28-07-2020, 09:25:36 »
Citace
Nestaci jen nakupovat nove verze Delphi, ale obcas je dobre se podivat, co noveho prinaseji 
To je pravda, ale nie je na to čas ;D  Budem si musieť pozrieť aj ostatné novinky.
Ale použitie SuperObjectu ponechám. To by bolo veľa roboty to vymeniť.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline jirka52

  • Mladík
  • **
  • Příspěvků: 58
  • Karma: 3
    • Verze Delphi: D2, D5, D6, D2005, D2006, D2009, DXE2,DXE7,D10.2
Re:Zápis do súboru
« Odpověď #12 kdy: 28-07-2020, 11:58:28 »
Máš tam chybu. Tady je příklad zápisu do textového souboru.
Kód: Delphi [Vybrat]
  1. var
  2.   A: TextFile;
  3.   I: Integer;
  4.   fileNameStr : string;
  5. begin
  6.   if FWriteDataIntoLog then
  7.   begin
  8.     //write data into file
  9.     fileNameStr := MainForm.Dest + saveFolderStr + myTempDataFile;
  10.     AssignFile(A, fileNameStr);
  11.     try
  12.       if not FileExists(fileNameStr) then
  13.       begin
  14.         Rewrite(A);
  15.       end
  16.       else
  17.       begin
  18.         Append(A);
  19.       end;
  20.       //resulted voltage
  21.       Writeln(A, 'The result of measured voltage:' + myOutputFileDelimiter +
  22.         FloatToStr(Self.FMeasurementResult));
  23.       Writeln(A);
  24.     finally
  25.       CloseFile(A);
  26.     end; {try}
  27.   end;
  28. end;

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Zápis do súboru
« Odpověď #13 kdy: 28-07-2020, 16:37:07 »
Urobil som to podľa pf1957 #7.
V mojom prípade som mal v súbore toho viac, než som chcel.
Neviem prísť na to, v čom u mňa spočíva chyba.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2840
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Zápis do súboru
« Odpověď #14 kdy: 28-07-2020, 17:03:25 »
Neviem prísť na to, v čom u mňa spočíva chyba.
No, v tom puvodnim prispevku jsi narikal na chybu prekladace a tu urcite vyresi zmena typu souboru na textovy.

A pak tam mas jeste 2 chyby: snazis se psat do zavreneho souboru, protoze po AssignFile pred writeln ti chybi otevreni souboru pro zapis tj. rewrite nebo append a az to tam doplnis, tak zjistis, ze ti soubor nejde otevrit, protoze to CreateFile soubor otevre a ty zahazujes handle souboru, ktere to vraci a pak ho nemas jak zavrit, takze se budes snazit otevrit jiz otevrene...

Na tech par radku kodu docela dost chyb... A je to dusledkem, ze se k tomu chovas jako pejsek s kocickou, kdyz pekli dort: chvili API  operace pristupujici k souboru na low-level urovni pres handle, pak archiacka Wirthova pascalstina atd.