Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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?
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.
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.?
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?
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;
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.
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):
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;
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;
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.