Avatar billede thecokeguy Nybegynder
10. december 2002 - 02:05 Der er 6 kommentarer og
1 løsning

Simpelt spørgsmål om komponent

Jeg er igang med at lave en komponent i delphi.

Denne kode linie virker, som den skal:
Procedure GrayScale(Value: TImage); overload;

Kan nogen fortælle mig hvorfor denne ikke virker:
Procedure Resize(Value: TImage; Width: Integer; Height: Integer);

Mangler der noget? Hvis der gør vil jeg blive glad, hvis der også er en forklaring med.

På forhånd tak for svarene.
Avatar billede kayb Nybegynder
10. december 2002 - 09:52 #1
Kunne du eventuelt uddybe dine fejlbeskeder? Husk hvis den Class som du laver
proceduren under har en Resize procedure skal du enten Rename din egen eller override den.
Avatar billede thecokeguy Nybegynder
10. december 2002 - 21:43 #2
I får lige hele kilde-koden.
_______________________________________________________________________________

unit Effect;

interface

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

type
  TEffect = class(TComponent)
  private
    { Private declarations }

  protected
    { Protected declarations }

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

  published
    { Published declarations }
    Procedure GrayScale(Value: TImage); overload;
    Procedure Resize(Value: TImage; Width: Integer; Height: Integer);
  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.GrayScale(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;

Procedure Resize(Value: TImage; Width: Integer; Height: Integer);
var
    BitmapOriginal:  TBitmap;
    BItmapNew    :  TBitmap;
begin
  BitmapOriginal := TBitmap.Create;
  try
    BitmapOriginal.LoadFromFile(Value.Picture.Bitmap.GetNamePath);
    BitmapNew := TBitmap.Create;
    try
      BitmapNew.Width  := Width;
      BitmapNew.Height := Height;
      BitmapNew.PixelFormat := pf24bit;
      BitmapNew.Canvas.StretchDraw(
          BitmapNew.Canvas.ClipRect,
          BitmapOriginal);
      Value.Picture.Graphic := BitmapNew
    finally
      BitmapNew.Free
    end
  finally
    BitmapOriginal.Free
  end
end;

end.
_______________________________________________________________________________

Overload og override har jeg forsøgt mig med, uden held.
Når jeg vil compile den for jeg følgende besked "Unsatisfied forward or external declaration".
Avatar billede kayb Nybegynder
11. december 2002 - 03:01 #3
Det er fordi du mangler class navnet TEffect i din procedure erklæring. som her: TEffect.Resize du har kun Resize stående.
Avatar billede thecokeguy Nybegynder
11. december 2002 - 16:51 #4
Hvis jeg mangler class navnet, hvorfor virker det så med grayscale?
Avatar billede kayb Nybegynder
11. december 2002 - 17:08 #5
Fordi der har du skrevet det rigtigt.Viser lige:
Denne er rigtig
procedure TEffect.GrayScale(Value: TImage);

Denne er forkert
Procedure Resize(Value: TImage; Width: Integer; Height: Integer);

Denne er rigtig
Procedure TEffect.Resize(Value: TImage; Width: Integer; Height: Integer);
Avatar billede dkkk Nybegynder
13. december 2002 - 16:49 #6
tg
Avatar billede kayb Nybegynder
14. december 2002 - 20:35 #7
Hvad så virker det?
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