Avatar billede cautoo Nybegynder
15. august 2001 - 15:14 Der 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;
Avatar billede martinlind Nybegynder
15. august 2001 - 15:18 #1
Der ser da meget tilforladeligt ud, hvad er fejlen sådan mere præcist ?

PS. hvis du har D6, har de en listbox/combobox der kan det.
Avatar billede cautoo Nybegynder
15. august 2001 - 15:22 #2
det har jeg ikk
Avatar billede martinlind Nybegynder
15. august 2001 - 15:25 #3
og så lige svar på mit første sp.
Avatar billede cautoo Nybegynder
15. august 2001 - 15:26 #4
nårh ja, jo altså når jeg tilføjer det første billede går det fint men ved det næste billede får jeg en løkke af fejlmeddelelser
Avatar billede martinlind Nybegynder
15. august 2001 - 15:29 #5
du har jo også to if\'er på pic-width og height, det er nok dine pic\'s der er stører en din spinedit.vale
Avatar billede cautoo Nybegynder
15. august 2001 - 15:32 #6
nej
Avatar billede cautoo Nybegynder
15. august 2001 - 15:36 #7
det burde vel ikk give fejlmeddelelser
Avatar billede cautoo Nybegynder
15. august 2001 - 15:44 #8
og hva ville du ellers gøre med de der dobbelt ifer?
Avatar billede martinlind Nybegynder
15. august 2001 - 15:45 #9
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*
Avatar billede cautoo Nybegynder
15. august 2001 - 15:52 #10
grunden til billedstørrelsetjekket er at alle billeder skal være lige store da de til sidst skal sættes sammen til en film
Avatar billede martinlind Nybegynder
15. august 2001 - 15:56 #11
Så brug strechdraw til at gøre dem lige store
Avatar billede cautoo Nybegynder
15. august 2001 - 15:58 #12
ya, men jeg har stadig en fejlmeddelelse og lege med først. Vil det hjælpe hvis du fik lidt af projektet eller måske bare exefilen??
Avatar billede nico26 Nybegynder
16. august 2001 - 02:38 #13
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);
Avatar billede cautoo Nybegynder
16. august 2001 - 12:45 #14
DET VIRKER :-)

tak for hjælpen
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