![]() |
TImage EAccessViolation
Hallo,
ich versuche mich grad am Scannen mehrerer Seiten mit ![]() Hier klappt es dann leider nicht mehr:
Delphi-Quellcode:
Ich bekomme immer eine EAccessViolation. Wer kann mir sagen warum?
procedure TForm1.DelphiTwain1TwainAcquire(Sender: TObject;
const Index: Integer; Image: TBitmap; var Cancel: Boolean); Var T1 : TImage; begin // Und wieder eine Seite... Inc(Zaehler); // Image im Formular anlegen If T1=nil Then Begin T1:=TImage.Create(Form1); //T1:=TImage.Create(Form1); T1.Left:=8; T1.Top:=8; T1.Width:=73; T1.Height:=105; T1.Stretch:=True; T1.AutoSize:=False; End; //Copies the Image parameter to the TImage T1.Picture.Assign(Image); -> Zugrissverletzung //Image1.Picture.Assign(Image); -> So lief es //We only want the first image Cancel:=True; end; Gruß und Danke im Voraus, Alex |
Re: TImage EAccessViolation
Delphi-Quellcode:
T1.Parent := Form1;
|
Re: TImage EAccessViolation
Danke erstmal für die Antwort.
Zitat:
Delphi-Quellcode:
Ich glaube auch, dass das keine Rolle spielen sollte, da ich dem TImage mit TImage.Create(Form1); explizit sage, dass er zu Form1 gehört...
Inc(Zaehler);
// Image im Formular anlegen If T1=nil Then Begin T1:=TImage.Create(Form1); T1.Parent:=Form1; T1.Left:=8; T1.Top:=8; T1.Width:=73; T1.Height:=105; T1.Stretch:=True; T1.AutoSize:=False; End; //Copies the Image parameter to the TImage T1.Picture.Assign(Image); |
Re: TImage EAccessViolation
Und bei
Delphi-Quellcode:
?
T1.Picture.Bitmap.Assign(Image);
|
Re: TImage EAccessViolation
Hallo DeddyH
Zitat:
Delphi-Quellcode:
schließlich auch ohne .Bitmap.
Image1.Picture.Assign(Image);
Nur weil ich TImage zur Laufzeit anlege, dürften doch keine anderen Befehle notwendig werden, oder? :gruebel: |
Re: TImage EAccessViolation
Kann es evtl. sein, dass das Image gar nicht erzeugt wird? Ich verstehe eh nicht, wieso Du eine lokale Variable auf nil prüfst, es muss ja sowieso erzeugt werden.
|
Re: TImage EAccessViolation
Zitat:
Thread 1 - Neues TImage anlegen - Ergebnis des Scanners reinschreiben Ende Thread 2 - Schauen ob TImage(s) vorhanden sind - Nach png wandeln - Abspeichern - betreffendes TImage löschen Ende Dazu muss ich zur Laufzeit TImage anlegen, weil ich nicht wissen kann, wieviel Seiten der Benutzer auf den Scanner gepackt hat. |
Re: TImage EAccessViolation
Aber dann ist der Ansatz mit einer lokalen Variablen falsch. Falls Du ggf. mehrere dynamisch erzeugt Images brauchst, könntest Du ja beispielsweise eine TObjectList verwenden.
|
Re: TImage EAccessViolation
Danke!
Zitat:
Zitat:
![]() Gruß, Alex |
Re: TImage EAccessViolation
Ich habe gerade unter Delphi 5 nachgesehen, da gibt es TObjectlist bereits.
|
Re: TImage EAccessViolation
Hi,
Dazu sollte man erwähnen, dass er die Unit "contnrs" einbinden muss. Gruß Neutral General |
Re: TImage EAccessViolation
Das steht aber in der Hilfe (und die ist unter Delphi 6 ja noch zu gebrauchen ;)).
|
Re: TImage EAccessViolation
Das mit der TObjectList habe ich jetzt eingebaut. Leider aber nicht richtig. Denn ich bekomme jetzt eine Zugriffsverletzung. Syntaxfehler kann ich nicht ausmachen. Der Code wird ohne zu murren kompiliert.
So funktionierte es ...
Delphi-Quellcode:
und so funktioniert es nicht mehr ...
Procedure Speichern;
Var PNG :TPNGObject; Begin // Vom Scanner holen // Image1 ist vom Typ TImage // Image ist vom Typ TBitmap Image1.Picture.Assign(Image); // Speichern PNG.Assign(Image1.Picture.Graphic); End;
Delphi-Quellcode:
Kleine Erklärung:
Procedure Speichern;
Var PNG :TPNGObject; Begin // Bilder ist vom Typ TObjectList und wurde zuvor mit // Bilder:=TObjectList.Create; sowie // Bilder.OwnsObjects:=True; angelegt. // Image ist wieder vom Typ TBitmap Bilder.Add(Image); // Erstes Bild Speichern PNG.Assign(TBitmap(Bilder.Items[0])); End; Ich wollte mit dem zweiten Beispiel nicht den Weg über TImage gehen. Zum einen ist das Bild sowieso vom Typ Bitmap. Zum anderen muss ich das Bild dann verstecken, weil TImage.Create(X); in X immer ein Argument z.B. Form1 haben will und es dort dann auch anzeigt. Zusätzliche Frage: Ich vermute, dass das übergeben Image nur ein Pointer ist. Es ist daher nicht auszuschließen, dass es beim nächsten Aufruf des Ereignisses durch die TWAIN den Inhalt überschreibt. Wenn ich TObjectList richtig verstehe, ist das selbst auch wieder nur eine Liste von Pointern. Wie kann ich sicher stellen, dass ich auch wirklich den Inhalt in der Liste gespeichert habe. Wie komme ich an den Inhalt der TObjectList ran? Gruß, Alex |
Re: TImage EAccessViolation
Außer, dass Du das TPngObject nicht anlegst, kann ich auch nichts entdecken. Und TObjectlist enthält eine Liste mit Instanzen, welche ja auch nur Pointer sind. Heran kommst Du ganz normal über den Index, ggf. musst Du halt casten.
|
Re: TImage EAccessViolation
Zitat:
|
Re: TImage EAccessViolation
In welcher Zeile knallt es denn genau?
|
Re: TImage EAccessViolation
@DeddyH
Bei dem Code-Schnipsel in Zeile 10, weil das Object zwar da aber leer war (Siehe unten). :cheers: Ich habe es geschafft. Mein Denkfehler (mal wieder). Es reicht nicht, ein Object anzulegen, sondern ich muss es auch füllen! Richtig muss also so heißen:
Delphi-Quellcode:
P.S.
Procedure Speichern;
Var PNG :TPNGObject; Begin // Typen wie vor Bilder.Add(TBitmap.Create); // Und jetzt der Inhalt ... TBitmap(Bilder.Last).Assign(Image); // Erstes Bild Speichern PNG.Assign(TBitmap(Bilder.Items[0])); End; Zitat:
DANKE an ALLE |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:59 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 by Thomas Breitkreuz