![]() |
TMemoryStream - Create Problem
Hi,
ich habe wieder mal ein Problem :oops: und zwar folgendes... Ich möchte aus einer Datei Daten in einen TMemoryStream einlesen... das klappt auch, allerdings nur beim ersten mal - ich habe eine ListBox mit Dateinamen gefüllt. Wenn der Benutzer auf die Datei klickt, also auf die Liste, soll er den Inhalt der gewählten Datei einlesen. Ansatz: Ich habe Global ein TMemoryStream Objekt erstellt und rufe beim klick auf einen ListBox Eintrag folgendes auf: memstr := TMemoryStream.Create; memstr.LoadFromFile(STV1.Path + '\' + FList.Items.Strings[FList.ItemIndex]); Das Problem dürfte sein, dass beim klick auf einen anderen Eintrag, der memstr nochmal erstellt wird, obwohl er bereits vorhanden ist. - wie kann ich prüfen, ob er bereits erstellt wurde oder nicht. Wenn memstr noch nicht erstellt wurde, soll er es an dieser stelle machen. Ist memstr bereits erstellt, soll dieser gelöscht (eher geleert) werden, damit er die neu ausgewählte Datei in memstr einlesen kann. Hoffe, man kann das nachvollziehen. Vielen Dank an euch schon im voraus! |
Re: TMemoryStream - Create Problem
Warum machst du es denn nicht lokal in dem OnClick Ereignis der Listbox? :gruebel:
Aber um deine Frage zu beantworten: mit Assigned kannst du feststellen ob ein Zieger nil ist oder nicht. Sollte dann ungefähr so aussehen:
Delphi-Quellcode:
if Assigned(ms) then
ms.LooadFromFile(...) else begin ms := TMemoryStream.Create; ms.LoadFromFile(...); end; |
Re: TMemoryStream - Create Problem
Wie was machen?
Ich rufe doch die Funktionen von dort auf. Nur muss ich, wenn den User den Eintrag wechselt, den neuen Dateiinhalt in TMemoryStream einlesen. Das heißt, ich müsste wissen, ob das memstr objekt bereits erstellt wurde und ob ggf. Daten in memstr enthalten sind. Sollte das Objekt noch nicht erstellt worden sein, muss es erstellt werden - sind Daten schon drin, weil vorher eine Datei geladen wurde, müssen diese aus dem memstr gelöscht werden. Verstanden? Derzeit sieht der Code so aus: procedure TForm1.FLISTClick(Sender: TObject); begin memstr := TMemoryStream.Create; //wobei, wird jedesmal beim Klick erstellt (sinnlos, oder?) memstr.LoadFromFile(STV1.Path + '\' + FList.Items.Strings[FList.ItemIndex]); end; Er soll memstr := TMemoryStream.Create; nur ausführen, wenn es nicht exisitert. Das heißt, keine Datei zuvor geladen wurde. Ansonsten, wenn bereits eine Datei geladen wurde, soll er den Stream löschen und die neuen Daten einlesen... |
Re: TMemoryStream - Create Problem
Der Code klappt nicht, bekomme Zugriffsfehler...
Was noch interessanter ist: wenn ich z.b. eine Datei lade (klick auf die listbox) und danach nochmal auf die selbe Datei klicke, dann steht im Taskmanager bei zugesicherter speicher über 1000 MB - normalerweise liegt mein normalwert zwischen 170 - 230; Da scheint doch irgendwas gewaltig zu haken. Bitte helft mir, ich verzweifel langsam... :cry: Schon zig sachen probiert, nichts klappt. Vielen Dank! :thuimb: |
Re: TMemoryStream - Create Problem
Zitat:
Zitat:
|
Re: TMemoryStream - Create Problem
Wahrscheinlich kommt der Zugriffsfehler, weil die Variable am Anfang nicht nil ist,deklariere die Variable mal so:
Delphi-Quellcode:
var
ms : TMemoryStream = nil; |
Re: TMemoryStream - Create Problem
Also, er spuckt mir keinen Fehler aus, aber das Speicherproblem ist nach wie vor!
Wenn ich einmal auf die Datei klicke ist alles OK, nicht aber beim zweiten mal. Das Programm schießt von 9 MB kurzzeitig auf über 600 MB! - Das System zeigt mir dann, dass es 1000 MB zugesicherten Speicher verwendet. Hier der derzeitige Code:
Delphi-Quellcode:
Was ist das? Das ist doch wirklich zum :wall:
procedure TForm1.FLISTClick(Sender: TObject);
begin if Assigned(memstr) then begin memstr.LoadFromFile(STV1.Path + '\' + FList.Items.Strings[FList.ItemIndex]) end else begin memstr := TMemoryStream.Create; memstr.LoadFromFile(STV1.Path + '\' + FList.Items.Strings[FList.ItemIndex]); end; Danke! [edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit] |
Re: TMemoryStream - Create Problem
Hi Ralf,
versuch es doch mal so:
Delphi-Quellcode:
oder:
procedure TForm1.FLISTClick(Sender: TObject);
begin memstr := TMemoryStream.Create; //wobei, wird jedesmal beim Klick erstellt (sinnlos, oder?) memstr.LoadFromFile(STV1.Path + '\' + FList.Items.Strings[FList.ItemIndex]); memStr.Free; end;
Delphi-Quellcode:
PS: @Ralf bitte künftig den Code in die Delphi-Code-Tags ([ delphi] [ /delphi], natürlich ohne die Leerzeichen).
procedure TForm1.OnCreate;
begin memStr := TMemotyStream.Create; end; procedure TForm1.OnClose; begin memStr.Free; end; procedure TForm1.FListClick(Sender: TObject); begin memStr.LoadFromFile(STV1.Path + '\' + FList.Items.String´s[FList.ItemIndex]); end; |
Re: TMemoryStream - Create Problem
Danke euch vielmals, das Problem scheint doch ein anderes zu sein. Das ganze hat etwas mit einem Code zu tun, der später im Code aufgerufen wird. Daher öffne ich lieber einen neuen Thread, da es ein anderes Thema ist - Bitmaps.
Danke an euch für eure mühe! :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 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