Forum Delphi.cz

Delphi => Obecné => Téma založeno: Stanislav Hruška 18-06-2019, 14:59:00

Název: Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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?
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Morrison 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.)
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: pf1957 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
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Jirka 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 ..
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: pf1957 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?
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 18-06-2019, 18:34:59
Fajn, to posledné mi funguje ako má.
Ďakujem.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: pf1957 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));
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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ť.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: pf1957 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.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: JaroB 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.  
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Jirka 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   
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 18-06-2019, 20:57:45
Používam TMS TAdvTaskDialog
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Jirka 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á )
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Jirka 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
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Stanislav Hruška 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é.
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: JaroB 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.  
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: pf1957 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 :-(
Název: Re:Obsah súboru txt - nie je korektný
Přispěvatel: Faltynek 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.