![]() |
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:
wenn ich das prog dann aber starte und den button1 betätige gibt es eine zugriffs verletztung.
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; hat jemand ne ahnung warum? mfg mario |
Re: Array of Tpicture?
Man erzeugt die Instanzen so:
Delphi-Quellcode:
bilder[1] := TPicture.Create;
|
Re: Array of Tpicture?
jo danke :oops:
|
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:
sobald ich die bilder aus dem array aufrufen will sagt er mir das der zeiger falsch sei
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. |
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.
|
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 ? |
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.
|
AW: Array of Tpicture?
ok ich wollte mir das einfacher machen die bilder erkennt er sofort
Delphi-Quellcode:
wenn ich das schreibe und zeigt sie auch direkt an
Image1.Picture.LoadFromFile('Symbolik_1.jpg');
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:
dachte die anzeige kann man so machen wie das mit den arrays oder habe ich mich da getäuscht?
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; |
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.
|
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:
Du musst nicht das Steuerelement austauschen, sondern nur die angezeigte Grafik.
type
TPicArray = array of TPicture; {...} {Die Grafik aus caller[2] in Image2.Picture übernehmen und anzeigen.} Image2.Picture.Assign(caller[2]); Beim Beenden des Formulars nicht vergessen die einzelnen Objekte im Array wieder freizugeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 Uhr. |
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