ďťż

Ładny brzuch

Witajcie przepraszam ze znowu truje lecz namieszalam strasznie i nie umiem sobie sama z tym poradzic dlatego prosze Was o wytkniecie mi bledow w tym kodzie i jak to mialo by wygladac fachowo.Prosze i z gory za kazda pomoc slicznie dziekuje.

private { Private declarations } public { Public declarations } type TName = packed record FName : string [20]; LName : string [20]; end; TNameFile = file of TName; TTab = array of TName; end; var Form2: TForm2; i : integer; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); var F : TNameFile; rec: TName; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); try Reset(F); Read(F, Rec); with Rec do begin ListBox1.Items.Add(FName); ListBox1.Items.Add(LName); end; finally CloseFile(f); end; end; end; procedure TForm2.Button2Click(Sender: TObject); begin ListBox1.AddItem(Edit1.Text, ListBox1); ListBox2.AddItem(Edit1.Text, ListBox2); end; procedure TForm2.Button3Click(Sender: TObject); var Tab : TTab; F : TNameFile; rec: TName; begin SetLength(Tab, ListBox1.Items.Count); for i := 0 to ListBox1.Items.Count-1 do begin Tab[i].FName := ListBox1.Items.Strings[i]; Tab[i].LName := ListBox2.Items.Strings[i]; end; AssignFile(F, SaveDialog1.FileName); Rewrite(F, 1); BlockWrite(F, Tab[0], ListBox1.Items.Count*SizeOf(TName)); CloseFile(F); end; end.



Po pierwsze, słówko w deklaracji rekordu Tname, "packed" jest zbyteczne, po drugie w procedurze Button1Click chyba zamiast:
ListBox1.Items.Add(FName); ListBox1.Items.Add(LName);
powinno być:
ListBox1.Items.Add(FName); ListBox2.Items.Add(LName);
aczkolwiek domyślam się, bo nie wiem czy to przeoczenie czy celowy zamiar. Natomiast najgorzej wygląda procedura Button3Click, proponuje zamiast BlockWrite() użyć zwykłego Write(), nie definiować dodatkowej tablicy tylko dodawać wszystko w pętli.

Zauważ, że procedura wczytująca wczyta tylko pierwszy rekord (nie wiem, może to celowe) i tak jak napisał NeVeS, w zapisie plik traktuj jako plik typowany. Bez drugiego parametru przy Rewite() oraz Samo Write() zamiast BlockWrite();

Nie wiem NeVes, czemu zbyteczne jest packed.
Użytkownik p1101 edytował ten post 03 luty 2007, 14:28

Nie wiem NeVes, czemu zbyteczne jest packed.
'packed' - jest zbyteczne ponieważ w komuterach klasy PC zawsze czy byśmy napisali packed czy nie, kompilator i tak potraktuje kod jakby tam pisało packed.




'packed' - jest zbyteczne ponieważ w komuterach klasy PC zawsze czy byśmy napisali packed czy nie, kompilator i tak potraktuje kod jakby tam pisało packed.
Nie zgodzę się z tym. Domyślnie kompilator rozmiar rekordu wyrównuje do wielokrotności największego z typów rekordu. Przykładowo rekord z pól Integer i Word zdawałoby się, że zjamuje 6 bajtów, tymczasem Bedzie zajmował 8, po dodaniu np string[3] będzie zjamował nie 10 a 12. Sprawdź sobie SizeOf'em. To optymalizacja ze strony kompilatora - dostęp jest szybszy, jednak rekord zajmuje więcej w pamięci. Rekord połączony z packed zajmuje dokładnie tyle miejsca ile wynika z sumy pól. Tak wiec rekord z integer i word będzie zajmował 6 bajtów.

W sumie zwykły kompromis szybkość <-> rozmiar. Wybór należy do programisty, ale nie jest obojętne czy napiszemy packed czy nie.
Użytkownik p1101 edytował ten post 03 luty 2007, 15:09
Przedewszystkim Dziekuje Wam za pomoc, lecz jeszcze cos robie zle z tym zapisem usunelam tabliece, program co prawda sie uruchomi ale sie wyklada przy nacisnieciu buttona ktory ma sluzyc do zapisu Delphi podswietla linie z write. Oto moje to cos :-(
Prosze zerknijcie jeszcze raz na to

type TName = packed record FName : string [20]; LName : string [20]; end; TNameFile = file of TName; end; var Form2: TForm2; implementation {$R *.dfm}

procedure TForm2.Button3Click(Sender: TObject); var F : TNameFile; rec: TName; i: integer; begin AssignFile(F, SaveDialog1.FileName); Rewrite(F); for i := 0 to ListBox1.Items.Count-1 do begin rec.FName := ListBox1.Items.Strings[i]; rec.LName := ListBox2.Items.Strings[i]; end; Write(F, rec); CloseFile(F); end;


Nie wiem NeVes, czemu zbyteczne jest packed. Czyli najprościej: każdy string[20] zajmie 21 bajtów i tu kompilator nie ma pola do popisu :P


W sumie zwykły kompromis szybkość <-> rozmiar. Wybór należy do programisty, ale nie jest obojętne czy napiszemy packed czy nie. Ma to sens głównie w aplikacjach sieciowych, gdzie liczy się szybkość przesyłania danych, a mniej obliczeń :)

aagness, błąd polega na tym, ze w pętli przypisujesz dane do rekordu, ale zapis wykonujesz poza pętlą, wynikiem czego zapisywany jest tylko ostatni Item z TListBox'ów. Brakuje również polecenia Seek();

procedure TForm2.Button3Click(Sender: TObject); var F : TNameFile; rec: TName; i: integer; begin AssignFile(F, SaveDialog1.FileName); try Rewrite(F); for i := 0 to ListBox1.Items.Count-1 do begin Seek(F, FileSize(F)); //ustawiamy się zawsze na końcu pliku rec.FName := ListBox1.Items[i]; rec.LName := ListBox2.Items[i]; Write(F, rec); //zapis end; finally CloseFile(F); end; end;

Rzeczywiście mój błąd, w Delphi packed nie jest domyślnie "aktywowany", natomiast w TP 7.0 jest tak jak napisałem i stąd się wzięły moje błędne przypuszczenia.

Macie moze młotek wolny na stanie przydal by mi sie, moze w tedy wejdzie mi cos do glowy zrobilam wszystko jak mowilscie, przeszukalam google i ksiazki ktore mam lecz nadal jest cos nie tak, przyklad zrobilam tak jak podal p1101, przekładałam to na wszystkie sposoby jakie w padly mi do tej pustej glowy i co? i nic :-(

Jesli zapisane jest to jak podal p1001 program odpala ale gdy wciskam button wyskakuje taki blad
First chance exception at $7C81EB33. Exception class EInOutError with message 'I/O error 6'. Process Project1.exe (2108)
i podswietla linijke z seek, pomozecie jeszcze raz? Prosze

bo p1101 popelnil blad, rewrite usuwa zawartosc pliku i wtedy nie mozna uzyc seek. powinno byc reset :)
Użytkownik Deadeye edytował ten post 03 luty 2007, 19:14

bo p1101 popelnil blad, rewrite usuwa zawartosc pliku i wtedy nie mozna uzyc seek. powinno byc reset :)
Nie zamierzam podwarzac tego co napisales i tez dziekuje lecz wlasnie chodzi mi o zapis z ListBoxow do pliku(rekordu)
a z tego co wyczytalam rewrite otwiera plik i usuwa jego stara zawartosc wiec chyba nie tu tkwi problem.

Sorki zamieszcze jeszcze raz ten kawalek kodu bo moze blad jest gdzie indziej sama juz nie wiem - jestem w fazie czarnej rozpaczy rewrite tez zmienilam jak kolega wyzej mowil na reset ale tez byl ten sam problem

private { Private declarations } public { Public declarations } type TName = packed record FName : string [20]; LName : string [20]; end; TNameFile = file of TName; end; var Form2: TForm2; implementation {$R *.dfm}

procedure TForm2.Button3Click(Sender: TObject); var F : TNameFile; rec: TName; i: integer; begin AssignFile(F, SaveDialog1.FileName); try Rewrite(F); for i := 0 to ListBox1.Items.Count-1 do begin Seek(F, FileSize(F)); rec.FName := ListBox1.Items[i]; rec.LName := ListBox2.Items[i]; Write(F, rec); //zapis end; finally CloseFile(F); end; end; end.

napisalem juz ze tak nie moze byc :D seek mozesz uzywac tylko po otwarciu pliku poprzez reset. jak juz bardzo chcesz tak zrobic to
try Rewrite(F); CloseFile(F); Reset(F); for i := 0 to ListBox1.Items.Count-1 do begin Seek(F, FileSize(F)); rec.FName := ListBox1.Items[i]; rec.LName := ListBox2.Items[i]; Write(F, rec); //zapis end; finally CloseFile(F);
ale to jest nieco absurdalne, przeciez tam nigdzie sie nie cofasz w pliku, wiec wystarczy zapisac bez seeka
try Rewrite(F); for i := 0 to ListBox1.Items.Count-1 do begin rec.FName := ListBox1.Items[i]; rec.LName := ListBox2.Items[i]; Write(F, rec); //zapis end; finally CloseFile(F);
Użytkownik Deadeye edytował ten post 03 luty 2007, 23:45
Zrobilam jak mowiles Wiem ze wszyscy mi dobrze radzice ale nie wiem gdzie wciarz zrobilam blad, patrzylam moze jakas zwykla literowka ale nie, zrobilam jak mowiles to znow po kliknieciu na button zaznaczyl linie jak wczesniej z wrie i tak w kolko idzie zwariowac, przepisalam wszystko od nowa i dalej to samo :-(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
tak czy tak bardzo Wam dziekuje i zapraszam na lampke dobrego wina.

podaj caly kod z tym co teraz zmienilas, to zobaczymy :) wina chetnie skosztuje, powiedz tylko gdzie i kiedy ;)

Dziekuje oto on ponizej: a co do wina to jak najszybciej bo zaraz przez to zwariuje :-) ale jak prawie nie pije to teraz wypilabym chyba cala butelke :-)

unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; ListBox1: TListBox; ListBox2: TListBox; Button2: TButton; OpenDialog1: TOpenDialog; Button3: TButton; SaveDialog1: TSaveDialog; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } type TName = packed record FName : string [20]; LName : string [20]; end; TNameFile = file of TName; end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); var F : TNameFile; rec: TName; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); try Reset(F); Read(F, Rec); with Rec do begin ListBox1.Items.Add(FName); ListBox1.Items.Add(LName); end; finally CloseFile(f); end; end; end; procedure TForm2.Button2Click(Sender: TObject); begin ListBox1.AddItem(Edit1.Text, ListBox1); ListBox2.AddItem(Edit2.Text, ListBox2); end; procedure TForm2.Button3Click(Sender: TObject); var F : TNameFile; rec: TName; i: integer; begin AssignFile(F, SaveDialog1.FileName); try Rewrite(F); for i := 0 to ListBox1.Items.Count-1 do begin rec.FName := ListBox1.Items[i]; rec.LName := ListBox2.Items[i]; Write(F, rec); //zapis end; finally CloseFile(F); end; end; end.

Zmodyfikowałem niznacznie kod, poszgeólne procedury realizują:
Button1Click- wywołanie okienko odczytu, wczytanie wszystkich rekordów i dodanie do list;
Button2Click - dodanie po jedej pozycji do list;
Button3Click - wywołanie okienka zapisu, zapisanie zawartosci list do pliku;
Wydaje mi sie że o to chodziło, jednak następnym razem przydałoby się napisać też przy okazji co ten program ma robić.
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; ListBox1: TListBox; ListBox2: TListBox; Button2: TButton; OpenDialog1: TOpenDialog; Button3: TButton; SaveDialog1: TSaveDialog; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TName = packed record FName : string [20]; LName : string [20]; end; TNameFile = file of TName; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); var F : TNameFile; rec: TName; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); try Reset(F); while not eof(f) do Begin Read(F, Rec); ListBox1.Items.Add(rec.FName); ListBox2.Items.Add(rec.LName); End; finally CloseFile(f); end; end; end; procedure TForm2.Button2Click(Sender: TObject); begin ListBox1.AddItem(Edit1.Text, ListBox1); ListBox2.AddItem(Edit2.Text, ListBox2); end; procedure TForm2.Button3Click(Sender: TObject); var F : TNameFile; rec : TName; i : integer; begin if SaveDialog1.Execute then Begin AssignFile(F, SaveDialog1.FileName); try Rewrite(F); for i := 0 to ListBox1.Items.Count-1 do begin rec.FName := ListBox1.Items[i]; rec.LName := ListBox2.Items[i]; Write(F, rec); end; finally CloseFile(F); End; end; end; end.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •