TFileStream ile dışsal buffer güncelleme sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
dpcmsx
Üye
Mesajlar: 22
Kayıt: 06 Eyl 2011 04:25

TFileStream ile dışsal buffer güncelleme sorunu

Mesaj gönderen dpcmsx »

Herkese selamlar,


Bir programın içine, Opendialog ile seçilen dosyayı açıyorum ve TFileStream ile (Readbuffer) buffer'a okutuyorum. Sonra bir fonksiyon ile örneğin 'Deneme' yazısını arattırıp yerine "Exampl" yazısını koyuyorum. Function True olarak geriye dönüyor ve WriteBuffer ile yazıyı güncelliyorum. İşte burada yazının güncellenmediğini ve aslında başta yüklenen yazısının kaydedildiğini görüyorum. Programda asıl olarak binary dosyaları üzerinde çalışyorum ancak ASCII yada binary olarak yaptığım tüm denemelerde sonuç aynı oldu.

Bu büyük komplike bir programın parçası. Bunun için sadece o kısmı gösteren bir örnek hazırladım.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
    buf1 : string;
  Function FileModi(filebuf : string; filelen : integer) : Boolean;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Fstm : TFileStream;

  fsize,i, c : integer;

begin

  if Opendialog1.Execute then
  begin
try
  Fstm := TFileStream.Create(OpenDialog1.FileName,fmOpenReadWrite);
  Fstm.Position := 0;
  Fsize := Fstm.Size;
  SetLength(buf1,fsize);
  Fstm.ReadBuffer(Pointer(buf1)^,fsize);

  if FileModi(buf1,fsize) = True then
   begin
    Fstm.Position :=0;
    Fstm.WriteBuffer(Pointer(buf1)^,fsize);
  end;
Finally;
end;
  Fstm.Free;
  end;
  Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;

//--------------------------------------------------------------//
Function FileModi(filebuf : string; filelen : integer) : Boolean;
var
  c,i : integer;
  s : string;

begin
    s := 'Exampl';

try
    Result := False;
    c:= Pos('Deneme',filebuf);
    if c <> 0 then
    begin

      Form1.Memo1.Lines.Add('Yazı bulundu');
      Result := True;

      for i := 0 to length(s) do
        begin
        filebuf[c+i] := s[i];
      end;
    end;
Finally
    end;end;

end.

Test Yazısı :
Bu bir Deneme yazisidir.

Eğer fonksiyon kullanmadan yaparsam istediğim işlem yapılmış olarak kaydediliyor. Ollydebug ile bakınca fonksiyona girdiğinde 2. bir buffer oluşturmuş olduğunu ve işlemi onun üzerinde yaptığını gördüm. FileModi kısmına gönderdiğim buf1 adresi kullanılmıyor ancak aynı data başka bir buffer'da kullanılıyor. Sanırım birşeyler atlıyorum burada ancak ne olduğunu henüz çıkaramadım. Buffer olarak Array denedim fakat sonuç aynı. Sizce buradaki sorun nedir?

Saygılar.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: TFileStream ile dışsal buffer güncelleme sorunu

Mesaj gönderen sabanakman »

Tanımınızı

Kod: Tümünü seç

Function FileModi(var filebuf : string; filelen : integer) : Boolean;
şeklinde değiştirmelisiniz. Böylece fonksiyon ilk parametre değişkeni, parametre olarak verilen değişkenle aynı adresi kullanacaktır ve bu değişkende yapılan işlemler aslında parametre verilen değişkende gerçekleşecektir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
dpcmsx
Üye
Mesajlar: 22
Kayıt: 06 Eyl 2011 04:25

Re: TFileStream ile dışsal buffer güncelleme sorunu

Mesaj gönderen dpcmsx »

Sayın sabanakman;

Dediğiniz gibi yapınca asıl değerleri kullandı ve değiştirme işlemi oldu. :D Yalnız s string değeri normal olmasına rağmen değiştirilecek kısmın başına 00 koydu. Dolasıyla Memo'da (yada aktarılacak her yerde) Exampl kısmının başından itibaren gözükmedi. Bende aktarma döngüsünü :

Kod: Tümünü seç

begin
        filebuf[c+i] := s[i+1];
şeklinde değiştirdim ve şimdi herşey gayet güzel çalışıyor.

Değerli yardımlarınız için çok teşekkür ederim.
Cevapla