Autor Beitrag
WileECoyote
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Sa 20.08.05 00:01 
hallo,

ich dreh hier gleich durch...ich versuche, bilder aus einer datei zu laden.
diese sollen auf einer listenstruktur gespeichert werden und dann angezeigt werden...das mit dem laden klappt ja auch, die bilder sind da, (habe ich mit einem form geprüft, auf das ich das eingelesene bild geladen habe)...bis zu einem gewissen zeitpunkt...

hier erstmal meine prozedur zum einlesen der datei:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
function baumstruktur_einlesen;
var fs : TFilestream;
    ms : TMemorystream;
    mystrs : TStringstream;
    jpg : TJPegimage;
     text : TStringlist;
    size : cardinal;
    datei : file;
    temp : TSpeicherbaum2;
    ds : TSpeicherbaum;
    reader : TReader;
    i : integer;
begin
 baumstruktur_einlesen:=false;
 try
 fs:=tfilestream.Create(dateiname,fmopenread);
 ms:=tmemorystream.Create;
 mystrs:=TStringstream.Create('');
 fs.ReadBuffer(header,sizeof(header));
 i:=1;
 ds.Bild:=Tpicture.Create;
 ds.Bemerkung:=tstringlist.Create;
 ds.Hilfe:=TStringlist.Create;

 while i<=header.zeilen do
  begin
   jpg:=tjpegimage.Create;
   text:=tstringlist.Create;
   fs.Read(size,4);
   ms.CopyFrom(fs,size);
   ms.Position:=0;
   jpg.LoadFromStream(ms);
   ds.Bild.Assign(jpg);   //hier sind die bilder noch da
   fs.Read(size,4);
   mystrs.CopyFrom(fs,size);
   mystrs.Position:=0;
   text.LoadFromStream(mystrs);
   ds.Bemerkung.Assign(text);
   ds.Bemerkung[1]:=ds.Bemerkung[1]+inttostr(i);
   fs.Read(size,4);
   mystrs.CopyFrom(fs,size);
   mystrs.Position:=0;
   text.LoadFromStream(mystrs);
   ds.hilfe.Assign(text);
   fs.ReadBuffer(temp,sizeof(temp));
   ds.nummer:=temp.nummer;
   ds.frageincheckliste:=temp.frageincheckliste;
   ds.ebene:=temp.ebene;
   ds.kapitel:=temp.kapitel;
   ds.kapitellaenge:=temp.kapitellaenge;
   ds.unummer:=temp.unummer;
   ds.canchange:=temp.canchange;
   ds.ischecked:=temp.ischecked;
   ds.isquestion:=temp.isquestion;
   ds.isvisible:=temp.isvisible;
   ds.haengtabvon:=temp.haengtabvon;
   ds.Bewertung:=temp.Bewertung;
   ds.Gewichtung:=temp.Gewichtung;
   ds.question:=temp.question;
   insert_baum(root,aktueller,ds,tree,box);
   mystrs.Position:=0;
   ms.Clear;
   jpg.Free;
   text.Free;
   inc(i);
   end;
   baumstruktur_einlesen:=true;
   fs.Free;
   ms.Free;
   mystrs.Free;
   except on Exception do
    begin
     showmessage('Fehler beim Laden der Datei (Code (blabla))') ;
     baumstruktur_einlesen:=false;
    end;
   end;
end;


innerhalb diesewr prozedur schreibe ich den datensatz dann in die listenstruktur:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
function insert_baum;
begin
  if root = nil
  then
   begin
    //eingabenummer:=1;
    root:=make_blatt(Datensatz,treeview,scrollbox);
    aktueller:=root;
    //form1.Image1.Picture:=root.Bild;
    //form1.ShowModal;
   end
  else
   begin
    //eingabenummer:=hoechstenummersuchen;
    root.runter:=make_blatt(Datensatz,treeview,scrollbox);
    //form1.Image1.Picture:=root.Bild;
    //form1.ShowModal;                 //hier sind die bilder auch noch da
    root.runter.hoch:=root;
    root:=root.runter;
   end;

end;


function make_blatt;
var Tempelement : TBaumpointer;
    ms : TMemorystream;
    jpg: tjpegimage;
begin
 ms:=Tmemorystream.Create;
 jpg:=tjpegimage.create;
 new(Tempelement);
 tempelement.nummer:=datensatz.nummer;
 tempelement.frageincheckliste:=datensatz.frageincheckliste;
 tempelement.ebene:=datensatz.ebene;
 tempelement.kapitel:=datensatz.kapitel;
 tempelement.kapitellaenge:=datensatz.kapitellaenge;
 tempelement.unummer:=datensatz.unummer;
 tempelement.canchange:=datensatz.canchange;
 tempelement.ischecked:=datensatz.ischecked;
 tempelement.isquestion:=datensatz.isquestion;
 tempelement.isvisible:=datensatz.isvisible;
 tempelement.haengtabvon:=datensatz.haengtabvon;
 tempelement.question:=datensatz.question;
 tempelement.box:=make_box(tempelement,treeview);
 tempelement.Bild:=tpicture.Create;
 tempelement.Hilfe:=TStringlist.Create;
 tempelement.Bemerkung:=TStringlist.Create;
 tempelement.Gewichtung:=datensatz.Gewichtung;
 tempelement.Bewertung:=datensatz.Bewertung;
 if scrollbox<>nil
  then tempelement.zeile:=make_label(tempelement,scrollbox);
  tempelement.Bild:=(datensatz.Bild);
  //form1.Image1.Picture:=tempelement.Bild;            //hier sind die bilder auch noch da
  //form1.ShowModal;
  tempelement.Bemerkung.Assign(datensatz.Bemerkung);
  tempelement.hoch:=nil;
 tempelement.runter:=nil;
 make_blatt:=tempelement;
end;


sobald ich aber anschießend auf die bilder zugreifen will, sind sie weg...sprich, gleich, nachdem die funktion
baumstruktur_einlesen beendet wurde...werden denn da irgendwie nur adressen übergeben, und wenn ich in der funktion sage ms.free oder jpeg.free...gehen die verloren?

wäre echt sehr geil, wenn mir hierbei jemand helfen könnte...denn wie oben geschrieben...ich dreh sonst gleich durch, sitz da schon einige stunden an dem kram...

Gruß, Wile E.

_________________
Wer in diesem Beitrag Rechtschreibfehler findet...darf sie behalten
WileECoyote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Sa 20.08.05 00:47 
hallo nochmal,

ich habe das problem gelöst, aber ich verstehe das absolut nicht...

bin das programm jetzt beinehae zeilenweise durchgegangen und habe immer wieder meine bildvariable auf ein form geschrieben und es anzeigen lassen, um festzustellen, wo es verschwindet:

an dieser stelle ist es verschwunden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
 form1.Image1.Picture:=baumroot.Bild;
 form1.ShowModal;
 form1.Image1.Picture:=baumaktueller.Bild;
 form1.ShowModal;// hier sind die bilder noch da

          if baumaktueller.Bild.bitmap=nil  //********
           then
            begin
             self.Image.Picture:=nil;
             fhilfe.Label6.Visible:=true;
            end
           else   //bilder sind nicht nil, also ging er immer hier rein
            begin
           form1.Image1.Picture:=baumroot.Bild;   //hier waren die bilder weg
           form1.ShowModal;
           form1.Image1.Picture:=baumaktueller.Bild;
           form1.ShowModal;


             TMDICHild(mainform.activemdichild).Image.Picture:=baumaktueller.bild;

             //form1.Image1.Picture.Assign(baumaktueller.Bild);
             //form1.ShowModal;
             fhilfe.Label6.Visible:=false;
            end;


ich habe jetzt nur die if-bedingung geändert in:
ausblenden Delphi-Quelltext
1:
if baumaktueller.Bild=nil					


und jetzt verschwinden die bilder nicht mehr?
ist nicht mehr so wichtig jetzt, aber vielleicht könnte mir mal jemand erklären, warum das so passiert ist, es war schließlich nur eine if-abfrage, wie kann mir dadurch mein bild zerschossen werden?

danke und gruß,

Wile E.

_________________
Wer in diesem Beitrag Rechtschreibfehler findet...darf sie behalten
JRegier
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Sa 20.08.05 06:58 
Das ist schon ein Unterschied wenn du abfragst

ausblenden Delphi-Quelltext
1:
baumaktueller.Bild.bitmap:=nil					


oder

ausblenden Delphi-Quelltext
1:
baumaktueller.Bild:=nil					


Ich wollte mal Zeichenoperationen auf Bild ausführen und bekam immer ne Meldung: "Kein Bitmap vorhanden um zu Zeichnen" oder so ähnlich! Dann habe ich versucht mit

ausblenden Delphi-Quelltext
1:
Bild.Pisture.Bitmap.Assign(Bild.Picture.Graphic);					


dann hatte ich was als Bitmap da! Ansonsten wenn du jpg und sonstige Bildformate lädst und die haben ja eine Art Kompression dann hast du noch kein Bitmap! Aber wenn du bmp Format lädst dann hast du da ein Reines Bitmap das schon in der Eigenschaft Bitmap
untergebracht ist! :wink:

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.
WileECoyote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Sa 20.08.05 17:02 
hi,

ich habe ja keine zuweisung gemacht, sondern ein bool´schen vergleich...und da weder bild noch bitmap leer war, ist er eh immer in den else zweig gesprungen...darum gings ja auch nicht...sondern nach dem VERGLEICH war das bild in der ersten version in "baumaktueller" weg und bei der zweiten version nicht, habe ich mir ja anzeigen lassen...die frage ist also, wie kann da bild durch den VERGLEICH verschwinden, denn direkt vor der if-bedingung war es noch da, direkt dahinter nicht mehr????

gruß, wile E.

_________________
Wer in diesem Beitrag Rechtschreibfehler findet...darf sie behalten