Binary tablonun icindeki bir bilginin degistirilerek kopyala

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Binary tablonun icindeki bir bilginin degistirilerek kopyala

Mesaj gönderen Burhan_ast »

Merhabalar

Binary bir tablo var bunun icindeki tum Renk kelimesini Malin_cinsi seklinde degistirmem lazim daha dogrusu bu iki kelime parametrik degisken, asagida delphi helpinden aldigim blockread ornegi var Buf degiskeni dizi oldugu icin bir turlu degisikligi yapamadim

Kod: Tümünü seç

procedure TFrm_Ser_Tablo_tanimlari_kopyala.Button1Click(Sender: TObject);
var
  FromF, ToF: file;
  NumRead, NumWritten: Integer;
  Buf: array[1..2048] of Char;
begin
  if OpenDialog1.Execute then     { Display Open dialog box }
  begin
    AssignFile(FromF, OpenDialog1.FileName);
    Reset(FromF, 1);	{ Record size = 1 }
    if SaveDialog1.Execute then      { Display Save dialog box}
    begin
      AssignFile(ToF, SaveDialog1.FileName);	{ Open output file }

      Rewrite(ToF, 1);	{ Record size = 1 }
      Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))
        + ' bytes...');
      repeat
        BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
//          Buf icerisindeki tum "Renk" kelimelerini "Malin_cinsi" seklinde degistirmek istiyorum...
        BlockWrite(ToF, Buf, NumRead, NumWritten);
      until (NumRead = 0) or (NumWritten <> NumRead);
      CloseFile(FromF);
      CloseFile(ToF);
    end;
  end;
end;
Saygilar

Burhan Cakmak
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selam Burhan,

Sanırım Source'da büyükk bir değişiklik yapman gerekiyor ve nerede kullanıldığını bulup düzeltmek zor olacağı için böyle bir yönteme başvurmak istiyorsun :)

Öncelikle BlockRead ile Binary file'dan bir şeyi tanımladığın bir Bellek alanına taşıman gerekiyor. Ama bu şekilde de iş bitmiyor.

Mantığı ile ilgili yol göstermesi açısından birşeyler yazayım,

1. Bloğu belleğe oku,
2. Aramayı yap bulduklarını replace et. (*)
3. Diğer bloğu oku ve bu her iki bloğo birleştirip bir daha üzerinde tarama yap ve replace'ini gerçekleştir. (**)
4. Birinci bloğu diske yaz.
5. İkinci Bloğu 1. Blok değişkenine taşı,
6. 3. adıma geri dön ve okunacak bir şey kalmayana kadar bu adımları tekrarla.

(*) Replace işleminde Renk ile Mal_Cinsi kelimelerinin uzunlukları birbirinden farklı, bu sebeple eğer blokta bir değişiklik yapıyorsan, ki size olarak farklı olduğu için otomatikman senin oluşturduğun replace edilmiş blokta bu olacaktır. Uzunluktan doğacak taşmalaraı göz önünde bulundurman gerekiyor ve bu Buffer değişkenlerini dikkatli kullanmak gerekiyor. Eğer mümkün ise, Okuduğun değişkeni ayrıca başka bir değişkene kopyala ve kopyalanmış bu değişken üzerinde işlem yap.
(**) Aynı şekilde bu parçalar arasında yine size ile ilgili problemin çıkabilir bunları göz önünde bulundur.

Search & Replace işlemi biraz problemli bir olay. Dikkatli olmak lazım, eğer sorunun, benim en başta yazdığım şey ise sana biraz manuel ama sağlam bir önerim olabilir.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Evet dogru tahmin ettiniz

Mesaj gönderen Burhan_ast »

Sayin Kuri_TLJ,

Tahmininiz dogru mevcut prototip bir form var bu forma ait ekleme formu var bu formda yaptigim su idi Stok kartlarinda kullanmak uzere Renk alanim var ve bu alan icin Renk kayit, silme v.s. islemlerin oldugu bir modul hazirladim bu modul, Malin_cinsi, Uretici firma, Birim, Personel mezun oldugu okul, cari hesaplarda hesap gurubu v.s bu sekildeki veri tablolarindaki tum islemler icin kullanacagim ve bu hazir olan prototipin icindeki "Renk" kelimesini "Malin_cinsi" seklinde degistirirsem ve dosya adinida buna gore degistirirsem tahminim bir hata mesaji almadan Malin cinsi modulum hazir olmus olacak diye dusunuyorum, burda problem .Dfm uzantili dosyanin formatinin text degilde binary oldugundan dolayi takildim kaldim, Kafamda durmus durumda dunden beri dusunuyorum nasil yapacagimi,

Veya soruyu su sekilde degistireyim

Buf: array[1..2048] of Char;

Alani char ve array seklinde tanimlanmis bunu string'e cevirmem mumkunmu ve string icinde degistirmem daha kolay daha sonrada stringi Char Array sekline cevirebilirmiyim

Burhan
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

O iş benim için uzun bir iş olduğu için hiç el atmadım :) Yani gördüğün gibi algoritması kafamda var ama girip yazmak istemediğim için yapmadım. Ancak DOS versiyonunu yapmıştım :) Oradan biliyorum.

Aslında Delphi'de, Projedeki formlardan herhangi biri üzerinde Mouse'un sağ klik tuşuna basarak çıkan popup menüde, View As Text seçeneğini seçersen, Formda bulunan tüm objeleri ve formun kendisi dahil, event, method, property gibi tüm her şeyini Text olarak görüntüler. Ve sen Editörün kendisinde Bulunan Search & Replace'i kullanarak bunları çok kolay bir şekilde replace edebilirsin.

Bu sana Manuel olarak yapabileceğini göstermek için tavsiye,

Gelelim diğer konuya, Array Char olarak tanımlanmış bir değişkeni MOVE komutu ile taşıyabilirsin sanırım, bir dene ben müsait olmadığım için deneyemiyorum. Pascal'dayken biz böyle yapardık, yada FillChar gibi komutlar olacaktı onların helpine bir göz at oralardan bişiler çıkarabilirsin sanırım.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
PhoenixJedi
Üye
Mesajlar: 8
Kayıt: 25 Şub 2004 01:57
Konum: İstanbul

Mesaj gönderen PhoenixJedi »

Merhabalar,

Nekadar işine yarar bilmiyorum ama dfm yi text dosyasına çeviren Convert.exe diye bir program var. Bu program delphi'nin /bin dizininde mevcut.

Bununla, ilgili dfm dosyalarını txt dosyalarına çevirip gerekli değişiklikleri yapıktan sonra tekrar dfm ye çevirebilirsin :wink:

DFM'yi TEXT'e ÇEVİRME:
Bir DOS penceresinden aşağıdaki gibi yazarak dfm leri txt ye çevirebilirsin

Kod: Tümünü seç

Convert -t dosya1.dfm dosya1.txt
yada o dizindeki bütün dfmleri çevirmek için;

Kod: Tümünü seç

Convert -t *.dfm *.txt
--

Bu arada istediğin değişiklikleri yap.

--

Şimdi de değiştiridiğimiz Txt dosyalarını Dfm ye çevirelim

TEXT'i DFM'ye çevirme

Kod: Tümünü seç

Convert -b dosya1.txt dosya1.dfm
yada o dizindeki bütün txt'leri dfm'ye çevirmek için;

Kod: Tümünü seç

Convert -b *.txt *.dfm

Ayrıca Convert.exe 'nin diğer parametrelerini görmek için

Kod: Tümünü seç

Convert 
yazman yeterlidir.



Kolay Gelsin,

------------------------------------
KOKTAY
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Aman efendim kimleri görüyoruz aramızda,

Bir güneş daha doğdu Delphi Türkiye'ye
hayırlı uğurlu olsun vatana millete ve üyelerimize :) 8)

Hoş Geldin İsmail
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Tsk,

Mesaj gönderen Burhan_ast »

Sayin Koktay, Kuri_TLJ ve tum forum uyeleri,
Yardimlarinizdan dolayi tesekkur ederim, Koktay dediklerini deneyecegim ama http://www.obsof.com adresinde Greplace isminde bir program buldum dedigim isi yapiyor tum kullanicilarin bilgisine sunulur,

Burhan Cakmak
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam... Hemen pes etmeyin...

Kod: Tümünü seç

Var
  s  : String;
  Buf: array[1..2048] of Char;
begin
  s := Buf; // bu yeterli...
  StrPCopy (Buf, s); // bu da tersi işlem...
end;

Kod: Tümünü seç

      repeat 
        BlockRead(FromF, Buf, SizeOf(Buf), NumRead); 

//          Buf icerisindeki tum "Renk" kelimelerini "Malin_cinsi" seklinde degistirmek istiyorum... 

        BlockWrite(ToF, Buf, NumRead, NumWritten); 
      until (NumRead = 0) or (NumWritten <> NumRead); 
demişsiniz ya... İşte değişiklik yaptıktan sonra NumRead kadar geri yazdırıryorsunuz ya, işte NumRead değerini yeni boyuta göre güncellerseniz sorun kalmaz...
Resim
Resim ....Resim
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

malesef

Mesaj gönderen Burhan_ast »

Sayin Mrmcop

Malesef derleyici hatasi aliyorum

Kod: Tümünü seç

    StrPCopy (Buf, s); // bu da tersi işlem... 
Satirina derleyici hata veriyor cevrim yapamiyor ama isin enterasan tarafi delpi helpindede bu sekilde yaziyor ornek ama malesef calismada SysUtils uniti ekledim ama yine olmadi

Burhan Cakmak
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Ne hatası verdiğini yazsaydınız iyi olurdu...

Kod: Tümünü seç

Var
    s : String;
  Buf : Array[0..1024] of Char; 
gibi olması lazım.. Belki shortstring falansa diye yazıyorum...
Resim
Resim ....Resim
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Başka örnekler

Mesaj gönderen kelaynak2 »

İlgisi nedeniyle aşağıdaki kodları da ekleyim.İlerde ararsam lazım olur.
örnek 1.

Kod: Tümünü seç

MemStream : TMemoryStream; 
  FindStr : string[255]; 
  LenMyVerb, BytesRead : integer; 
begin 
  LenMyVerb := Length(MyVerb); 
  SetLength(FindStr, LenMyVerb); 
  LoadFromFile(FileName); 
  Seek(0,soFromBeginning); 
  with MemStream do begin 
    BytesRead := Read(FindStr[1], LenMyVerb); 
    while (BytesRead = LenMyVerb) do begin  {while not end of file} 
      if FindStr = MyVerb then begin 
         {do whatever you want if found} 
        end {FindStr = MyVerb} 
      else 
        Seek( 1 - LenMyVerb, soFromCurrent); {go back (LenMyVerb - 1)} 
      {end; FindStr = MyVerb else} 
      BytesRead := Read(FindStr[1], LenMyVerb); 
    end; {while BytesRead = LenMyVerb} 
  end; {with MemStream} 
  MemStream.Free; 
end; 

örnek 2

Kod: Tümünü seç

Const FileName = 'c:\t\test.dat'; 
Const TestData = 'ABCDEFGHIJKTESTDATA'; 


procedure TForm1.Button1Click(Sender: TObject); 
Var 
  FS :TFileStream; 
  S :String; 
begin 
  // Create a file - if necessary 
  If FileExists( FileName ) = False Then 
     Begin 
       FS := TFileStream.Create( FileName, fmCreate ); 
       FS.Position := 0; 
       S := TestData; 
       FS.Write( S[1], Length( S ) ); 
       FS.Free; 
       ShowMessage( 'Created:' + S ); 
     End; 


  // So we definitely have a file by now 
  FS := TFileStream.Create( FileName, fmOpenReadWrite ); 
  FS.Position := 0;  // not really needed 
  SetLength( S, FS.Size ); 
  FS.Read( S[1], FS.Size ); 


  // Replace 
  S := StringReplace( S, 'A', '{A}', [rfReplaceAll] ); 


  // Put back to Disk 
  FS.Position := 0;   // essential 
  FS.Write( S[1], Length( S ) ); 
  FS.Size := Length( S );  //  We may have shortened the file 
  FS.Free; 
  // 
  ShowMessage( 'New Data:' + S ); 
end; 


// ---- End of Code --- 



Cevapla