Převrácení textu v Delphi.

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

pavel.minarik píše:no našels funkci Seek, která je funkcí objektu typu TStream nebo něktého z potomků této třídy, máš používat funkci FileSeek:

function FileSeek(Handle, Offset, Origin: Integer): Integer;

je tam v helpu i moc pěkný příklad použití té funkce :wink:

Tak jsem to našel ale příklad tam nemam. Nevim jestli je to verzí. Mam Delphi 2005 ale příklad v helpu není. Mohl bys ho sem prosím dyžtak nakopírovat. Narazil sem na další problém že nevím jak zjistit Handle aby to prostě odpovídalo tomu souboru s kterym to má pracovat.
next_ghost
Začátečník
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Příspěvek od next_ghost »

njn, programátor holt musí mít 6 základních dovedností:
10% schopnost maximálně zjednodušit řešenej problém
1% znalost syntaxe jazyka
4% schopnost použít knihovny
10% schopnost pochopit, co znamená chybová hláška
25% schopnost najít skutečný místo vzniku chyby
50% schopnost přečíst si nápovědu a opravit chybu

:wink:

Handle: soubor
Offset: počet znaků o kolik seekovat
Origin: konstanta od čeho seekovat
pavel.minarik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Brno
Kontaktovat uživatele:

Příspěvek od pavel.minarik »

ach bože, tak ten příklad:

Kód: Vybrat vše

procedure TForm1.Button1Click(Sender: TObject);

var
  iFileHandle: Integer;
  iFileLength: Integer;
  iBytesRead: Integer;
  Buffer: PChar;
  i: Integer
begin
  if OpenDialog1.Execute then
  begin
    try
      iFileHandle := FileOpen(OpenDialog1.FileName, fmOpenRead);
      iFileLength := FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      Buffer := PChar(AllocMem(iFileLength + 1));
      iBytesRead := FileRead(iFileHandle, Buffer^, iFileLength);

      FileClose(iFileHandle);
      for i := 0 to iBytesRead-1 do
      begin
        StringGrid1.RowCount := StringGrid1.RowCount + 1;
        StringGrid1.Cells[1,i+1] := Buffer[i];
        StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i]));
      end;
    finally
      FreeMem(Buffer);
    end;
  end;
end;
ten váš učitel vás asi moc dobře nedrezůruje co :lol:
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

pavel.minarik píše:ach bože, tak ten příklad:

Kód: Vybrat vše

procedure TForm1.Button1Click(Sender: TObject);

var
  iFileHandle: Integer;
  iFileLength: Integer;
  iBytesRead: Integer;
  Buffer: PChar;
  i: Integer
begin
  if OpenDialog1.Execute then
  begin
    try
      iFileHandle := FileOpen(OpenDialog1.FileName, fmOpenRead);
      iFileLength := FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      Buffer := PChar(AllocMem(iFileLength + 1));
      iBytesRead := FileRead(iFileHandle, Buffer^, iFileLength);

      FileClose(iFileHandle);
      for i := 0 to iBytesRead-1 do
      begin
        StringGrid1.RowCount := StringGrid1.RowCount + 1;
        StringGrid1.Cells[1,i+1] := Buffer[i];
        StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i]));
      end;
    finally
      FreeMem(Buffer);
    end;
  end;
end;
ten váš učitel vás asi moc dobře nedrezůruje co :lol:

Nevim jestli to můžu říct veřejně ale jeho nepovažuju za učitele. Učitel tě nakopne správným směrem a když si nevíš rady tak poradí aby ses zamyslel nad problémem z jiné strany a řekne ti svůj názor. On příjde do hodiny pozdě, nechá nás během pár minut sepsat program podle zadání na známky. Protože je to dvouhodinovka tak druhou hodinu nám zadá nějakej úkol co máme zase udělat a přinést ho příští hodinu a úkol z předchozí hodiny mu ukážeme, on řekne hmm a kdo ho nemá nebo komu nefunguje tak toho seřve.

Mimochodem na ten Seek sem se vykašlal naštval sem se a napsal sem to s tim co už umim. Není to sice tak krátký jak by to mohlo být, ale funguje to. Jen je tu menší zádrhel. Když dojde na přechod na další řádek místo odentrování to vyhodí dva nesmyslný znaky a nezaentruje. To sem ale čekal už když sem to psal :o(( jenom nevim proč to dělá.

Kód: Vybrat vše

Sepsal sem to tedy takto:

procedure TForm1.buttPrevratClick(Sender: TObject);
var
  SouborCti,SouborZapis,SouborBox:TextFile;
  Znak:char;
  I:integer;

begin
  AssignFile(SouborCti, 'text/text.txt');
  AssignFile(SouborZapis, 'text/prevraceny.txt');
  AssignFile(SouborBox, 'text/box.txt');
  Reset(SouborCti);
  While Eof(SouborCti)=False Do
  Begin
    Read(SouborCti, Znak);
    Rewrite(SouborZapis);
    Write(SouborZapis, Znak);
    CloseFile(SouborZapis);

    Reset(SouborBox);
    Append(SouborZapis);
    While Eof(SouborBox)=False Do
    Begin
      Read(SouborBox, Znak);
      Write(SouborZapis, Znak);
    End;
    CloseFile(SouborBox);
    CloseFIle(SouborZapis);

    Reset(SouborZapis);
    Rewrite(SouborBox);
    While EoF(SouborZapis)=False Do
    Begin
      Read(SouborZapis, Znak);
      Write(SouborBox, Znak);
    End;
    CloseFile(SouborZapis);
    CloseFIle(SouborBox);
  End;

  CloseFile(SouborCti);
  Rewrite(SouborBox);
  Write(SouborBox, '');
  CloseFile(SouborBox);
end;
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

next_ghost píše:njn, programátor holt musí mít 6 základních dovedností:
10% schopnost maximálně zjednodušit řešenej problém
1% znalost syntaxe jazyka
4% schopnost použít knihovny
10% schopnost pochopit, co znamená chybová hláška
25% schopnost najít skutečný místo vzniku chyby
50% schopnost přečíst si nápovědu a opravit chybu
Na tomhle asi něco bude :wink:
next_ghost píše: Handle: soubor
Offset: počet znaků o kolik seekovat
Origin: konstanta od čeho seekovat


Mě jde o to že tady je Handle integer a já mam název souboru text.txt a ne 13. Víš co myslim ;o))
next_ghost
Začátečník
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Příspěvek od next_ghost »

MILHI píše:Mě jde o to že tady je Handle integer a já mam název souboru text.txt a ne 13. Víš co myslim ;o))
Seekuješ snad v tom stringu s názvem souboru? Ne. Seekuješ v souboru a k tomu ten handle získáš jeho otevřenim. Jestli nejsi úplně slepej, tak to najdeš v tom kódu od pavla.minarika.

A ten konec řádku to zprasí, protože Widle ukončujou řádek \r\n, ale Delphi to neintepretuje jako 1 znak, takže z toho udělá \n\r a to už Widle neznaj :lol: Mimochodem, normální řešení přes FileSeek() má složitost O(n), tvoje řešení přes 2 soubory má složitost O(n^2).
Naposledy upravil(a) next_ghost dne ned 19. bře 2006, 19:51, celkem upraveno 1 x.
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

next_ghost píše: A ten konec řádku to zprasí, protože Widle ukončujou řádek \r\n, ale Delphi to neintepretuje jako 1 znak, takže z toho udělá \n\r a to už Widle neznaj :lol:
A nevíš jak by se to dalo řešit? Nějaký řešení bejt musí
next_ghost
Začátečník
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Příspěvek od next_ghost »

MILHI píše:A nevíš jak by se to dalo řešit? Nějaký řešení bejt musí
Je, když načteš \r\n (číselně 13 a 10) za sebou, tak je nepřevracej. A nebo použij Skutečnej Programovací Jazyk (tm), kterej nějakej Widlí vynález nezajmá a bere to jako 1 znak. 8-)
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

next_ghost píše:
MILHI píše:A nevíš jak by se to dalo řešit? Nějaký řešení bejt musí
Je, když načteš \r\n (číselně 13 a 10) za sebou, tak je nepřevracej. A nebo použij Skutečnej Programovací Jazyk (tm), kterej nějakej Widlí vynález nezajmá a bere to jako 1 znak. 8-)

Naja, jenomže tohle je do školy ne z můj vlastní výmysl. Radši bych psal v C# ale se u nás jaksi neučí :o((
pavel.minarik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Brno
Kontaktovat uživatele:

Příspěvek od pavel.minarik »

proboha, prostě \r\n nepřevracej
PS: pro programátora není jazyk důležitej, mám pocit, že v C# bys měl úplně stejný problémy
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
Odpovědět

Zpět na „Programování a web“