Results 1 to 10 of 10

Thread: Een stream lezen in een process

Hybrid View

  1. #1

    Cool Een stream lezen in een process

    Ik wil een stream lezen in een process, maar deze loopt 'vast' bij de reset.
    Zie de code hier beneden:

    Code:
    var lsBody : string;
        Body : text;
    begin
       AssignFile(Body, 'c:\file.txt');
       Reset(Body); // VAST??????
       .....
    De file 'c:\file.txt' bestaat uit een RTF tekstje van zo'n 5Kb.

    Ok, misschien mis ik iets?
    Als iemand een idee heeft, hoor ik dat graag
    Bedankt, Ron.
    Last edited by GolezTrol; 04-Mar-08 at 12:28.

  2. #2

    Is het bestandje niet al gelockt door een ander programma? Word (en Wordpad ook, denk ik) houden het bestand gelockt, zodat je het niet met een ander programma kunt openen.

    Als je echt een 'stream' wilt lezen, kijk dan eens naar TFileStream. Dit is een class waarmee je de inhoud van een file als stream kunt benaderen. Hiermee kun je de inhoud ook eenvoudig kopiëeren naar andere streams, zoals TMemoryStream of TStringStream, waarna je je file kunt benaderen als een geheugenbuffer of een string in het geheugen.
    1+1=b

  3. #3
    Ik weet niet of je in je code gebruik maakt van een try..finally constructie, dit is in je voorbeeld niet te zien.
    Dit is wel nodig voor het netjes afhandelen van (openen/sluiten) van je file. Ook bij het gebruik van bijv. een TFileStream is dit van toepassing:

    Code:
    var
      Body:Text;
    begin
      AssignFile(Body,'C:\file.txt');
      try
        // Doe hier je bewerkingen met de file.
      finally
        CloseFile(Body);
      end;
    end;
    of:

    Code:
    var
      Body:TFileStream;
    begin
      Body := TFileStream.Create;
      try
        Body.LoadFromFile('C:\file.txt');
        // Doe hier je bewerkingen op de Filestream.
      finally
        Body.Free;
      end;
    end;
    Als je dit niet doet kun je in het geval van het eerste voorbeeld je file "open" laten staan wat voor vreemde situaties kan zorgen. In het tweede geval zou je een memoryleak veroorzaken.
    I don't byte, I just nibble a bit.

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Demandred, aangezien een assignfile nog geen handle alloceert, en het record automatisch opgeruimd wordt, is een try except hier niet nodig. Pas na een geslaagde reset/rewrite moet je je try beginnen.

  5. #5
    Ik gebruik ondertussen een TStrings object ip. een stream.
    Maar ik krijg bijna dezelfde situatie.
    Zelfs een try wil niet helpen (hij komt niet in de except)
    (zonder de try stopt het process ook op die plek, bij de volgende timerevent
    begint tie weer van boven af aan met de eerste regel).
    Weet iemand hier een oplossing voor?

    Zie code;

    Code:
    var
      StringArray : TStrings;
      Returnstring : string;
    begin
      Self.WriteToLog('Deze regel krijg ik nog te zien in de log');
      try
        StringArray := TStringList.Create;
      except
          Self.WriteToLog('Deze regel zie ik niet meer in de log');
          On e: Exception do
          begin
            Self.WriteToLog('Error:' + e.Message);
          end;
      end;
      Self.WriteToLog('Deze regel krijg helaaml niet te zien');
      ...
    Last edited by Dees; 04-Mar-08 at 18:44.

  6. #6
    In plaats van TStringList.Create() kan je ook TFileStream.Create(AFile, fmOpenRead)
    invullen, hier gaat tie ook niet verder.

    Ron

  7. #7


    Ik begrijp je code niet, de create moet voor de try staan de kans dat er iets fout gaat bij de create van een stringlist is nihil. Als dit goed gaat komt ie niet in de except en zie je dat logischer wijs ook niet terug in de log.

    Zet eens een breakpoint en ga debuggen om te kijken waar je in de code wel/niet komt.

  8. #8
    Dees, ik wil juist de create testen omdat dit het laatste commando is wat uitgevoerd wordt.
    De regel daarop wordt niet meer uitgevoerd.
    Let wel, dit is een process, wat moeilijker met debuggen.
    Wat ik ga doen is even een-niet-process-versie maken om te kijken hoe die dan reageert.
    In ieder geval bedankt.
    Ron

  9. #9
    @Ronneke. Die laatste code die je postte klopt helemaal niet. Je kunt niet eerst een losse regel code maken en daarna nog een on exception handler. Dat compileert nieteens.

    Houd er verder rekening mee, dat je code verder lijkt te lopen als je een try..except blok hebt. F8 werkt niet goed. Zet daarom ook eens een breakpoint in je except..end blokje. Je debugger zal daar dan stoppen als er een exception optreedt. Door met F8 door je code te lopen die je snel genoeg waar dat is.
    1+1=b

  10. #10
    @Marcov: Ok, weten we dat ook weer voor de volgende keer
    I don't byte, I just nibble a bit.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •