15. august 2001 - 15:14Der er
13 kommentarer og 1 løsning
hjæælp -=HASTER=-
hjæælp jeg har et problem jeg har tyvstjålet noget kode fra et scrit jeg har hentet fra nettet hvor man skal kunne lave en lang liste med en masse billeder og de skal så blive vist i en Listbox og der første billede er ok men det nsæte går helt i kage :-( her er koden: procedure TCoolWindowPopup18.CoolItem20002Click(Sender: TObject); var i: Integer; begin if OpenPictureDialog1.execute then begin if OpenPictureDialog1.Files.Count = 1 then begin try begin Image1.Picture.LoadFromFile(OpenPictureDialog1.Filename); if Image1.Picture.Height = Form22.Spinedit2.Value then begin if Image1.Picture.Width = Form22.Spinedit1.Value then begin antalbilleder := antalbilleder+1; billeder[antalbilleder - 1] := TBitmap.Create; try billeder[antalbilleder - 1].Width := Form22.Spinedit2.Value; billeder[antalbilleder - 1].Height := Form22.Spinedit1.Value; billeder[antalbilleder - 1].PixelFormat := pf24bit; billeder[antalbilleder - 1] := Image1.Picture.Bitmap; Form9.ListBox1.Items.AddObject(IntToStr(antalbilleder), TBitmap(billeder[antalbilleder-1])); except MessageDlg(\'Det skete en fejl\', mtError, [mbOk], 0); end; end else begin
end; end else begin MessageDlg(\'Bredde: \' + IntToStr(Image1.Picture.Width) + \' Højde\' + IntToStr(Image1.Picture.Height), mtError, [mbOk], 0) end; end; except MessageDlg(\'Billedfilen: \' + OpenPictureDialog1.Filename + \' eksisterer ikke\', mtError, [mbOk], 0) end; end else begin for i := 0 to OpenPictureDialog1.Files.Count-1 do begin
end; end; end; end;
og så
procedure TForm9.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var BMP : TBitmap; Offset, OffsetT, RHeight, THeight, W, H : Integer; DRect : TRect; begin with (Control as TListBox).Canvas do begin DRect := Bounds(Rect.Left + 95, Rect.Top + 2, (Rect.Right - (Rect.Left + 95)) - 2, (Rect.Bottom - Rect.Top) - 4); FillRect(DRect);
RHeight := Rect.Bottom - Rect.Top; BMP := TBitmap((Control as TListBox).Items.Objects[Index]); if BMP <> nil then begin if (BMP.Width > 90) or (BMP.Height > 90) then begin if BMP.Width >= BMP.Height then begin W := 90; H := Trunc(90 * (BMP.Height / BMP.Width)); end else begin H := 90; W := Trunc(90 * (BMP.Width / BMP.Height)); end; Offset := (RHeight - H) div 2; DRect := Bounds(Rect.Left + 2, Rect.Top + Offset, W, H); StretchDraw(DRect, BMP); end else begin Offset := (RHeight - BMP.Height) div 2; Draw(Rect.Left + 1, Rect.Top + Offset, BMP); end; Offset := 98; end; THeight := TextHeight((Control as TListBox).Items[Index]); OffsetT := (RHeight - THeight) div 2 + 1; TextOut(Rect.Left + Offset, Rect.Top + OffsetT, (Control as TListBox).Items[Index]) end; end;
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Hvis du kigger på din else kan du se at den et af stederne giver en messagebox
Jeg vil foreslå at du lige gennem går den kode og laver noget ordenligt, der er ingen grund til at checke på størelser, og hvorfor køre omkring en Image, istedet for direkte ind i bitmap\'en, den ser noget sjusket ud i mine øjne *S*
her opretter du et bitmap billeder[antalbilleder - 1] := TBitmap.Create;
her overskriver du referencen til det bitmap du lige har lavet billeder[antalbilleder - 1] := Image1.Picture.Bitmap;
Husk på at et array af TBtimap (og alle andre objecter), ikke indeholder selve Bitmappen, men kun en reference til et TBitmap.
dvs alle pladser i arrayet peger på på det samme bitmap: Image1.Picture.Bitmap. Det betyder samtidig at du har en memoryleak, da du ikke har mulighed for at frigøre hukommelsen igen.
brug i stedet Assign som kopierer billedet: billeder[antalbilleder - 1].Assign(Image1.Picture.Bitmap);
Selvom din kode er forkert burde det nu ikke give en fejl, da alle pladserne i arrayet peger på et gyldigt bitmap. Men hvis du et sted i programmet prøver at destruere Bitmapsne i arrayet f.eks:
for i := 0 to AntalBilleder - 1 do Billeder[i].Free;
er det i hvert fald sten sikkert at du får en fejl da du kalder Image1.Picture.Bitmap.Free for hver plads i arrayet.
Men prøv som sagt at bytte billeder[antalbilleder - 1] := Image1.Picture.Bitmap;
med billeder[antalbilleder - 1].Assign(Image1.Picture.Bitmap);
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.