Avatar billede alfabeta Nybegynder
10. juli 2003 - 13:15 Der er 16 kommentarer og
1 løsning

RichEdit Erstat tekst med billede !

Nogen er jer eksperter der kan give mig en procedure til at skifte noget tekst ud med et billede. Eks :-) ud med smilie.gif/jpg lige som i messanger ?
Avatar billede stoney Nybegynder
10. juli 2003 - 13:48 #1
Avatar billede stone Forsker
10. juli 2003 - 13:57 #2
har du funktionen til at vise billede i richedit? hvis ikke så har jeg en:

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

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

// RichEdit Type
type
  TMyRichEdit = TrxRichEdit;

// EditStreamInCallback callback function
function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;
  cb: Longint; var pcb: Longint): DWORD; stdcall;
  // by P. Below
var
  theStream: TStream;
  dataAvail: LongInt;
begin
  theStream := TStream(dwCookie);
  with theStream do
  begin
    dataAvail := Size - Position;
    Result := 0;
    if dataAvail <= cb then
    begin
      pcb := read(pbBuff^, dataAvail);
      if pcb <> dataAvail then
        Result := UINT(E_FAIL);
    end
    else
    begin
      pcb := read(pbBuff^, cb);
      if pcb <> cb then
        Result := UINT(E_FAIL);
    end;
  end;
end;

// Insert Stream into RichEdit
procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream);
 
var
  EditStream: TEditStream;
begin
  with EditStream do
  begin
    dwCookie := Longint(SourceStream);
    dwError := 0;
    pfnCallback := EditStreamInCallBack;
  end;
  RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, Longint(@EditStream));
end;

// Convert Bitmap to RTF Code
function BitmapToRTF(pict: TBitmap): string;
// by D3k
var
  bi, bb, rtf: string;
  bis, bbs: Cardinal;
  achar: ShortString;
  hexpict: string;
  I: Integer;
begin
  GetDIBSizes(pict.Handle, bis, bbs);
  SetLength(bi, bis);
  SetLength(bb, bbs);
  GetDIB(pict.Handle, pict.Palette, PChar(bi)^, PChar(bb)^);
  rtf := '{\rtf1 {\pict\dibitmap ';
  SetLength(hexpict, (Length(bb) + Length(bi)) * 2);
  I := 2;
  for bis := 1 to Length(bi) do
  begin
    achar := Format('%x', [Integer(bi[bis])]);
    if Length(achar) = 1 then
      achar := '0' + achar;
    hexpict[I - 1] := achar[1];
    hexpict[I] := achar[2];
    Inc(I, 2);
  end;
  for bbs := 1 to Length(bb) do
  begin
    achar := Format('%x', [Integer(bb[bbs])]);
    if Length(achar) = 1 then
      achar := '0' + achar;
    hexpict[I - 1] := achar[1];
    hexpict[I] := achar[2];
    Inc(I, 2);
  end;
  rtf := rtf + hexpict + ' }}';
  Result := rtf;
end;

{$R *.DFM}

//den tekst som skal udskiftes med et billede, går jeg ud fra er en label
//den kan du bare sætte visible:= false
//og så lave en loadfromfile som henter billedet
//f.eks procedure til button1
//
procedure TForm1.Button1Click(Sender: TObject);
var
  SS: TStringStream;
  BMP: TBitmap;
begin
Image1.Picture.LoadFromFile('mac.bmp');//billedet ligger i biblioteket
    BMP := Image1.Picture.Bitmap;
  SS  := TStringStream.Create(BitmapToRTF(BMP));
  try
    PutRTFSelection(rxRichEdit1, SS);
  finally
    SS.Free;
  end;
end;
Avatar billede stone Forsker
10. juli 2003 - 14:01 #3
how..glemte en refresh før jeg postede mit svar
Avatar billede alfabeta Nybegynder
10. juli 2003 - 14:28 #4
Får compilerfejl:

[Error] Unit1.pas(81): Undeclared identifier: 'EM_STREAMIN'
[Error] Unit1.pas(81): Undeclared identifier: 'SF_RTF'
[Warning] Unit1.pas(81): Combining signed and unsigned types - widened both operands
[Error] Unit1.pas(140): Undeclared identifier: 'rxRichEdit1'

Mangler jeg noget i include ?
Avatar billede stone Forsker
10. juli 2003 - 18:31 #5
du mangler at sætte Richedit under

implementation

uses Richedit;
// herunder sætter du min ovenstående kode



du ændre bare rxrichedit1 til Richedit1
Avatar billede alfabeta Nybegynder
14. juli 2003 - 09:15 #6
Takker :-)
Avatar billede alfabeta Nybegynder
14. juli 2003 - 10:42 #7
Får stadigvæk compilerfejl
Avatar billede alfabeta Nybegynder
14. juli 2003 - 10:42 #8
Gider du og maile et eksempel ?
larsmichaelhansen@hotmail.com
Avatar billede stone Forsker
14. juli 2003 - 14:20 #9
ovenstående eksempel send inc. en exe fil.

stone
Avatar billede fun22 Nybegynder
14. september 2003 - 10:37 #10
Stone >> Jeg får en fejl i denne linie:

PutRTFSelection(Richedit, SS);

hvor den siger at . var ventet men , blev fundet. Hvordan retter jeg det?
Avatar billede stone Forsker
14. september 2003 - 10:56 #11
det er fordi du skal bruge componenten "rxrichedit" fra rxlib hvis du ikke har det kan jeg lægge et link hvor det kan hentes, skal bare vide hvilken delphi version du kører med.
Avatar billede fun22 Nybegynder
14. september 2003 - 11:42 #12
Delphi 6
Avatar billede stone Forsker
14. september 2003 - 12:23 #13
Avatar billede fun22 Nybegynder
14. september 2003 - 12:29 #14
så siger den [Error] Unit1.pas(294): Incompatible types: 'TEdit' and 'TRxRichEdit'
Avatar billede stone Forsker
14. september 2003 - 12:50 #15
hmm..kan ikke lige se hvor fejlen skulle være har ikke selv de problemer,
her er mit eksempel:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls, RxRichEd, ExtDlgs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    RxRichEdit1: TRxRichEdit;
    Button2: TButton;
    op: TOpenPictureDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    Currentfile: string;

  end;

var
  Form1: TForm1;

implementation

uses Richedit;

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

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

// RichEdit Type
type
  TMyRichEdit = TrxRichEdit;

// EditStreamInCallback callback function
function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;
  cb: Longint; var pcb: Longint): DWORD; stdcall;
  // by P. Below
var
  theStream: TStream;
  dataAvail: LongInt;
begin
  theStream := TStream(dwCookie);
  with theStream do
  begin
    dataAvail := Size - Position;
    Result := 0;
    if dataAvail <= cb then
    begin
      pcb := read(pbBuff^, dataAvail);
      if pcb <> dataAvail then
        Result := UINT(E_FAIL);
    end
    else
    begin
      pcb := read(pbBuff^, cb);
      if pcb <> cb then
        Result := UINT(E_FAIL);
    end;
  end;
end;

// Insert Stream into RichEdit
procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream);
  // by P. Below
var
  EditStream: TEditStream;
begin
  with EditStream do
  begin
    dwCookie := Longint(SourceStream);
    dwError := 0;
    pfnCallback := EditStreamInCallBack;
  end;
  RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, Longint(@EditStream));
end;

// Convert Bitmap to RTF Code
function BitmapToRTF(pict: TBitmap): string;
// by D3k
var
  bi, bb, rtf: string;
  bis, bbs: Cardinal;
  achar: ShortString;
  hexpict: string;
  I: Integer;
begin
  GetDIBSizes(pict.Handle, bis, bbs);
  SetLength(bi, bis);
  SetLength(bb, bbs);
  GetDIB(pict.Handle, pict.Palette, PChar(bi)^, PChar(bb)^);
  rtf := '{\rtf1 {\pict\dibitmap ';
  SetLength(hexpict, (Length(bb) + Length(bi)) * 2);
  I := 2;
  for bis := 1 to Length(bi) do
  begin
    achar := Format('%x', [Integer(bi[bis])]);
    if Length(achar) = 1 then
      achar := '0' + achar;
    hexpict[I - 1] := achar[1];
    hexpict[I] := achar[2];
    Inc(I, 2);
  end;
  for bbs := 1 to Length(bb) do
  begin
    achar := Format('%x', [Integer(bb[bbs])]);
    if Length(achar) = 1 then
      achar := '0' + achar;
    hexpict[I - 1] := achar[1];
    hexpict[I] := achar[2];
    Inc(I, 2);
  end;
  rtf := rtf + hexpict + ' }}';
  Result := rtf;
end;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  SS: TStringStream;
  BMP: TBitmap;
begin
    BMP := Image1.Picture.Bitmap;
  SS  := TStringStream.Create(BitmapToRTF(BMP));
  try
    PutRTFSelection(rxRichEdit1, SS);
  finally
    SS.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if
Op.Execute then
begin
currentfile:= Op.FileName;
image1.picture.LoadFromFile(currentfile);

end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Image1.picture:= nil;
end;

end.
Avatar billede fun22 Nybegynder
14. september 2003 - 13:01 #16
nu virker det... Men kan man ikke gøre sådan at den kan bruge jpg??
Avatar billede stone Forsker
14. september 2003 - 13:21 #17
Du kan redigere det her eksempel:
var
  FileExt: string[4];
begin
FileExt := AnsiUpperCase(ExtractFileExt(FileListbox1.FileName));
if (FileExt = '.BMP') or (FileExt = '.WMF') or (FileExt ='.JPG') or
(FileExt ='.EMF')or (FileExt = '.GIF')or (FileExt = '.ICO')or (FileExt = '.JPEG') then
begin
Image1.Picture.LoadFromFile(FileListBox1.FileName);
if (FileExt = '.BMP')or (FileExt ='.EMF')or (FileExt ='.WMF')or (FileExt ='.JPG')
or(FileExt = '.GIF')or (FileExt ='.ICO')or (FileExt ='.JPEG') then
begin
Form5.Image1.Picture := Image1.Picture;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester