Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TMemoryStream - Create Problem (https://www.delphipraxis.net/26832-tmemorystream-create-problem.html)

FreewareFire 30. Jul 2004 00:56


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!

Luckie 30. Jul 2004 01:03

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;

FreewareFire 30. Jul 2004 01:15

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...

FreewareFire 30. Jul 2004 01:45

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:

Luckie 30. Jul 2004 02:22

Re: TMemoryStream - Create Problem
 
Zitat:

Zitat von FreewareFire
Er soll memstr := TMemoryStream.Create; nur ausführen, wenn es nicht exisitert.

Genau das sollte mein Code eigentlich machen.

Zitat:

Der Code klappt nicht, bekomme Zugriffsfehler...
Interessant wäre jetzt was für einer.

scp 30. Jul 2004 06:49

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;

FreewareFire 30. Jul 2004 08:22

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:
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;
Was ist das? Das ist doch wirklich zum :wall:

Danke!

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

Die Muhkuh 30. Jul 2004 08:27

Re: TMemoryStream - Create Problem
 
Hi Ralf,

versuch es doch mal so:

Delphi-Quellcode:
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;
oder:

Delphi-Quellcode:
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;
PS: @Ralf bitte künftig den Code in die Delphi-Code-Tags ([ delphi] [ /delphi], natürlich ohne die Leerzeichen).

FreewareFire 30. Jul 2004 09:27

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 04:40 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