delphi a TFIleStrem

Programovacie jazyky, rady, poradňa...
caesar1987
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3001
Registrovaný: 02 okt 2005, 0:57
Bydlisko: Nové Zámky
Kontaktovať používateľa:

delphi a TFIleStrem

Príspevok od používateľa caesar1987 »

Cavte... Kde tu robim chybu??
snazim sa zapisovat cez tfilestream a potom citat..

Kód: Vybrať všetko

procedure TZoo.Uloz(subor: string);
var
  i,j: integer;
  k: integer;
  f: TFileStream;
  priat: string;
begin
  if not FileExists(subor) then
    f:= TFileStream.Create(subor, fmCreate)
  else
    f:= TFileStream.Create(subor, fmOpenReadWrite);
  for i := Low(TPocet) to High(TPocet) do
    if z[i] <> nil then
    begin
    priat:= '';
      f.Write(z[i].x, sizeof(integer));
      f.Write(z[i].y, sizeof(integer));
      k:= length(z[i].meno);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].meno[J], sizeof(char));
      k:= length(z[i].foto);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].foto[J], sizeof(char));
      k:= length(z[i].popis);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].popis[J], sizeof(char));
      k:= length(z[i].lok);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].lok[J], sizeof(char));
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].druh[J], sizeof(char));
      for j:= low(TPocet) to high(TPocet) do
      begin
        if (j in z[i].priatelia) then
        begin
         priat:= priat + inttostr(i) + ',';
        end;
      end;
      k:= length(priat);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (priat[J], sizeof(char));
    end;
  f.Free;
end;


procedure TZoo.Nacitaj(subor: string);
var
  f: TFileStream;
  meno, foto, popis, lok, druh, priat: string;
  x,y: integer;
  i: integer;
  j:integer;
begin
if FileExists(subor) then     //ak zvieratka uz na mape su
begin
  pocet:= 0;
  f:= TFileStream.Create(subor, fmOpenRead);
  f.Position:= 0;
  while f.Position < f.Size do
  begin
    inc(pocet);
    f.Read(x, sizeOf(integer));
    f.Read(y, sizeOf(integer));
    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(meno[j], sizeof(char));
    f.Read(i, sizeOf(integer));                 //CHYBA
    for j:= 1 to i do
    f.Read(foto[j], sizeof(char));
    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(popis[j], sizeof(char));
    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(lok[j], sizeof(char));
    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(druh[j], sizeof(char));
    PridajZvieratko(x,y,meno, foto, popis, lok, druh, pocet);

    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(priat[j], sizeof(char));
    PridajPriatela(pocet, priat);


  end;
end
else //ak nie su
begin
  f:= TFileStream.Create(subor, fmCreate);
end;

  f.Free;
end;
pri citani mi to hadze sialene icko... uz pri tom druhom - zviraznenom.. kde robim chybu???
ps: pri tom prvom to je ok to icko, ten string to uz neviem...

dikes
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

i je riadiaca premenná cyklu. Ten cyklus máš od j:=1 to i a preto je to cyklus s pevným počtom opakovaný. Vovnútri tohto cyklu nemôžeš meniť i.

kódy dávaj do code, takto je to neprehladné
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

audiotrack napísal:i je riadiaca premenná cyklu. Ten cyklus máš od j:=1 to i a preto je to cyklus s pevným počtom opakovaný. Vovnútri tohto cyklu nemôžeš meniť i.

kódy dávaj do code, takto je to neprehladné
preco by nemohol menit i? to ze to kvoli tomu zblbne je jedna vec, ale urcite moze
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

mastermind napísal:preco by nemohol menit i? to ze to kvoli tomu zblbne je jedna vec, ale urcite moze
kompilátor to nevezme, vypíše práve tu chybu čo vypisuje jemu.
caesar1987
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3001
Registrovaný: 02 okt 2005, 0:57
Bydlisko: Nové Zámky
Kontaktovať používateľa:

Príspevok od používateľa caesar1987 »

i sa v cykle nemeni.. i sa znovi nacitava az po jeho zbehnuti, nakolko tam neni begin a end, tak to berie len ten riadok pod nim... mna trapi to ze mi to nacitava namiesto napr cisla 11 nejake 6 mieste cisla...
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

audiotrack napísal:kompilátor to nevezme, vypíše práve tu chybu čo vypisuje jemu.
kompilator??? ved by to ani nespustil. Zrejme ma nejaku chybu v subore, mozno logicku chybu ale to icko moze pokojne zmenit.
caesar1987
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3001
Registrovaný: 02 okt 2005, 0:57
Bydlisko: Nové Zámky
Kontaktovať používateľa:

Príspevok od používateľa caesar1987 »

spustit to spustim, ale len vtedy, ak neexistuje subor, z ktoreho ma nacitavat.. :D

takze ano, niekde v subore - jeho vytvarani alebo nacitavani je chyba...
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

beriem spat. toto je delphi. vzdy som zasol preco zvolili niektore implemetacie blokov tak ako zvolili. Nemam rad ked ma programovaci jazyk nejako obmedzuje. A toto obmedzenie urcite je.
juho
Star
Star
Používateľov profilový obrázok
Príspevky: 551
Registrovaný: 11 máj 2007, 21:16

Re: delphi a TFIleStrem

Príspevok od používateľa juho »

caesar1987 napísal:Cavte... Kde tu robim chybu??
snazim sa zapisovat cez tfilestream a potom citat..
a vies co ty vlastne tam zapisujes?skus skopcit cely zdrojak....
caesar1987
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3001
Registrovaný: 02 okt 2005, 0:57
Bydlisko: Nové Zámky
Kontaktovať používateľa:

Príspevok od používateľa caesar1987 »

Kód: Vybrať všetko

unit ZooUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, ComCtrls, Menus;


type
  TPocet= 1..100;

  TZvieratko = class
    meno: string;
    foto: string;
    popis: string;
    lok: string;
    druh: string;
    x, y: integer;
    priatelia: set of TPocet;  //array[TPocet]of TZvieratko;
    constructor Create();//(m,f,p,l,d: string; x1,y1: integer);
  end;

  TZoo = class
  private
    z: array[TPocet] of TZvieratko;
    mapa,dvojka: TImage;
    pocet: integer;  //pocet zvieratiek
    sfile: string;
  public
    constructor Create(image, image2: TImage; subor: string);
    procedure Kliknutie(x,y: integer; PraveTlacidlo: boolean);
    procedure ZobrazZvieratko(ktore: integer);
    procedure PridajZvieratko(x,y: integer; meno, foto, popis, lok, druh: string; cislo:integer);
    procedure Nacitaj(subor: string);
    procedure PridajPriatela(komu:integer; priatelia:string);
    procedure Uloz(subor: string);
    procedure Vykreli;
    function JeZvieratko(x, y:integer): integer;

  end;


implementation

{TZvieratko}
constructor TZvieratko.Create();//(m,f,p,l,d: string; x1,y1: integer);
begin
  meno:= 'm';
  foto:= 'f';
  popis:= 'p';
  lok:= 'l';
  druh:= 'd';
  x:= 0;
  y:= 0;
  priatelia:=[];
end;

{TZoo}


//ahoj zoo
constructor TZoo.Create(image, image2: TImage; subor: string);
var
  i: integer;
begin
  dvojka:= image2;
  mapa:= image;
  for i := Low(TPocet) to High(TPocet) do
    z[i] := nil;
  pocet:= 0;
  sfile:= subor;
  Nacitaj(subor);
  PridajZvieratko(10,10,'papagaj','papagaj.jpg','hmmm','afrika','vtak',1);
  Uloz(sfile);
  Vykreli;
end;

//tuk tuk na mapke
procedure TZoo.Kliknutie(x,y:integer; PraveTlacidlo: boolean);
var
  a: integer;
begin
  a:= JeZvieratko(x,y);
  if PraveTlacidlo then
  begin
    if a <> 0 then
      ZobrazZvieratko(a);
  end
  else
  begin
    if a = 0 then
      //PridajZvieratko(x,y)           otori sa nieco a prida sa zvieratko
    else
    ShowMessage('Tu už zvieratko žije. Skús pridať nové zvieratko kúsok od neho.');
  end;
end;

//info o zvieratku
procedure TZoo.ZobrazZvieratko(ktore: integer);
begin
//
end;

//nove zvieratko
procedure TZoo.PridajZvieratko(x,y: integer; meno, foto, popis, lok, druh: string; cislo:integer);
begin
  if z[cislo]= nil then
    z[cislo]:= TZvieratko.Create();
  z[cislo].x:= x;
  z[cislo].y:= y;
  z[cislo].meno:= meno;
  z[cislo].foto:= foto;
  z[cislo].popis:= popis;
  z[cislo].lok:= lok;
  z[cislo].druh:= druh;
end;

//a zvieratko sa zrodilo
procedure TZoo.Nacitaj(subor: string);
var
  f: TFileStream;
  meno, foto, popis, lok, druh, priat: string;
  x,y: integer;
  i: integer;
  j:integer;
begin
if FileExists(subor) then     //ak zvieratka uz na mape su
begin
  pocet:= 0;
  f:= TFileStream.Create(subor, fmOpenRead);
  f.Position:= 0;
  while f.Position < f.Size do
  begin
    inc(pocet);
    f.Read(x, sizeOf(integer));
    f.Read(y, sizeOf(integer));
    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(meno[j], sizeof(char));
    //f.Read(meno, i);
    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(foto[j], sizeof(char));
    //f.Read(foto, i);
    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(popis[j], sizeof(char));
    //f.Read(popis, i);
    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(lok[j], sizeof(char));
    //f.Read(lok, i);
    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(druh[j], sizeof(char));
    //f.Read(druh, i);
    PridajZvieratko(x,y,meno, foto, popis, lok, druh, pocet);

    f.Read(i, sizeOf(integer));
    for j:= 1 to i do
    f.Read(priat[j], sizeof(char));
    //f.Read(priat, i);
    PridajPriatela(pocet, priat);


  end;
end
else //ak nie su
begin
  f:= TFileStream.Create(subor, fmCreate);
end;

  f.Free;
end;

procedure TZoo.PridajPriatela(komu:integer; priatelia:string);
var
  i: integer;
  s: string;
begin
  i:= 1;
  s:='';
  while i <= length(priatelia) do
  begin
  if priatelia[i] = ',' then
  begin
    z[komu].priatelia:= z[komu].priatelia + [strtoint(s)];
    s:= '';
  end
  else
    s:= s+ priatelia[i];
  inc(i);
  end;
end;

//ulozenie so suboru
procedure TZoo.Uloz(subor: string);
var
  i,j: integer;
  k: integer;
  f: TFileStream;
  priat: string;
begin
  if not FileExists(subor) then
    f:= TFileStream.Create(subor, fmCreate)
  else
    f:= TFileStream.Create(subor, fmOpenReadWrite);
  for i := Low(TPocet) to High(TPocet) do
    if z[i] <> nil then
    begin
    priat:= '';
      f.Write(z[i].x, sizeof(integer));
      f.Write(z[i].y, sizeof(integer));
      k:= length(z[i].meno);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].meno[J], sizeof(char));
      //f.Write(z[i].meno, k);
      k:= length(z[i].foto);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].foto[J], sizeof(char));
      //f.Write(z[i].foto, k);
      k:= length(z[i].popis);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].popis[J], sizeof(char));
      //f.Write(z[i].popis, k);
      k:= length(z[i].lok);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].lok[J], sizeof(char));
      //k:= length(z[i].lok);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (z[i].druh[J], sizeof(char));
      //f.Write(z[i].druh, k);
      for j:= low(TPocet) to high(TPocet) do
      begin
        if (j in z[i].priatelia) then
        begin
         priat:= priat + inttostr(i) + ',';
        end;
      end;
      k:= length(priat);
      f.Write(k, sizeof(integer));
      for j:= 1 to k do
        f.write (priat[J], sizeof(char));
      //f.Write(priat, k);
    end;
  f.Free;
end;


procedure TZoo.Vykreli;
var
  i: integer;
  x,y: integer;
  m: TBitmap;
begin
  m:= TBitmap.Create;
  m.LoadFromFile('mapa.bmp');
  mapa.Canvas.Draw(0,0,m);
  for i := Low(TPocet) to High(TPocet) do
    if z[i] <> nil then
    begin
      x:= z[i].x;
      y:= z[i].y;
      mapa.Canvas.MoveTo(x-5, y-5);
      mapa.Canvas.Brush.Color:= clred;
      mapa.Canvas.pen.Color:= clYellow;
      mapa.Canvas.Ellipse(x-5, y-5, x+5, y+5);

      //tu bude este linteto priatelia
    end;
end;



//hmm, zije tam zviera???
function TZoo.JeZvieratko(x,y:integer):integer;
var
  i:integer;
begin
  Result:= 0;
   for i := Low(TPocet) to High(TPocet) do
    if z[i] <> nil then
    begin
      if (z[i].x <= (x+5)) and (z[i].x >= (x-5)) and (z[i].y <= (y+5)) and (z[i].y >= (y-5)) then
        Result:= i;
    end;
end;

end.
tu je uplne cely.. a ak chcete,t ak tu je aj cely program
Prílohy
Zvieratka.rar
zvieratka na mape
(799.94 KiB) 50 stiahnutí
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ja osobne by som buď:
1. urobil funkcie na načítanie Integer, String... zo streamu (a to isté aj na zápis to streamu)
2. použil TReader, TWriter
3. alebo niečo iné, ale Delphi som naposledy používal už dosť dávno, takže sa nepamätám na všetky úžasné vlastnosti a funkcie :)

// chrono: Na môj vkus je to dosť neprehľadné. Skôr, ako by som tam našiel nejakú chybu, by som to napísal znovu. Ak si dopre pamätám, existuje nejaká funkcia/trieda, ktorá umožňuje ukladanie/načítavanie štruktúr do/zo súborov (a možno aj tried)
caesar1987
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3001
Registrovaný: 02 okt 2005, 0:57
Bydlisko: Nové Zámky
Kontaktovať používateľa:

Príspevok od používateľa caesar1987 »

no tak budem musiet nievo vymysliet.. ale asi sa nba to vykaslem a spravim to vsetko cez chary...
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Odporúčam ti urobiť si tie pomocné funkcie alebo použiť TReader/TWriter.
caesar1987
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3001
Registrovaný: 02 okt 2005, 0:57
Bydlisko: Nové Zámky
Kontaktovať používateľa:

Príspevok od používateľa caesar1987 »

o tom treader a twriter som este ani nepocul.. o com tam ide??
juho
Star
Star
Používateľov profilový obrázok
Príspevky: 551
Registrovaný: 11 máj 2007, 21:16

Príspevok od používateľa juho »

caesar1987 napísal:o tom treader a twriter som este ani nepocul.. o com tam ide??
delphi je odvodene hlavne od pascalu
tot je z napovedy, najlepsie bude ak si pozres napovedu:

Kód: Vybrať všetko

type
  PhoneEntry = record
    FirstName, LastName: string[20];
    PhoneNumber: string[15];
    Listed: Boolean;
  end;
  PhoneList = file of PhoneEntry;
potom read.alebo tak nejak to bolo.
inak to s tym zvieratkom mas objekt? moze sa to tak zapisovat? lebo tam nemas public: ....
zda sa mi to nejak moc rozpisane , co ak by si nacital te vsetky premenne co su v tom z[array of zvieratko] a potom to ulozil cele naraz. A a zo suboru cital tak isto
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

caesar1987 napísal:o tom treader a twriter som este ani nepocul.. o com tam ide??
Tu je ukážka z jedného môjho starého programu:

Kód: Vybrať všetko

procedure TMainForm.SaveItems(AFileName: String);
var
  Stream: TFileStream;
  Writer: TWriter;
  i: Integer;

begin
  if AFileName = '' then exit;
  Stream := TFileStream.Create(AFileName, fmCreate);
  try
    Writer := TWriter.Create(Stream, 1024);
    try
      for i := 0 to Length(Items) - 1 do
      begin
        Writer.WriteString(Items[i].Question);
        Writer.WriteString(Items[i].Answer1);
        Writer.WriteString(Items[i].Answer2);
        Writer.WriteString(Items[i].Answer3);
        Writer.WriteString(Items[i].Answer4);
        Writer.WriteBoolean(Items[i].Answer1Ok);
        Writer.WriteBoolean(Items[i].Answer2Ok);
        Writer.WriteBoolean(Items[i].Answer3Ok);
        Writer.WriteBoolean(Items[i].Answer4Ok);
        Writer.WriteInteger(Items[i].Paragraph);
        Writer.WriteString(Items[i].Source);
      end;
      DataChanged := FALSE;
    finally
      Writer.Free;
    end;
  finally
    Stream.Free;
  end;
end;
caesar1987
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3001
Registrovaný: 02 okt 2005, 0:57
Bydlisko: Nové Zámky
Kontaktovať používateľa:

Príspevok od používateľa caesar1987 »

oki.. skusim to.. a reder to iste len opacne???
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ten TReader sa používa mierne inak:

Kód: Vybrať všetko

Item.Source := Reader.ReadString;
caesar1987
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3001
Registrovaný: 02 okt 2005, 0:57
Bydlisko: Nové Zámky
Kontaktovať používateľa:

Príspevok od používateľa caesar1987 »

tak to skusim rozbehat... dufam, ze to nedokaslem... dikes zatial...
Napísať odpoveď