Avatar billede w13 Novice
25. januar 2007 - 19:06 Der er 17 kommentarer og
1 løsning

Skabe nyt billedobjekt

Hej Eksperter.

Hvordan opretter man et nyt billed vha. af kode? Jeg har nu koden:

image1.picture.loadfromfile('org1.bmp');

som indlæser et billed til image1.. men hvordan opretter jeg automatisk et image2, image3, image4, osv?

Håber I kan hjælpe mig.
Avatar billede kroning Nybegynder
25. januar 2007 - 20:19 #1
var
image2 : TImage;
.
.

image2:=TImage.Create().
Avatar billede w13 Novice
25. januar 2007 - 20:21 #2
Men hvad gør jeg så, hvis jeg vil oprette et billed med et nyt nummer? Altså hvis jeg ska' ha' mulighed for oprettelse af et ubegrænset antal billeder?
Avatar billede kroning Nybegynder
25. januar 2007 - 20:29 #3
Vil du gemme en variable til hver enkelt billede?

Hvis ikke så kan du oprette et billede således:

    with TImage.Create(Self) do
  begin
      Left:=10;
    Top:=10;
    Picture.LoadFromFile('c:\test.jpg');
    Stretch:=true;
    Parent:=Self;
    end;
Avatar billede w13 Novice
25. januar 2007 - 20:31 #4
Ah, det er nok noget af det rigtige ja. Men hvad er så variablen her? Hvad er Self? Og hvad kommer billedet ti at hedde?
Avatar billede kroning Nybegynder
25. januar 2007 - 20:37 #5
Hvis du kalder koden i f.eks. en ButtonClick således:

procedure TForm1.Button1Click(Sender: TObject);
begin
    with TImage.Create(Self) do
  begin
      Left:=10;
    Top:=10;
    Picture.LoadFromFile('c:\test.jpg');
    Stretch:=true;
    Parent:=Self;
    end;
end;

Så er self det samme som Form1, dvs. i stedet for Self kunne du skrive Form1 og det betyder at TImage blive oprette på din Form1.
Hvilken variable?
Hvad mener du med hvad billedet kommer til at hedde? Hvis det er komponenten du vil navngive så er det bare at sætte en Name:="Etnavn" ind f.eks. lige før Parent:=Self.
Avatar billede w13 Novice
25. januar 2007 - 20:48 #6
Ok. :) Så virker det hele fint.
Jeg har et andet spg. vedrørende billeder - lidt ovre i samme boldgade.. er du interesseret i at hjælpe med det også, hvis jeg bare afsætter 120 point i stedet for 60 herinde, eller skal jeg oprette et nyt spg.?
Avatar billede w13 Novice
25. januar 2007 - 20:56 #7
Jeg prøver: hvordan skal jeg så kalde de forskellige billeder, der automatisk er blevet genereret? Jeg mener, jeg kan jo ikke længere skrive:

form1.image3.left:=form1.image3.left+1;

Hvordan laver jeg f.eks. en for-løkke, som kører 4 billeder igennem med navnene image1, image2, image3 og image4 og bruger ovenstående kode på hver af dem?
Avatar billede kroning Nybegynder
25. januar 2007 - 21:15 #8
Hvis du f.eks. opretter 4 TImager således:

var
    i : integer;
begin
    for i:=1 to 4 do
    with TImage.Create(Self) do
  begin
      Left:=10+(i*50);
    Top:=10+(i*50);
    Picture.LoadFromFile('c:\test.jpg');
    Stretch:=true;
    Name:='Image'+inttostr(i);
    Parent:=Self;
  end;
end;

Så kan du flytte dem alle således:

var
    i : integer;
  Image : TImage;
begin
    for i:=1 to 4 do
  begin
      Image:=(Self.FindComponent('Image'+IntToStr(i)) as TImage);
    Image.Left:=Image.Left+1;
    end;
end;
Avatar billede w13 Novice
25. januar 2007 - 21:42 #9
Ok.. Ved følgende kode:

procedure move(dir: integer; i: integer);
begin
Image:=(Adam.FindComponent('orga'+IntToStr(i)) as TImage);
Image.top:=Image.top + 1;
end;

får jeg en meget teknisk fejlmeddelelse, som lukker hele mit program ned og "peger" på linjen "Image.top:=Image.top + 1;" - hvad gør jeg galt her?
Avatar billede kroning Nybegynder
25. januar 2007 - 21:44 #10
Hvilken fejlmeddelelse?
Avatar billede w13 Novice
25. januar 2007 - 22:12 #11
Project Adam2.exe raised exception class EAccessViolation with message 'Access violation at address 0043e473 in module 'Adam2.exe'. Read of address 00000034'. Process stopped. Use Stop or Run to continue.
Avatar billede hrc Mester
25. januar 2007 - 22:34 #12
kroning: Man skal ALDRIG referere vha. den globale form-variabel: Form1. Self er det rigtige at bruge inde i objektet for den "lever" kun så længe objektet gør det. Form1 findes uanset om objekter er oprettet eller ej.
Den eneste grund til at der findes en Form1 er, hvis formene oprettes automatisk - hvilket man hurtigst muligt skal slå være med.

Min første handling når jeg opretter en form (den første, mainformen, er en undtagelse) er, at slette linjerne og omdøbe den til frmMain eller lignende:

type
  TForm2 = class(TForm)
  private
    { Private declarations } // Sletttes!
  public
    { Public declarations } // Sletttes!
  end;

var // Sletttes!
  Form2: TForm2; // Sletttes!

- gid jeg kunne rekompilere delphicoreide100.bpl for deri ligger "skabelonen".

Tilbage til kronings eksempel. Det at man opretter en TImage instans med Create(self) binder billedet til "self" - hvilket her er formen. Dermed bliver det dens ansvar at frigive den igen - hvilket sker når formen frigives.
Havde han skrevet create(nil) skulle han også frigive den igen. Det bringer mig nærmere min idé.

Delphi har en TImageList, så hvis størrelsen på dine billeder er den samme, så kan du bruge den (angiv den i Create'en). Den mangler desværre en Stretch-property.

Hvis billederne er heterogene så kan du lave en liste af dem (nedenstående er en form med 2 paneler hvor den ene indeholder de tre knapper. I det andet panel tegnes alle de bitmaps der er fundet i borlands buttons-katalog):

unit FMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ContNrs, ExtCtrls, StdCtrls;

type
  TMyImageList = class(TObjectList)
  private
    fParent : TWinControl;
    function GetImage(const aIndex : integer) : TImage;
  public
    constructor Create(aParent : TWinControl);
    property Items[const aIndex : integer] : TImage read GetImage; default;
    function AddFromFile(const aFileName : string) : integer;
  end;

  TfrmMain = class(TForm)
    btnLoad: TButton;
    pImages: TPanel;
    btnDeploy: TButton;
    btnClear: TButton;
    pTop: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnLoadClick(Sender: TObject);
    procedure btnDeployClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
  private
    fMyImageList : TMyImageList;
  public
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

const
  CommonPath = 'C:\Program Files\Common Files\Borland Shared\Images\Buttons\';

{ TMyImageList }

function TMyImageList.AddFromFile(const aFileName: string): integer;
var
  Image : TImage;
begin
  Image := TImage.Create(nil);
  Image.Width := 64;
  Image.Height := 32;
  Image.Stretch := true;
  Image.Picture.LoadFromFile(aFileName);
//  Image.Parent := fParent;
  result := inherited Add(Image);
end;

constructor TMyImageList.Create(aParent: TWinControl);
begin
  inherited Create(true);
  fParent := aParent;
end;

function TMyImageList.GetImage(const aIndex: integer): TImage;
begin
  result := inherited Items[aIndex] as TImage;
end;

{ TfrmMain }

procedure TfrmMain.btnClearClick(Sender: TObject);
begin
  fMyImageList.Clear; // Frigiver også de oprettede TImager
end;

procedure TfrmMain.btnDeployClick(Sender: TObject);
var
  i, x, y : integer;
  Image : TImage;
begin
  x := 0; y := 0;
  for i := 0 to fMyImageList.Count - 1 do
  begin
    Image := fMyImageList[i];
    Image.Left := x;
    Image.Top := y;
    Image.Parent := pImages;

    if x + Image.Width > pImages.Width then
    begin
      x := 0;
      y := y + Image.Height;
    end
    else
      x := x + Image.Width;
  end;
end;

procedure TfrmMain.btnLoadClick(Sender: TObject);
var
  Index : integer;
  sr : TSearchRec;
  Found : boolean;
begin
  Found := FindFirst(CommonPath + '*.bmp',faAnyFile,sr) = 0;
  try
    while Found do
    begin
      Index := fMyImageList.AddFromFile(CommonPath + sr.Name);
      Found := FindNext(sr) = 0;
    end;
  finally
    FindClose(sr);
  end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  fMyImageList := TMyImageList.Create(self);
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  fMyImageList.Free;
end;

end.
Avatar billede hrc Mester
25. januar 2007 - 22:53 #13
Lidt mere a la TImageList er denne version der også har stretch

  TMyImageList = class(TObjectList)
  private
    fStretch: boolean;
    fWidth: integer;
    fHeight: integer;
    function GetImage(const aIndex : integer) : TImage;
  public
    constructor Create;
    property Items[const aIndex : integer] : TImage read GetImage; default;
    function AddFromFile(const aFileName : string) : integer;
    property Stretch : boolean read fStretch write fStretch;
    property Width : integer read fWidth write fWidth;
    property Height : integer read fHeight write fHeight;
  end;

implementation

const
  CommonPath = 'C:\Program Files\Common Files\Borland Shared\Images\Buttons\';

{ TMyImageList }

function TMyImageList.AddFromFile(const aFileName: string): integer;
var
  Image : TImage;
begin
  Image := TImage.Create(nil);
  Image.Width := fWidth;
  Image.Height := fHeight;
  Image.Stretch := fStretch;
  Image.Picture.LoadFromFile(aFileName);
  result := inherited Add(Image);
end;

constructor TMyImageList.Create;
begin
  inherited Create(true);

  fStretch := false;
  fWidth := 16;
  fHeight := 16;
end;

function TMyImageList.GetImage(const aIndex: integer): TImage;
begin
  result := inherited Items[aIndex] as TImage;
end;
Avatar billede kroning Nybegynder
25. januar 2007 - 23:03 #14
Ang. fejlen så er det sikkert fordi FindComponent ikke finder nogen komponent, prøv at teste for om den er nil.

procedure move(dir: integer; i: integer);
begin
Image:=(Adam.FindComponent('orga'+IntToStr(i)) as TImage);
if Image<>nil then
  Image.top:=Image.top + 1
else
showmessage('image er nil');
end;
Avatar billede w13 Novice
25. januar 2007 - 23:17 #15
Det er nil ja.
Avatar billede kroning Nybegynder
25. januar 2007 - 23:19 #16
Ok, det betyder så at der ikke findes en TImage med navnet orga+IntToStr(i) på din Adam.
Avatar billede w13 Novice
25. januar 2007 - 23:22 #17
Fedt, jeg havde self. skrevet forkert et andet sted. nå, men det virker fint nu, så hvis du lige opretter et svar! :)
Avatar billede kroning Nybegynder
25. januar 2007 - 23:24 #18
ok :)
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