Avatar billede thecokeguy Nybegynder
07. december 2002 - 02:36 Der er 1 kommentar og
1 løsning

Komponent hjælp (Så mange svar, som muligt)

___________________________________________________________

Jeg har lavet en komponent med denne kode:
___________________________________________________________

unit Effect;

interface

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

type
  TEffect = class(TComponent)
  private
    { Private declarations }
    FBitmap:      TBitmap;
    FJpeg:        TJpegImage;
    FPicture:    TGraphic;
    FImage:      TImage;

  protected
    { Protected declarations }

  public
    { Public declarations }
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;

  published
    { Published declarations }
    Property Bitmap: TBitmap read FBitmap write FBitmap;
    Property Jpeg: TJpegImage read FJpeg write FJpeg;
    Property Picture: TGraphic read FPicture write FPicture;
    Property Image: TImage read FImage write FImage;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('PDJ', [TEffect]);
end;

constructor TEffect.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TEffect.Destroy;
begin
  inherited Destroy;
end;

end.
___________________________________________________________

Jeg vil gerne have sat den nedenstående procedure ind i komponenten.
___________________________________________________________

procedure TForm1.Button1Click(Sender: TObject);
var
Gray, X, Y : Integer;
PByte : PByteArray;
begin
with Image1.Picture.Bitmap do
begin
  for Y := 0 to Height -1 do
  begin
    PByte := ScanLine[Y];
    for X := 0 to Width -1 do
    begin
      Gray := Round(PByte[X * 3] * 0.3 + PByte[X * 3 + 1] * 0.59 + PByte[X * 3 + 2] * 0.11);
      PByte[X * 3] := Gray;
      PByte[X * 3 + 1] := Gray;
      PByte[X * 3 + 2] := Gray;
    end;
  end;
end;
Image1.Refresh;
end;
___________________________________________________________

Alle de steder hvor "Image1" fremkommer, skal byttes ud så det er den image fra property'en "Image" (fra første kode under published) der reagerer på proceduren.

På forhånd tak :-)
___________________________________________________________
Avatar billede morten_s Nybegynder
07. december 2002 - 12:52 #1
Det må blive noget i denne stil:

unit Effect;

interface

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

type
  TEffect = class(TComponent)
  private
    { Private declarations }
    FBitmap:      TBitmap;
    FJpeg:        TJpegImage;
    FPicture:    TGraphic;
    FImage:      TImage;
    procedure SetImage(Value: TImage);
  protected
    { Protected declarations }

  public
    { Public declarations }
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;

  published
    { Published declarations }
    Property Bitmap: TBitmap read FBitmap write FBitmap;
    Property Jpeg: TJpegImage read FJpeg write FJpeg;
    Property Picture: TGraphic read FPicture write FPicture;
    Property Image: TImage read FImage write SetImage;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('PDJ', [TEffect]);
end;

constructor TEffect.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TEffect.Destroy;
begin
  inherited Destroy;
end;

procedure TEffect.SetImage(Value: TImage);
var
Gray, X, Y : Integer;
PByte : PByteArray;
begin
with Value.Picture.Bitmap do
begin
  for Y := 0 to Height -1 do
  begin
    PByte := ScanLine[Y];
    for X := 0 to Width -1 do
    begin
      Gray := Round(PByte[X * 3] * 0.3 + PByte[X * 3 + 1] * 0.59 + PByte[X * 3 + 2] * 0.11);
      PByte[X * 3] := Gray;
      PByte[X * 3 + 1] := Gray;
      PByte[X * 3 + 2] := Gray;
    end;
  end;
end;
Value.Refresh;
end;


end.
Avatar billede morten_s Nybegynder
07. december 2002 - 13:04 #2
Eller nærmere

procedure TEffect.SetImage(Value: TImage);
var
Gray, X, Y : Integer;
PByte : PByteArray;
begin
  FImage:= Value;
with FImage.Picture.Bitmap do
begin
  for Y := 0 to Height -1 do
  begin
    PByte := ScanLine[Y];
    for X := 0 to Width -1 do
    begin
      Gray := Round(PByte[X * 3] * 0.3 + PByte[X * 3 + 1] * 0.59 + PByte[X * 3 + 2] * 0.11);
      PByte[X * 3] := Gray;
      PByte[X * 3 + 1] := Gray;
      PByte[X * 3 + 2] := Gray;
    end;
  end;
end;
FImage.Refresh;
end;
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