AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bild lesen blockiert Datei?

Ein Thema von Phoenix · begonnen am 30. Mai 2007 · letzter Beitrag vom 30. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#1

Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 09:28
Folgendes Problemchen: Ich habe eine Funktion, die ein Bild lädt:

Code:
private void btnLoadImage_Click(object sender, EventArgs e)
{
  String basedir = FW.Instance.SysParams["Stammdaten.Pfade.Bilder"].Value;
  dlgOpenFile.InitialDirectory = basedir;

  if (dlgOpenFile.ShowDialog() == DialogResult.OK
    && Path.GetDirectoryName(dlgOpenFile.FileName) == basedir)
  {
    edFilename.Text = Path.GetFileName(dlgOpenFile.FileName);
    _image = new Bitmap(dlgOpenFile.FileName);
    btnPreview.Enabled = true;
  }
}

private void btnPreview_Click(object sender, EventArgs e)
{
  LabelPreviewHelper.ShowPreview(_image);
}
Letztere macht nix anderes, als das Image auf ein Formular zu patschen und es anzuzeigen.

Problematisch ist nun, dass das die Datei komplett blockiert. Will heissen selbst wenn ich da aufräume und das Image explizit freigebe, kann ich die Datei dennoch nicht umbennenen oder gar löschen, bis ich die Anwendung beende. Das finde ich etwas doof. Spätestens nachdem ich das Formular schliesse sollte die Datei wieder freigegeben werden. Was muss ich da noch machen?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 09:42
Eventuell verhält sich
Code:
new Bitmap
genauso wie ein FileStream, der die Datei ja auch erst wieder freigibt, wenn er selber wieder freigegeben wird. Du müsstest also das Bitmap wieder freigeben, wenn du es nicht mehr brauchst. Der GarbageCollector scheint da nicht ganz zu funktionieren, wie es scheint.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#3

Re: Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 09:44
...das wars.

Ein einfaches Image.Dispose() beim Schliessen vom Formular hat freilich nicht gereicht. Die GC manuell anzuschmeissen brachte dann den Erfolg. Strange. Danke
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#4

Re: Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 09:47
Hallo Sebastian,

unter Delphi-Referenz durchsuchenBitmap-Konstruktor (String) steht als Hinweis:
Zitat:
Die Datei bleibt gesperrt, bis die Bitmap freigegeben wird.
Leider macht der GC, was er will (genauer: wann er will). Auch durch "Freigeben" der Bitmap wird häufig erst aufgeräumt, wenn die Applikation beendet wird.

Unter Bitmap nach laden in Picturebox gesperrt? findest Du Hinweise zur Lösung.

Gruß Jürgen

PS. Inzwischen hast Du selbst einen Weg gefunden. Ich lasse meinen Beitrag wegen des weiteren Lösungswegs trotzdem stehen.
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 10:01
@Phoenix: Keine Ursache. Schön dass ich dir helfen konnte.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 10:14
Zitat von Phoenix:
Folgendes Problemchen: Ich habe eine Funktion, die ein Bild lädt:
Enthält mehrere Ecken, an denen man sich stoßen kann...
a) Sie benötigt zuviele lokale Privilegien (mag aber vielleicht nötig sein)
b) Der Konstruktor von SD.Bitmap ist von den Redmondern furchtbar dämlich implementiert worden.
Er öffnet einen Stream, aus dem er das Bild liest, aber gibt diesen nicht sofort wieder frei.
Da sie mal wieder(Wer erinnert sich an den schrecklichen ThreadPool in 1.1? ) irgendeinen Praktikanten rangelassen haben , musst du natürlich selbst ran:
Code:
private void btnLoadImage_Click(object sender, EventArgs e)
{
  String basedir = FW.Instance.SysParams["Stammdaten.Pfade.Bilder"].Value;
  dlgOpenFile.InitialDirectory = basedir;

  if (dlgOpenFile.ShowDialog() == DialogResult.OK)
  {
    if(!Path.GetDirectoryName(dlgOpenFile.FileName) == basedir))
      someErrorProvider.SetError((Control)sender, "WTF willst du in dem Ordner?");

    edFilename.Text = Path.GetFileName(dlgOpenFile.FileName);
 
    using(Stream stream = dlgOpenFile.OpenFile())
      _image = new Bitmap(stream);

    btnPreview.Enabled = true;
  }
}
Aber mal ganz btw: War das jetzt nicht, öhm offensichtlich? Ich meine du hast mehrere Overloads des Konstruktors. Der mit dem Dateinamen ist Schrott, aber der mit dem Stream wäre doch gleich die nächste Adresse gewesen.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#7

Re: Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 10:27
Ich hoffe, es war wenigstens eine hybsche Praktikantin. Zumindest die hier in Deutschland sind immer recht hybsch *g*

Naja, und wenn man den Stream dann noch closed, dann dürfte das auch wirklich so gehen.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 10:30
Zitat von Phoenix:
Ich hoffe, es war wenigstens eine hybsche Praktikantin. Zumindest die hier in Deutschland sind immer recht hybsch *g*
Bist du zum Jüdischen konvertiert?

Zitat:
Naja, und wenn man den Stream dann noch closed, dann dürfte das auch wirklich so gehen.
Hallo? Wenn ich Dispose auf einen geöffneten Stream ausführe passiert was?
Mönsch Sebastian, du arbeitest doch nicht erst seit gestern mit .Net...
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#9

Re: Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 10:33
Argl.. freilich..

Naja, ich arbeite nicht allzuviel mit using. Der implizite Dispose() - Aufruf war nicht so präsent wie er hätte sein sollen *g*

Aber was haben hybsche Mädels mit dem Jüdischen zu tun?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Bild lesen blockiert Datei?

  Alt 30. Mai 2007, 10:36
Zitat:
Naja, ich arbeite nicht allzuviel mit using.
Hatte ich fast befürchtet. Lass mich raten, du lässt deinen Code gerne in Finalizer rennen?
Zitat von Phoenix:
Aber was haben hybsche Mädels mit dem Jüdischen zu tun?
Hast du noch nie einen Mel Brooks Film gesehen?
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.
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