Richeditte formatlı bir satırı başka richedite kopyalamak !!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
poke53280
Üye
Mesajlar: 25
Kayıt: 23 Haz 2004 02:56
Konum: TOKAT

Richeditte formatlı bir satırı başka richedite kopyalamak !!

Mesaj gönderen poke53280 »

Richeditteki mesela 3. satırı formatını koruyarak (Kalın italik vs) başka bir richedite eklemem lazım.

Richediti stream kullanarak komple formatlı ekleyebiliyorum,
Fakat sadece falanca satır olunca işler karışıyor.

Var mıdır deneyen paylaşacak olan arkadaş_?

Başarılar.
En son poke53280 tarafından 31 Mar 2006 02:14 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
ylmz
Üye
Mesajlar: 110
Kayıt: 18 Mar 2005 02:32
Konum: Antalya

Mesaj gönderen ylmz »

merhaba,

clipboard ile yaptığınızda istediğiniz şey oluyor.
copytoclipboard, pastefromclipbooard.

iyi çalışmalar.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

RichEdit'in SelStart, SelLength property'lerini ve diğer arkadaşın belirttiği CopyToClipboard, PasteFromClipboard method'larını kullanabilirsin.

İyi çalışmalar.
poke53280
Üye
Mesajlar: 25
Kayıt: 23 Haz 2004 02:56
Konum: TOKAT

Mesaj gönderen poke53280 »

Clipboardla yapmak evet işe yarar eminim.

Fakat program haricindeki biryerden alıp diğer yere yapıştıracağınız bir bilginin bu program nedeniyle silinmesi pek kullanışlı gelmiyor bana. Yani clipboardı rasgele kullanmadan halletmem lazım.

Başarılar.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

ClipBoard'ın yedeğini alıp bilahare bu işlemi yapıp ClipBoard'ı tekrar eski haline döndürebilirsiniz.

İyi çalışmalar.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
richedit1 in fontunu times new roman ,size 14 ,style inin fsbold,fsitalik değerlerini true olarak ayarladıktan sonra 6-7 satırlık bir yazı yazın.
richedit2 ye hiç karışmayın. daha sonra aşağıdaki programcığı bi çalıştırın işinize yaracak mı?
Button1 in onclick ine aşağıdakini ekleyin.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);

var
eski:tfont;

begin
           eski:=tfont.Create;

     eski.Assign(richedit2.SelAttributes);

    richedit2.SelAttributes.Assign(richedit1.SelAttributes);

      richedit2.lines.add(richedit1.Lines[2]);

      showmessage('durdum') ;
     richedit2.SelAttributes.Assign(eski);
      showmessage(richedit2.Font.Name);

     richedit2.Lines.Add('son eklenen');
          richedit2.Lines.Add('son2 eklenen');

end;




Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
ylmz
Üye
Mesajlar: 110
Kayıt: 18 Mar 2005 02:32
Konum: Antalya

Mesaj gönderen ylmz »

merhaba,

richedit2 de seçili olan alanda iki ayrı font kullanıldıysa ne olacak.Mesela ilk seçili harf "F" sarı, ikinci harf "B" lacivert ise ....

kolay gelsin.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
ylmz yazdı:merhaba,

richedit2 de seçili olan alanda iki ayrı font kullanıldıysa ne olacak.Mesela ilk seçili harf "F" sarı, ikinci harf "B" lacivert ise ....
Haklısınız dediğinize göre hatalı aktarım yapıyor.

@poke53280 stream i kullandığını söylemiş Aşağıdaki resime göre stream
http://www.hemenpaylas.com/download/443 ... e.bmp.html

aşağıdaki kodları oluşturuyor.
{\rtf1\ansi\ansicpg1254\deff0\deflang1055{\fonttbl{\f0\fnil\fcharset162{\*\fname Times New Roman;}Times New Roman TUR;}{\f1\fnil\fcharset162 Microsoft Sans Serif;}}
{\colortbl ;\red255\green0\blue255;\red255\green0\blue0;\red0\green128\blue128;}
\viewkind4\uc1\pard\b\i\f0\fs28 Ahmet
\par h\cf1\b0\i0\f1\fs24 aka\cf0\b\i\f0\fs28 n
\par \cf2 y\cf0 al\cf3 c\cf0\'fdn
\par ramazan
\par sait
\par mahmut
\par fatih
\par
\par }
eğer clipboardı kullanmamaya kararlı iseniz. yukarıdakilerin bır kısmını kırparak istediğinizi alabilirsiniz.
Mesela yukarıdaki örnekte kırpıp aşağıdaki şekle sokarsanız.
2. satır olan yalçın doğru olarak kopyalanır.
{\rtf1\ansi\ansicpg1254\deff0\deflang1055{\fonttbl{\f0\fnil\fcharset162{\*\fname Times New Roman;}Times New Roman TUR;}{\f1\fnil\fcharset162 Microsoft Sans Serif;}}
{\colortbl ;\red255\green0\blue255;\red255\green0\blue0;\red0\green128\blue128;}
\viewkind4\uc1\pard\b\i\f0\fs28 \cf2 y\cf0 al\cf3 c\cf0\'fdn
}
style ler işi karıştırmasa daha kolay yapılır. Ama bir style her satırda tekrarlanmıyor. Örneğin 1.satırda bold var ise 5.satıra kadar \b olmuyor. Bu yüzden 5. satırı doğru kopyalayabilmek için 1. satıra kadar kontrol etmek gerekir.

Kolay gelsin.
En son ofenX tarafından 10 Nis 2006 06:45 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Evet,
@ylmz nin eleştrileri sayesinde sanırım doğru çözüme gidiyoruz.
Aşağıdaki kodu bir deneyin. Diğerine benziyor ama yöntem şöyledir.
a) önce istenen satır düz şekilde diğer richedit in sonuna ekleniyor.
b)sonra ilk richedit te istediğimiz satırın en başına geliyoruz.
c)ikinci richeditte kopyaladığımızın başına geliyoruz.
d)bitene kadar font özelliklerini atıyoruz.

Kod: Tümünü seç

procedure TForm1.Button6Click(Sender: TObject);
var
  K,i: integer;
  BAS,UZUNLUK:INTEGER;
     S:STRING;

begin
    BAS:=RICHEDIT1.Perform(EM_LINEINDEX,3,0);
     UZUNLUK:=LENGTH(RICHEDIT1.Lines[3]);
      RICHEDIT2.Lines.ADD(RICHEDIT1.Lines[3]);


    K:=0;
 for i := BAS to BAS+UZUNLUK do
  begin
       RichEdit1.SelStart := i;
         RichEdit1.SelLength := 1;

      RichEdit2.SelStart :=LENGTH(RICHEDIT2.TEXT)-LENGTH(RICHEDIT1.Lines[3])-2+K;
       RichEdit2.SelLength := 1;
                 K:=K+1;

        RICHEDIT2.SelAttributes := RichEdit1.SelAttributes;

   end;
 end;


Burada @ylmz ın dediklerini onaylamak için
3.satıra ramazan yazmıştım.

ra :times new roman, 14 punto ,italik ,bold,siyah renk
maz :ms sanserif ,12 punto ,normal,kırmızı renk,
an :times new roman ,14 punto ,italik,bold,yeşil renk

yaptım. Bana mısın? demedi. :lol:

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
shadowmann
Üye
Mesajlar: 508
Kayıt: 30 Oca 2004 10:49

Mesaj gönderen shadowmann »

Soru : Bir richediti diğerine nasıl kopyalarız?

Kod: Tümünü seç

type
  TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte;
    cb: Longint; var pcb: Longint): DWORD; stdcall;

  TEditStream = record
    dwCookie: Longint;
    dwError: Longint;
    pfnCallback: TEditStreamCallBack;
  end;

function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;
  cb: Longint; var pcb: Longint): DWORD; stdcall;
var
  theStream: TStream;
  dataAvail: LongInt;
begin
  theStream := TStream(dwCookie);
  with theStream do
  begin
    dataAvail := Size - Position;
    Result := 0; {assume everything is ok}
    if dataAvail <= cb then
    begin
      pcb := Read(pbBuff^, dataAvail);
      if pcb <> dataAvail then {couldn't read req. amount of bytes}
        result := E_FAIL;
    end
    else
    begin
      pcb := Read(pbBuff^, cb);
      if pcb <> cb then
        result := E_FAIL;
    end;
  end;
end;

function EditStreamOutCallback(dwCookie: Longint; pbBuff: PByte; cb:
  Longint; var pcb: Longint): DWORD; stdcall;
var
  theStream: TStream;
begin
  theStream := TStream(dwCookie);
  with theStream do
  begin
    if cb > 0 then
      pcb := Write(pbBuff^, cb);
    Result := 0;
  end;
end;

procedure GetRTFSelection(aRichEdit: TRichEdit; intoStream: TStream);
var
  editstream: TEditStream;
begin
  with editstream do
  begin
    dwCookie := Longint(intoStream);
    dwError := 0;
    pfnCallback := EditStreamOutCallBack;
  end;
  aRichedit.Perform(EM_STREAMOUT, SF_RTF or SFF_SELECTION, longint(@editstream));
end;

procedure PutRTFSelection(aRichEdit: TRichEdit; sourceStream: TStream);
var
  editstream: TEditStream;
begin
  with editstream do
  begin
    dwCookie := Longint(sourceStream);
    dwError := 0;
    pfnCallback := EditStreamInCallBack;
  end;
  aRichedit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, longint(@editstream));
end;

procedure InsertRTF(aRichEdit: TRichEdit; s: string);
var
  aMemStream: TMemoryStream;
begin
  if Length(s) > 0 then
  begin
    aMemStream := TMemoryStream.Create;
    try
      aMemStream.Write(s[1], length(s));
      aMemStream.Position := 0;
      PutRTFSelection(aRichEdit, aMemStream);
    finally
      aMemStream.Free;
    end;
  end;
end;

procedure CopyRTF(aSource, aDest: TRichEdit);
var
  aMemStream: TMemoryStream;
begin
  aMemStream := TMemoryStream.Create;
  try
    GetRTFSelection(aSource, aMemStream);
    aMemStream.Position := 0;
    PutRTFSelection(aDest, aMemStream);
  finally
    aMemStream.Free;
  end;
end;
Cevapla