Autor Téma: Obsah súboru txt - nie je korektný  (Přečteno 558 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Obsah súboru txt - nie je korektný
« kdy: 18-06-2019, 14:59:00 »

Podľa príkladu ms-help://embarcadero.rs_xe7/codeexamples/TWriter_(Delphi).html
Kód: Delphi [Vybrat]
  1. Stream := TFileStream.Create(FileName, fmCreate or fmOpenWrite or fmShareDenyNone);
  2. Writer := TWriter.Create(Stream, $FF);
  3. myStringBuilder := TStringBuilder.Create;
  4. myStringBuilder.Append(sTitle);
  5. myStringBuilder.AppendLine;
  6. ...
  7. Writer.WriteListBegin;
  8. Writer.WriteString(myStringBuilder.ToString);
  9. Writer.WriteListEnd;
  10. Writer.Destroy;
  11. Stream.Destroy;
  12.  
Ale obsah je iný než som tam poslal. PS Pad mi to otvára ako hexa(?). Čo mám zle?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Obsah súboru txt - nie je korektný
« Odpověď #1 kdy: 18-06-2019, 16:41:23 »
Nevím, jen vidím, že prvních 6 bajtů je divných. Přijde mi to jako vadný BOM souboru.
Rovněž bych řekl, že při otevírání streamu bys měl použít buď mód fmCreate nebo fmOpenWrite, ne obojí, i když v té ukázce to tak mají. Mimochodem ta ukázka je výborná ukázka toho, jak kód rozhodně nepsat (žádné ošetření výjimek, volání destruktoru namísto Free atd.)
nil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #2 kdy: 18-06-2019, 17:09:47 »
Ten Destroy ma dosť zarazil, ale ešte som to neriešil. Tak isto ani bloky try...
Ten uvedený mód ma tiež zarazil. Ale to určite nemá vplyv na výsledok. Samozrejme to upravím.
Kód: Delphi [Vybrat]
  1. Problem bude v tom, ze volani WriteListBegin zapise do streamu znacku vaList (typu TValueType).
Ako z toho von? Nemám s tým absolútne žiadne skúsenosti ani vedomosti.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2600
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsah súboru txt - nie je korektný
« Odpověď #3 kdy: 18-06-2019, 17:15:02 »
Ako z toho von? Nemám s tým absolútne žiadne skúsenosti ani vedomosti.
A nechces se spis pochlubit, o co se vlastne snazis? TWriter a TReader byval nejaky interni pokus Borlandu o proprietarni serializaci objektu, typicky streamovani formularu do .DFM (puvodne jen v binarni podobe).

Jestli chces psat text do souboru, tak prece vubec nic takoveho nepotrebujes  :o

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #4 kdy: 18-06-2019, 17:51:29 »
Citace
A nechces se spis pochlubit, o co se vlastne snazis?
Ide mi o prosté zapísanie textu, oznamy o chybách, ktorý je uložený v premenných typu string.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #5 kdy: 18-06-2019, 18:02:16 »
Pozrel som na ten TStringWriter. V ukážke pomocou neho vytvoria string, ktorý potom zobrazia. Ale ja už ten string mám. Len ho zapísať do súboru. Nič viac.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Plnoletý
  • ***
  • Příspěvků: 150
  • Karma: 8
    • Verze Delphi: XE2
Re:Obsah súboru txt - nie je korektný
« Odpověď #6 kdy: 18-06-2019, 18:15:53 »
Ide mi o prosté zapísanie textu, oznamy o chybách, ktorý je uložený v premenných typu string.
To se mi zdá vhodnější formát XML  kde si můžeš rovnou zapisovat do elementů (atributů) čas udalosti, místo události , text udalosti atd.
a prohlížet to můžeš v kterémkoliv webbrowseru ..

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2600
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsah súboru txt - nie je korektný
« Odpověď #7 kdy: 18-06-2019, 18:20:42 »
Citace
A nechces se spis pochlubit, o co se vlastne snazis?
Ide mi o prosté zapísanie textu, oznamy o chybách, ktorý je uložený v premenných typu string.
A chces to psat do souboru jako Unicode nebo jako ANSI?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #8 kdy: 18-06-2019, 18:23:32 »
To je pre užívateľa. Nie je to klasický log. (Na tom ešte len budem pracovať.) Kontrolujem kompletnosť údajov. Ak tam bude viac nedostatkov, tak je jednoduchšie si zobraziť/vytlačiť súbor a postupovať podľa toho. Akonáhle zavrie okno o chybách, tak nevie čo tam bolo.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #9 kdy: 18-06-2019, 18:25:08 »
Citace
A chces to psat do souboru jako Unicode nebo jako ANSI?
Úplne stačí ANSI. Bude tam len slovenčina. Text správy dávam do kopy v Delphi.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #10 kdy: 18-06-2019, 18:34:59 »
Fajn, to posledné mi funguje ako má.
Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2600
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsah súboru txt - nie je korektný
« Odpověď #11 kdy: 18-06-2019, 19:04:30 »
Citace
A chces to psat do souboru jako Unicode nebo jako ANSI?
Úplne stačí ANSI. Bude tam len slovenčina. Text správy dávam do kopy v Delphi.
Prece muzes psat rovnou do streamu, ten ANSI string takhle (a pro unicode v podstate uplne stejne):
Kód: Delphi [Vybrat]
  1. fs.Write(ansi[1], Length(ansi) * StringElementsize(ansi));

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #12 kdy: 18-06-2019, 20:07:14 »
Hm, výsledok nie je správny. Ostávam pri tom čo dal Delfin. Už nebudem nad tým špekulovať.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2600
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsah súboru txt - nie je korektný
« Odpověď #13 kdy: 18-06-2019, 20:26:39 »
Hm, výsledok nie je správny. Ostávam pri tom čo dal Delfin. Už nebudem nad tým špekulovať.
No protoze to zapisujes jako Unicode a ne ANSI.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 968
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:Obsah súboru txt - nie je korektný
« Odpověď #14 kdy: 18-06-2019, 20:26:45 »
Třeba by stačilo jen tohle (jde to použít i pro ne-unicode)

Kód: Delphi [Vybrat]
  1. var
  2.   s: {$IFDEF UNICODE}TStringStream{$ELSE}TStringList{$ENDIF};
  3. begin
  4.   {$IFDEF UNICODE}
  5.   s := TStringStream.Create('-- nějaký text --');
  6.   {$ELSE}
  7.   s := TStringList.Create;
  8.   s.Text := '-- nějaký text --';
  9.   {$ENDIF}
  10.   try
  11.     s.SaveToFile(SaveDialog1.FileName);
  12.     if FileExists(SaveDialog1.FileName) then
  13.       MessageDlg('Soubor byl uložen sem'#13#10 + ExtractFilePath(SaveDialog1.FileName), mtInformation, [mbOK], 0);
  14.   finally
  15.     s.Free;
  16.   end;
  17.  
  18.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #15 kdy: 18-06-2019, 20:37:16 »
Tak som to upravil
Kód: Delphi [Vybrat]
  1. var
  2.   Contents: AnsiString;
  3. begin
  4.     Stream := TFileStream.Create(FileName, fmCreate);
  5.     Stream.Write(Contents[1], Length(Contents) * StringElementsize(Contents));
a už to je v poriadku. Ja som si myslel, že AnsiString = Unicode.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Plnoletý
  • ***
  • Příspěvků: 150
  • Karma: 8
    • Verze Delphi: XE2
Re:Obsah súboru txt - nie je korektný
« Odpověď #16 kdy: 18-06-2019, 20:53:08 »
To je pre užívateľa. Nie je to klasický log. (Na tom ešte len budem pracovať.) Kontrolujem kompletnosť údajov. Ak tam bude viac nedostatkov, tak je jednoduchšie si zobraziť/vytlačiť súbor a postupovať podľa toho. Akonáhle zavrie okno o chybách, tak nevie čo tam bolo.
Samostatny Form  s TMemo + 2 Button
do TMemo nasypat zpravu   1 tlačítko pro tisk (např FastReport)   druhé pro  "Kopirovat do schránky"

můžeš používat jako univerzální "hlásič" v celé aplikaci   

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #17 kdy: 18-06-2019, 20:57:45 »
Používam TMS TAdvTaskDialog
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Plnoletý
  • ***
  • Příspěvků: 150
  • Karma: 8
    • Verze Delphi: XE2
Re:Obsah súboru txt - nie je korektný
« Odpověď #18 kdy: 18-06-2019, 21:12:22 »
Používam TMS TAdvTaskDialog
Tak mi trochu uniká proč nepoužiješ toto a ukládaš pracně něco co uživatel bude potřebovat pouze po kontrolu aktuálního záznamu
stejně další hláška o kontrole bude na 99% odlišná 
(Když bude mít pocit že si hlášku nezapamatuje tak si ji vytiskne případně uloží a pak vyvolá )

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #19 kdy: 18-06-2019, 21:26:13 »
Používam TMS TAdvTaskDialog
Tak mi trochu uniká proč nepoužiješ toto a ukládaš pracně něco co uživatel bude potřebovat pouze po kontrolu aktuálního záznamu
stejně další hláška o kontrole bude na 99% odlišná 
(Když bude mít pocit že si hlášku nezapamatuje tak si ji vytiskne případně uloží a pak vyvolá )
Veď píšem, že to používam ;)  Ale čo má tlačidlo urobiť si už musím naprogramovať sám. To nie sú preddefinované prvky.
.

Trochu Ti ušlo, že sa jedná o kompletnú kontrolu údajov. Nekontrolujem jednotlivé záznamy. Ale väzby medzi nimi, nejaké obmedzujúce podmienky, chýbajúce údaje a nepoužité údaje. Tých chýb tam môže byť aj na celú stranu. Bez tejto kontroly sa nemôže spustiť výpočet. Okrem nezmyselných výsledkov by mi aj havaroval program.
Niektoré chyby vypisujem pomocou zostavy. Keď to píšem, tak vidím, že v tom mám poriadny chaos ::)  Budem si to musieť ujasniť.
Zostavy sú väčšinou štruktúrované a tu sa jedná od úplne jednoduchý výpis. Je tam aj tlačidlo Tlač čo dáva v podstate ten istý výsledok. Ale každý má iný spôsob práce. Niekto si to bude značiť na papieri a iný postupne vymazávať zo súboru.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Plnoletý
  • ***
  • Příspěvků: 150
  • Karma: 8
    • Verze Delphi: XE2
Re:Obsah súboru txt - nie je korektný
« Odpověď #20 kdy: 18-06-2019, 21:28:21 »
K tomu jak souvisi trida dialogu TMS (jenz bude nejspis nic vic nez obalem Windows API) pro zobrazeni dialogu s ukladanim do textoveho souboru ci dokonce kontrolou zaznamu bych zrejme potreboval zacit uzivat drogy. Takze za me uz :-X
Drogy brát určitě nemusíš  ;D
Já jsem řešil jen a jen jako zobrazení nějakého obecného hlašení
Pochopil jsem to takto:
1. Uživatel ukládá data
2. Proběhne logická kontrola dat
3. Pokud to neprojde, vygeneruje se text s popisem co je špatně a jak se to má  odstranit
4. Tento text zobrazím v čemkoliv rozumně použitelném (s možností dalších akcí)
5. Uživatele vrátím zpátky k opravě dat a k bodu číslo 1
 
Pokud to tak není  - jsem  :-X
« Poslední změna: 18-06-2019, 21:34:54 od Jirka »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4472
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #21 kdy: 18-06-2019, 21:30:27 »
Tak to aj mám. Ale už si určite z predchádzajúceho príspevku pochopil, že toto je niečo úplne iné.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 968
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:Obsah súboru txt - nie je korektný
« Odpověď #22 kdy: 18-06-2019, 22:07:30 »
Kdysi dávno jsem používal takhle jednoduchou procku
 ;)
a funguje to furt

Kód: Delphi [Vybrat]
  1. procedure WriteLine(const FName, S: string);
  2. var F: Text;
  3. begin
  4.   AsSign(F, FName);
  5. {$I-}
  6.   Append(F);
  7. {$I+}
  8.   if IoResult <> 0 then ReWrite(F);
  9.   WriteLn(F, S);
  10.   Close(F);
  11. end;
  12.  

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2600
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsah súboru txt - nie je korektný
« Odpověď #23 kdy: 18-06-2019, 22:44:24 »
Zostavy sú väčšinou štruktúrované a tu sa jedná od úplne jednoduchý výpis. Je tam aj tlačidlo Tlač čo dáva v podstate ten istý výsledok. Ale každý má iný spôsob práce. Niekto si to bude značiť na papieri a iný postupne vymazávať zo súboru.
No a proc jednoduse ten report o chybach nepodrzis nekde v pameti jako jeden dlouhy string pres nekolik radku, ktery uzivatelovi umoznis zobrazit v nejakem samostatnem okenku s (Rich)Memo? Tam si to muze prohlizet do zblbnuti. Teoreticky mu muzes jeste udelat kopii a nechat ho v tom memo text editovat=odmazavat? a kdybys na nej chtel byt extra hodny, tak jeste udelat barevnou diff projekci mezi puvodnim a soucasnym stavem.

Predpokladam, ze to nemusi byt persistenti a lidi, kteri si kazdou p*covinu tisknou, tech uz taky moc nebude - to jsou tak max. politici, kteri sice kazdy maji reprezentativni ntb, ale tisknout se pro ne tuny materialu, ktere nikdo z nich stejne necte a hlasuji, aniz by vedeli o cem na pokyn stranickych sekretariatu :-(

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 177
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Obsah súboru txt - nie je korektný
« Odpověď #24 kdy: 19-06-2019, 10:58:00 »
Citace
Kdysi dávno jsem používal takhle jednoduchou procku a funguje to furt
Základní funkcionalita Pascalu na soubory.
Dalibor (D2009 Enterprise, dřív D5Enterprise)