AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TMemoryStream - Instanzbildung scheitert?
Thema durchsuchen
Ansicht
Themen-Optionen

TMemoryStream - Instanzbildung scheitert?

Ein Thema von Flips · begonnen am 8. Jan 2010 · letzter Beitrag vom 8. Jan 2010
Antwort Antwort
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#1

TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 14:52
Hi,

ich habe eine Prozedur aus dem Netz, welche einen MemoryStream nutzt. Dieser wurde lokal deklariert, am Anfang der Prozedur erzeugt und am Schluss freigegeben, so wie das sein sollte.
Jetzt bräuchte ich den Inhalt des Memorystream zur gesamten Laufzeit. Also dachte ich gut, deklarier ich ihn global (Habs als Attribut des Forms und als globale Variable der Unit probiert) und setze die Create (Free) Methode ins OnCreate (OnDestroy) des Forms.
Gesagt getan, Programm gestartet. Sobald ich jedoch dann den Stream benutzen will (bspw: Write), erscheint eine Zugriffsverletzung, welche ich früher zu genüge hatte, als ich nicht wusste, dass Objekte erzeugt werden müssen.

Doch wieso bekomme ich hier einen solchen Fehler, obwohl ich doch im OnCreate des Forms (was logischerweise auch ausgeführt wird, wenn ich das Form ja sehe) die Instanz erstelle?

Wie gesagt, wenn ich lokal in der Funktion bleibe dann klappt alles.

Hoffe Ihr könnt mir helfen.

Lg, Flips
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 14:56
Ohne Code wird das nichts. Theoretisch sollte es funktionieren, wenn die Variable als Feld der Formularklasse deklariert ist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#3

Re: TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 15:04
Ich habs jetzt mal quick'n'dirty per global Variable in der neuen Anwendung gemacht, da klappts auch...Aber keine Ahnung, wieso folgender Code etwas am Stream selbst ändert. Der Code ist übrigends dieser hier, nur für meine Zwecke ein wenig geändert.

Delphi-Quellcode:
 private
    FMS : TMemoryStream;
 public
    property MS : TMemoryStream read FMS write FMS;
  end;

[...]

procedure TForm2.GenerateSound(FromFQ, ToFQ, FQJumps, FQDuration: Integer; Volume: TVolumeLevel);
  {writes tone to memory and plays it}
var
  WaveFormatEx: TWaveFormatEx;
  MS: TMemoryStream;
  i, TempInt, DataCount, RiffCount, Frequency: integer;
  SoundValue: byte;
  w: double; // omega ( 2 * pi * frequency)
const
  Mono: Word = $0001;
  SampleRate: Integer = 44100; // 8000, 11025, 22050, or 44100
  RiffId: string = 'RIFF';
  WaveId: string = 'WAVE';
  FmtId: string = 'fmt ';
  DataId: string = 'data';
begin
  with WaveFormatEx do
  begin
    wFormatTag := WAVE_FORMAT_PCM;
    nChannels := Mono;
    nSamplesPerSec := SampleRate;
    wBitsPerSample := $0008;
    nBlockAlign := (nChannels * wBitsPerSample) div 8;
    nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
    cbSize := 0;
  end;

  with FMS do
  begin
    {Calculate length of sound data and of file data}
    DataCount := (ceil((ToFQ-FromFQ)/FQJumps) * FQDuration * SampleRate) div 1000; // sound data
    RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) +
      SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; // file data
    {write out the wave header}

    Write(RiffId[1], 4); // 'RIFF' -> ########################## Hier krachts
    Write(RiffCount, SizeOf(DWORD)); // file data size
    Write(WaveId[1], Length(WaveId)); // 'WAVE'
    Write(FmtId[1], Length(FmtId)); // 'fmt '
    TempInt := SizeOf(TWaveFormatEx);
    Write(TempInt, SizeOf(DWORD)); // TWaveFormat data size
    Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
    Write(DataId[1], Length(DataId)); // 'data'
    Write(DataCount, SizeOf(DWORD)); // sound data size
    {calculate and write out the tone signal} // now the data values
    Frequency := FromFQ;
    while Frequency <= ToFQ do
    begin
      w := 2 * Pi * Frequency; // omega
      Memo1.Lines.Add('Schreibe ' +inttostr(Frequency)+'Hz');
      for i := 0 to ((FQDuration * SampleRate) div 1000) - 1 do
      begin
        SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate)); // wt = w * i / SampleRate
        Write(SoundValue, SizeOf(Byte));
      end;
      inc(Frequency,FQJumps);
    end;

  end;
end;


procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FMS.Free;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
FMS := TMemoryStream.Create;
end;
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 15:05
Zitat von Flips:
Aber keine Ahnung, wieso folgender Code etwas am Stream selbst ändert.
Das verstehe ich jetzt nicht. Klappt es oder klappt es nicht?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#5

Re: TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 15:08
Der Code oben funktioniert so nicht.
Wenn ich jetzt ein neues Programm erstelle wo nix drin ist, nur ein MemoryStream als globale Variable (respektive Feld), den im OnCreate erstelle un dann in ner ButtonClick-Methode was damit mache, dann klappt das auch.

Deshalb wundert es mich, dass es nicht auch in oben gepostetem Code funktioniert...
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 15:25
Wie kracht es denn?

(In solchen Sachen besser nicht With verwenden. Wer weis, vielleicht wird hier ein ganz anderes write aufgerufen.)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#7

Re: TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 15:52
Ich habs mal trotz with noch über die Klasse selbst aufgerufen, gleiches Ergebnis.
Es kracht so, wies bei ner Zugriffsverletzung halt kracht^^, siehe Bild.
Miniaturansicht angehängter Grafiken
krach_213.jpg  
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#8

Re: TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 16:38
Delphi-Quellcode:
var
  ...
  MS: TMemoryStream; /// Ist hier der Bock ??? ///
  ...
const
Das könnte den Crash aus dem letzten Screenshot erklären.

HTH
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 16:50
Klassenmember unter eine Property veröffentlichen (MS) und dann eine lokale Variable deklarieren gleichen Typs und Namens (MS) ist schon sehr schlecht. Da zeigt es sich mal wieder, dass man lokale Variable vllt. ein Präfix geben sollte...
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#10

Re: TMemoryStream - Instanzbildung scheitert?

  Alt 8. Jan 2010, 17:15
Ich Idiot.
Das war keine Absicht, ich hab es einfach nur nicht gesehen -.-
Hab total vergessen, die lokale Deklaration zu löschen -.-

Danke dir...Mannmannmann das kommt davon, wenn man mal Tee statt kaffee trinkt...
Philipp F.
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:16 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