Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Array of Tpicture? (https://www.delphipraxis.net/139756-array-tpicture.html)

DerMario 4. Sep 2009 16:02


Array of Tpicture?
 
hallo,

ich bräuchte in einem programm ein array das ich mit bildern vollstopfen kann also ein Array of tpicture.
ich habe da mal ein vereinfachtes prog gebastelt um zu demonstrieren was ich meine...

Delphi-Quellcode:
uses jpeg;

var
  bilder:array[1..4] of tpicture;

procedure TForm1.Button1Click(Sender: TObject);
begin
  bilder[1].create;
  bilder[1].LoadFromFile('bild01.jpg');
  bilder[2].create;
  bilder[2].LoadFromFile('bild02.jpg');
  bilder[3].create;
  bilder[3].LoadFromFile('bild03.jpg');
  bilder[4].create;
  bilder[4].LoadFromFile('bild04.jpg');
end;
wenn ich das prog dann aber starte und den button1 betätige gibt es eine zugriffs verletztung.

hat jemand ne ahnung warum?

mfg mario

Matze 4. Sep 2009 16:04

Re: Array of Tpicture?
 
Man erzeugt die Instanzen so:

Delphi-Quellcode:
bilder[1] := TPicture.Create;

DerMario 4. Sep 2009 16:06

Re: Array of Tpicture?
 
jo danke :oops:

Kuehter 15. Okt 2014 07:54

AW: Array of Tpicture?
 
Ich habe das mal einfach übernommen was ihr gemacht :thumb: habt nur etwas anders geschrieben
ich habe jetzt nur das problem ich kann die bilder nicht auslesen er sagt mir immer der Zeiger sei falsch gesetzt ich weiß jedoch nicht wo der fehler ist.

Delphi-Quellcode:
type
  Tintegerarray = array of integer;
  Tpicarray = array of Timage;


   Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    Image10: TImage;

var
  Form1: TForm1;

implementation
{$R *.dfm}


function picload: Tpicarray;

var counter: integer;
    i,j,t: integer;

begin
  SetLength(result,10);

  for counter := 1 to 10 do
  begin
    Result[counter] := TImage.Create(nil);
    Result[counter].Picture.LoadFromFile('Symbolik_' + inttoStr(counter) + '.jpg');
  end;

  for counter := 1 to 10 do
  begin
    j := trunc(random(10))+1;
    t := trunc(random(10))+1;

    i := t;
    Result[t]:= Result[j];
    Result[j]:= Result[i];
  end;

end;





function bedingung: Tintegerarray;
var
  Generierer: array[0..3] of integer;
  max, max2: integer;

begin

    repeat

      Generierer[0] := trunc(random(899))+100;
      max := 999 - Generierer[0];
      Generierer[1] := trunc(random(max))+10;
      Generierer[2] := trunc(random(max))+10;
      max := 999 - Generierer[1];
      max2 := 999 - Generierer[2];

      if max > max2 then
        Generierer[3] := trunc(random(max2))+10
      else
        Generierer[3] := trunc(random(max))+10;


      SetLength(result,9);
      result[0] := Generierer[0];
      result[1] := Generierer[1];
      result[2] := Generierer[2];
      result[3] := Generierer[3];
      result[4] := Generierer[0] + Generierer[1];   //A2 + A1 = C1
      result[5] := Generierer[2] + Generierer[0];   //B1 + A1 = C2
      result[6] := Generierer[1] + Generierer[3];   //A2 + B2 = D1
      result[7] := Generierer[2] + Generierer[3];   //B1 + B2 = D2
      result[8] := Result[5]+Result[6];             //engergebnis

   until(result[8] <= 999);

   if (Result[8] = Result[4] + Result[7]) then
        ShowMessage('Die Zahlen Stimmen ')
   else
        ShowMessage('Die Zahlen stimmen nicht');

end;





procedure TForm1.Button1Click(Sender: TObject);
var
  rec : TIntegerarray;
  caller : Tpicarray;

begin
    //Image1.Picture.LoadFromFile('Symbolik_1.jpg');
   rec := bedingung ;
   caller := picload;




   Edit1.Text := InttoStr(rec[0]);
   Edit2.Text := InttoStr(rec[1]);
   Edit3.Text := InttoStr(rec[4]);

   Edit4.Text := InttoStr(rec[2]);
   Edit5.Text := InttoStr(rec[3]);
   Edit6.Text := InttoStr(rec[7]);

   Edit7.Text := InttoStr(rec[5]);
   Edit8.Text := InttoStr(rec[6]);
   Edit9.Text := InttoStr(rec[8]);


   Image2 := caller[2]; // schätze mal hier fehlt was wieß nur nicht was

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
       Randomize;
end;


end.
sobald ich die bilder aus dem array aufrufen will sagt er mir das der zeiger falsch sei

DeddyH 15. Okt 2014 07:57

AW: Array of Tpicture?
 
Dynamische Arrays beginnen immer mit Index 0 und nicht 1, d.h. Deine Schleifenvariablen sind falsch belegt. Tipp: immer mit High() und Low() arbeiten, dann können Dir die Indizes so gut wie immer wurscht sein.

Kuehter 15. Okt 2014 08:06

AW: Array of Tpicture?
 
Ok das funktioniert jetzt mit den Zeigern danke für den Tipp :thumb:

hoffe ich geh euch nicht zu sehr auf den zeiger weil ich habe noch eine weitere frage denn die bilder die geladen werden werden nicht angezeigt :(

warum ?

DeddyH 15. Okt 2014 08:16

AW: Array of Tpicture?
 
Wo sollen die denn auch angezeigt werden? Du hast da irgendwelche globalen Variablen (allerdings ohne das Var-Schlüsselwort, eigentlich wäre das ja dann noch eine Tydeklaration, dass der Compiler da nicht meckert :gruebel:) definiert, die zwar vom Typ TImage sind, aber nirgends erzeugt werden. Und selbst wenn sie erzeugt werden, musst Du immer noch einen Parent zuweisen, der für die Darstellung zuständig sein soll. Dieser Parent muss vom Typ TWinControl sein, also ein Festerhandle haben.

Kuehter 15. Okt 2014 08:21

AW: Array of Tpicture?
 
ok ich wollte mir das einfacher machen die bilder erkennt er sofort
Delphi-Quellcode:
Image1.Picture.LoadFromFile('Symbolik_1.jpg');
wenn ich das schreibe und zeigt sie auch direkt an
nur ich wollte die in ein array haben das unsortiert ist damit ich mit den bildern an sich noch arbeiten kann nur wenn ich die jetzt anzeigen lasse will habe ich keine ahnung wie ich das machen soll

Delphi-Quellcode:
type
  Tintegerarray = array of integer;
  Tpicarray = array of Timage;

function picload: Tpicarray;

var counter: integer;
    i,j,t: integer;

begin
  SetLength(result,9);

  for counter := Low(result) to high(Result) do
  begin
    Result[counter] := TImage.Create(nil);
    Result[counter].Picture.LoadFromFile('Symbolik_' + inttoStr(counter) + '.jpg');
  end;

  for counter := Low(result) to high(Result) do
  begin
    j := trunc(random(high(Result)))+Low(result);
    t := trunc(random(high(Result)))+Low(result);

    i := t;
    Result[t]:= Result[j];
    Result[j]:= Result[i];
  end;

end;


procedure TForm1.Button1Click(Sender: TObject);
var
  rec : TIntegerarray;
  caller : Tpicarray;

begin
    //Image1.Picture.LoadFromFile('Symbolik_1.jpg');
   rec := bedingung ;
   caller := picload;

   Image1 := Caller[0];
   Image2 := caller[2];

end;
dachte die anzeige kann man so machen wie das mit den arrays oder habe ich mich da getäuscht?

DeddyH 15. Okt 2014 08:28

AW: Array of Tpicture?
 
Du erzeugst die Images ja auch dynamisch, aber ohne ihnen einen Parent zuzuweisen. Wenn es immer dieselbe Anzahl von Images sein soll, wäre es doch einfacher, sie wie gewohnt auf das Formular zu klatschen und nur die anzuzeigenden Grafiken zufällig aus Deinem Array zuzuweisen. Übrigens solltest Du beachten, dass, wenn Du Dein Array freigibst bzw. die Dimensionen änderst, die enthaltenen Grafiken noch lange nicht freigegeben werden, Du fängst Dir also u.U. Speicherlecks ein. Ich würde an Deiner Stelle daher kein dynamisches Array, sondern eine TObjectList verwenden, da besteht diese Gefahr nicht, solange Du OwnsObjects nicht auf false stellst.

Blup 15. Okt 2014 08:32

AW: Array of Tpicture?
 
Ein TImage ist ein Steuerelement.
Ein TPicture ist ein Klasse die als Container für eine Grafik (TGraphic) in beliebigem Format dient.
Delphi-Quellcode:
type
  TPicArray = array of TPicture;
{...}
  {Die Grafik aus caller[2] in Image2.Picture übernehmen und anzeigen.}
  Image2.Picture.Assign(caller[2]);
Du musst nicht das Steuerelement austauschen, sondern nur die angezeigte Grafik.

Beim Beenden des Formulars nicht vergessen die einzelnen Objekte im Array wieder freizugeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz