Filesize – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Filesize – Delphi – Fórum – Programujte.comFilesize – Delphi – Fórum – Programujte.com

 

oxidián0
Grafoman
29. 5. 2017   #1
-
0
-

Proč mi to ukazuje velikost souboru 3, když v souboru jsou textové data?

  if not fileexists(dir+'uc_heb.ini') then exit;
  try
    assignfile(f,dir+'uc_heb.ini');
    reset(f);
  except
    showmessage('Nelze otevrit soubor .ini s nastavenim.');
  end;
  size := filesize(f);
  if filesize(f)<10 then
     begin
     showmessage('Soubor .ini neobsahuje text. '+ inttostr(size) );
     exit;
     end;
Nahlásit jako SPAM
IP: 78.102.61.–
Jerry
~ Anonymní uživatel
504 příspěvků
29. 5. 2017   #2
-
0
-

#1 oxidián
mám pocit, že za reset se u binárního souboru musí dát velikost přenosového bloku

jinak je tam 128. Takže velikost tvého souboru je 128x3  bytů. asi ... :) možná

http://home.pf.jcu.cz/~edpo/program/kap09.html

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:2cb2:...–
oxidián0
Grafoman
29. 5. 2017   #3
-
0
-

A ten filesize určuje velikost souboru tím že čte data? Já bych od takové funkce očekával, že bude číst razítko.

Našel jsem toto:

Because text files are normally variable in length, the number of records is not so useful. Use the low level routine GetFileSize to get the size in bytes, or FindFirst, FindNext routines, which return size and last modified date values of one or more files.

Jenže návod k funkci GetFileSize jsem nenašel.

size := GetFileSize (f);

vrací chybu: nekompatibilní typy Cardinal a Text

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
29. 5. 2017   #4
-
0
-

#3 oxidián
to bude zas nějaká maličkost hod verzi

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
29. 5. 2017   #5
-
0
-

#2 Jerry
velikost přenosového bloku nemá s filesize nic společného

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
29. 5. 2017   #6
-
0
-

Víš, co dořešíme to spíš později, snad zítra; zatím jsem tam nechal velikost bloku <1. Dneska chci dělat menu, ukládání voleb do souboru a pak potřebuju pořešit jak uložit do paměti data načtené ze souboru. Menu Učebnice jsem přejmenoval na Testy. Pod každým jazykem budu asociovat složku v adresáři testy.

Např. langHebrew1 (tj. název menuItem načtený z textového souboru); biblická hebrejština (tj. název složky); pointer na objekt TMenuItem;

Takže tohle by měl být asi nějaký typ, např. TTest; A pak budu muset definovat pole o velikosti 13*size(TTest)...

Jo, akorád že nevím jak v delphi definovat takovou strukturu TTest...

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
29. 5. 2017   #7
-
0
-

#6 oxidián

normálně array [13] of TTest

jinak nevím jestli D7 už umí TIniFile, to umí strukturovat

[sekce]
key=hodnota
key2=hodnota2

[sekce2]
key=hodnota
keyX=hodnota

na ukládání nastavení ideální

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
29. 5. 2017   #8
-
0
-

A jak deklarovat tu strukturu TTest? Tohle je seznam těch menu Item:

langHebrew1
langGreek1
langLatin1
langKJEnglish1
langAncient1
modernOther1
modernHebrew1
modernGreek1
modernEnglish1
modernGerman1
modernFrench1
modernSpanish1


a pak je k tomu ještě odpovídající

SelectlangHebrew1
SelectlangGreek1
SelectlangLatin1
SelectlangKJEnglish1
SelectlangAncient1
SelectmodernOther1
SelectmodernHebrew1
SelectmodernGreek1
SelectmodernEnglish1
SelectmodernGerman1
SelectmodernFrench1
SelectmodernSpanish1

což je submenu ke každé MenuItem...

Už jsem něco našel.

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
29. 5. 2017   #9
-
0
-

Mám to takhle, ale je to tak OK? Když pointer nijak nedeklaruje typ něco jako Pointer of TMenuItem; bych očekvával...

type
   TCustomer = record
     menuItemStr : string[16];
     selectSubmenuStr  : string[22];
     menuPtr : Pointer;
     selectMenusubmenuPtr : Pointer;
   end;


Nebo spíš takto:

type PMenuItem = ^TMenuItem;
type
   TCustomer = record
     menuItemStr : string[16];
     selectSubmenuStr  : string[22];
     menuPtr : PMenuItem;
     selectMenusubmenuPtr : PMenuItem;
   end;


Ono je to podobné jak v C jenže s C jsem už dlouho nedělal, takže se mi to vykouřilo z hlavy.

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
29. 5. 2017   #10
-
0
-

Aktuálně:

type PMenuItem = ^TMenuItem;
type
   TSubmenuItems = record
     name: string[16]; // název menu, slouží pro identifikaci záznamů v souboru ini
     folder  : string[22];
     language: string[40]; // language to learn
     menuPtr : PMenuItem;
     selectMenusubmenuPtr : PMenuItem;
     foldersFound: boolean;
   end;

implementation

const maxTestFolders = 13;
var     submenuItems: array[0..maxTestFolders] of TSubmenuItems;
procedure TForm1.FormCreate(Sender: TObject);
begin
submenuItems[0].name := 'test';
...
Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
29. 5. 2017   #11
-
0
-

#9 oxidián
taková drobnost, to menu by se dalo asociovat na názvy subadresářů a souborů

Struktura dir třeba:

Program path
         \Testy
               \lang
                    \Hebrew1
                    \Greek1

                       ....

      
               \modern
                    \Hebrew1
                    \Greek1

                       ....

neními jasné co chceš řešit těma pointerama na menuItems. už jsi to jednou zkoušel a něšlo to, opakuješ chyby.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
29. 5. 2017   #12
-
0
-

#10 oxidián
nechápu co tam maj dělat ty pointery, podle mě sjou zbytečný, nemůžeš ukládat pointery do souboru a pak je načíst a použít, program ty data může mít pokaždé jinde a musíš pro ně alokovat paměť, navíc dynamicky itemysubmenu už jsme řešily můsí se přidávat přes ADD

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
29. 5. 2017   #13
-
0
-

ad#11 - tak nějak to chci, ale nechci dělat moc hluboké zakořenění. V menu vybereš nejdříve jazyk, resp. skupinu. Pak klikneš na vybrat (vnořené menu), vybereš složku, pak se projde složka a každý adresář se vypíše do menu... Tam mají být autoři testů... Dále tam mají být okruhy testů, takže do menu Okruhy se vypíšeou položky menu vnořených adresářů. Vybereš si okruh, a pak z této složky se budou dělat testy.

Dneska mám dost, takže zítra musím udělat přiřazení těch submenu...

No pointery nemůžu uložit do souboru. Během načítání se vytvoří menu položky a pak ty pointery budou ukazovat na ty menu položky.

Nahlásit jako SPAM
IP: 78.102.61.–
JoDiK
~ Anonymní uživatel
987 příspěvků
30. 5. 2017   #14
-
0
-

#1 oxidián
A co si takhle přečíst nápovědu, kde je jasně napsáno, že FileSize nefunguje pro textové soubory?

FileSize je velikost typového souboru v položkách, textový soubor nemá položky...

Viz například zde: https://www.trsek.com/pascal/FileSize

Nahlásit jako SPAM
IP: 88.103.236.–
oxidián0
Grafoman
30. 5. 2017   #15
-
0
-

#14 JoDiK
Tak jste četl jinou nápovědu než já a tam je to napsáno jinak.

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
30. 5. 2017   #16
-
0
-

Aktuální problém - během procházení adresáře dostávám hlášku:

Incompatible types: Cardinal and TSearchRec

var SearchRecord : TSearchRec;
    FilesTmpI : integer;
begin
FilesTmpI := FindFirst('c:\files\data\*', faDirectory, SearchRecord);
while FilesTmpI = 0 do
      begin
        ListBox1.Items.Add(SearchRecord.Name);
        FilesTmpI := FindNext(SearchRecord);
      end;
FindClose(SearchRecord);
end;

Chyba na řádku kde je FindClose.
 

A ještě dotaz: jde v D7 nějak elegantně zarovnávat kód? Podobně jako ve Wordu nebo jinde, že na označený kód zmáčknu tab nebo shift+tab, ale tyto zkratky na to v D7 nefungují. Dělám to manuálně a je to pracné.

Nahlásit jako SPAM
IP: 78.102.61.–
30. 5. 2017   #17
-
0
-

Co se týče nápovědy. U C++ Builderu a Delphi už za Borlandu byl bordel v dokumentaci. Embarcadero to trochu spravilo, ale i tak tento nedostatek přetrvává. Jestli něco vyčetl přímo z dokumentace Delphi, tak měl za to, že je to pravda a neměl důvod to hledat jinde.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
30. 5. 2017   #18
-
0
-

#16 oxidián
netestuješ náhodou prázdnej adresář? to by se ti nejspíš Searchrec nevytvořil, lepší použít tuhle konstrukci z manuálu:

http://www.delphibasics.co.uk/RTL.asp?Name=tsearchrec

když se na to podíváš všimneš si, že findclose je uvnitř podmínky findfirst(..)=0

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
30. 5. 2017   #19
-
0
-

Je tam jeden adresář.

Aha, takže ten výsledek Integer slouží ke kontrole cyklu... Dobrý už to chápu.

Ale stále to nejede.

list := TStringList.create();
for i:=0 to maxTestFolders-1 do
  begin;
    if submenuItems[i].foldersFound=false then
      break;
    list.clear;
    if FindFirst(testyDir, faDirectory, SearchRecord) = 0 then
      begin
        repeat list.add(SearchRecord.Name);
        until FindNext(SearchRecord)<>0;
        FindClose(SearchRecord);
      end;


stejná chyba. To ani nezkompiluje takže jestli je adresář prázdný nehraje roli.

Nahlásit jako SPAM
IP: 78.102.61.–
Sniper
~ Anonymní uživatel
215 příspěvků
30. 5. 2017   #20
-
+1
-
Zajímavé

Máš blbě řazený jednotky v uses. Volá se FindClose z jednotky Windows místo ze SysUtils, a ta očekává handle, což je v D7 cardinal.

Takže buď si oprav pořadí (SysUtils musí být ZA Windows, http://www.delphibasics.co.uk/RTL.asp?Name=Uses), nebo to uprav na SysUtils.FindClose(...).

Nahlásit jako SPAM
IP: 92.240.176.–
oxidián0
Grafoman
30. 5. 2017   #21
-
0
-

Tak na to bych sám nepřišel. Dík

Nahlásit jako SPAM
IP: 78.102.61.–
Sniper
~ Anonymní uživatel
215 příspěvků
30. 5. 2017   #22
-
0
-

To nejsi sám   

Když jsem začínal, tak mi precedence unit taky pěkně zatápěla. Od tý doby jde jednotka Windows vždycky na úplnej začátek, a je klid.

Nahlásit jako SPAM
IP: 92.240.176.–
JoDiK
~ Anonymní uživatel
987 příspěvků
31. 5. 2017   #23
-
0
-

#15 oxidián
Můžeš prosím ukázat (odchytit obrazovku, dát odkaz) ve které nápovědě jsi to viděl jinak? Fakt mě to zajímá, díky...

Nahlásit jako SPAM
IP: 88.103.236.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý