Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TImage EAccessViolation (https://www.delphipraxis.net/119456-timage-eaccessviolation.html)

Schwedenbitter 26. Aug 2008 22:34


TImage EAccessViolation
 
Hallo,

ich versuche mich grad am Scannen mehrerer Seiten mit TTwain. Das Scannen klappt, wenn ich schon beim Erstellen des Formulars ein TImage anlege, dem dann das Scanresultat zugewiesen wird. Mein Ziel ist es aber, mehrere Dokumente einzuscannen und da ich nicht weiß, wieviel der User auf den Scanner gepackt hat, muss ich die TImages zur Laufzeit anlegen. Ich will die später dann mittels Thread komprimieren und Speichern.

Hier klappt es dann leider nicht mehr:
Delphi-Quellcode:
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;
Ich bekomme immer eine EAccessViolation. Wer kann mir sagen warum?

Gruß und Danke im Voraus, Alex

mkinzler 26. Aug 2008 22:46

Re: TImage EAccessViolation
 
Delphi-Quellcode:
T1.Parent := Form1;

Schwedenbitter 27. Aug 2008 07:41

Re: TImage EAccessViolation
 
Danke erstmal für die Antwort.
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
T1.Parent := Form1;

Hat leider nichts gebracht. Die Fehlermeldung kommt wie eh und je. Vielleicht habe ich es auch an der falschen Stelle:
Delphi-Quellcode:
   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);
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...

DeddyH 27. Aug 2008 07:43

Re: TImage EAccessViolation
 
Und bei
Delphi-Quellcode:
T1.Picture.Bitmap.Assign(Image);
?

Schwedenbitter 27. Aug 2008 08:15

Re: TImage EAccessViolation
 
Hallo DeddyH
Zitat:

Zitat von DeddyH
Und bei
Delphi-Quellcode:
T1.Picture.Bitmap.Assign(Image);
?

Das hat leider auch nichts gebracht. Es sollte letztlich auch ohne .Bitmap klappen. Denn wenn ich das TImage bei der Erstellung anlege, dann klappt es mit dem Befehl
Delphi-Quellcode:
Image1.Picture.Assign(Image);
schließlich auch ohne .Bitmap.
Nur weil ich TImage zur Laufzeit anlege, dürften doch keine anderen Befehle notwendig werden, oder? :gruebel:

DeddyH 27. Aug 2008 08:19

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.

Schwedenbitter 27. Aug 2008 08:29

Re: TImage EAccessViolation
 
Zitat:

Zitat von DeddyH
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.

Ich dachte (<>Wissen), dass man mittels der Abfrage auf nil prüfen kann, ob das Object bereits auf dem Formular existiert; also erzeugt ist. Denn ich brauche die TImage nur, weil als Zwischenspeicher für die Scannerresultate. So stelle ich mir meinen Programmcode vor:

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.

DeddyH 27. Aug 2008 08:32

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.

Schwedenbitter 27. Aug 2008 09:59

Re: TImage EAccessViolation
 
Danke!
Zitat:

Zitat von DeddyH
Aber dann ist der Ansatz mit einer lokalen Variablen falsch.

Das ist mir jetzt auch aufgefallen. Ich komme sonst von den Threads nicht an die TImage(s) ran. Blöder Fehler von mir!

Zitat:

Zitat von DeddyH
Falls Du ggf. mehrere dynamisch erzeugt Images brauchst, könntest Du ja beispielsweise eine TObjectList verwenden.

Ich habe mir mal das hier angesehen und es liest sich vielversprechend. Bin (leider) grad auf Arbeit und kann es nicht ausprobieren. Es scheint nur ein Problem zu geben: Gibt es das unter Delphi 6 auch schon? Es sieht leider nicht danach aus :cry:

Gruß, Alex

DeddyH 27. Aug 2008 10:01

Re: TImage EAccessViolation
 
Ich habe gerade unter Delphi 5 nachgesehen, da gibt es TObjectlist bereits.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 Uhr.
Seite 1 von 2  1 2      

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