![]() |
Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Habe folgenden Code, der folgende Fehlermeldung erzeugt - "Undefinierter Bezeichner: StopRec"
Die procedure ist doch deklariert, wieso dann die Fehlermeldung? Wer kann mir weiter helfen? Danke!
Delphi-Quellcode:
private
{ Private declarations } procedure StopRec; procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall; begin if (buffer <> nil) and (len = 0) then SendMessage(win, WM_INFO_UPDATE, 8, DWORD(PChar(buffer))); if (FileStream = nil) then StopRec; <------- if (buffer = nil) then FileStream.Free else FileStream.Write(buffer^, len); end; |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Codeausschnitt sieht komisch aus. Poste mal den Rest.
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Man kann natürlich auch soviel kürzen, dass man gar nichts mehr sieht.
Aber meine Glaskugel behauptet: Du hast eine Methode und versuchst nun in einer Procedure die Methode aufzurufen, was natürlich nicht klappt. Falls dir die Lösung nicht weiterhilft, informiere dich bitte über Procedure und Methoden und was der Unterschied zwischen diesen ist. Dann weisst du auch die Lösung deines Problems... |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
[StopRec != StatusProc ?] Blödsinn.
Und poste mal bitte alles, sieht wirklich komisch aus. Das private passt da nicht hin. Irgendwie, sieht so aus als wäre da kein Objekt. |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Zitat:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Nein wass davor kommt. Scheint ein Teil einer Klasse zu sein. dann fehlt aber das
Delphi-Quellcode:
und die freie Prozedur danach, welche nicht Teil der Klasse zu sein scheint und deshalb die Methode nicht so aufgerufen werden kann
end;
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Die Routine StopRec scheint eine methode einer Klasse zu sein, wen ich die ersten zwei zeilen richtig deute. Die Prozedur StatusProc ist aber keine Methode der Klasse, in der auch StopRec defeniert ist.
Zitat:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
StopRec ist eine Methode und kann nur durch eine Instanz der Klasse oder in einer Methode der Klasse aufgerufen werden.
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Habe diesen Code hier im Forum gefunden:
Delphi-Quellcode:
FileStream wollte ich in einer anderen procedure createn, deswegen anstatt " FileStream:= TFileStream.Create(FileNeme, fmCreate);" - StopRec
procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall;
begin if (buffer <> nil) and (len = 0) then Form1.Label5.Caption := PChar(buffer); // display connection status if (FileNeme = '') then exit; if (FileStream = nil) then FileStream:= TFileStream.Create(FileNeme, fmCreate); // create the file if (buffer = nil) then FileStream.Free // finished downloading else FileStream.Write(buffer^, len); end; |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Dann übergib den Stream doch als weiterer Parameter oder mache aus der freien Prozedur eine Methode
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Zitat:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Zitat:
Delphi-Quellcode:
procedure StatusProc( FileStream: TFileStream; buffer: Pointer; len, user: DWORD); stdcall;
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Danke Dir :thumb:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Aber die Fehlermeldung ist geblieben? :gruebel:
Vllt soll ich aus der freien Prozedur eine Methode machen, aber wie geht das? Wer kann mir helfen? |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Delphi-Quellcode:
T<Klasse> = class(<Superklasse>)
private { Private declarations } procedure StopRec; { public Methods } procedure StatusProc(buffer: Pointer; len, user: DWORD); ... end; ... procedure T<Klasse>.StatusProc(buffer: Pointer; len, user: DWORD); ... |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Wenn StopRec eine Methode einer Klasse ist, warum nicht einfach
Delphi-Quellcode:
aufrufen?
MeinePlayerKlasseVariable.StopRec;
Parameter und Art von Statusproc ändern mag wahrscheinlich die Bass.dll nicht, um die es hier geht. |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Gausi wie meinst du das, ich hab ja keinen Player im Programm? :gruebel:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Im Moment liegt hier noch ein Designproblem vor.
Wie schon geschrieben wurde, mach aus der Prozedur erstmal eine Methode, Markus zeigte zwei Posts davor, wie es funktioniert. Wenn dann mal alles in einer Klasse ist, sehen wir weiter. Bruchteilhafte Lösungen bringen in diesem Fall nicht viel, denn das was Gausi vorschlägt, geht erst, wenn das Designproblem behoben ist, ansonsten kann das nicht wirklich funktionieren. |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Gausi schreibt ja, dass die Bass.dll die Änderung nicht mag, deswegen dachte ich seine Lösung ist ohne Procedureänderung.
Na gut, ich versuch's. |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
In deinem Codeauschnitt weiter oben steht StopRec direkt unter private. Das lässt mich vermuten, dass StopRec eine private Methode einer Klasse ist. Da, wo ich sowas verwende, ist diese Klasse eine Player-Klasse, daher habe ich was von "MeinePlayerKlasseVariable" geschrieben. Ich würde jetzt vermuten, dass die Klasse mit der Methode StopRec deine Formklasse ist (also TForm1 oder so). Dann musst du halt
Delphi-Quellcode:
aufrufen. StatusProc selbst sollte nicht als Methode einer Klasse implementiert werden, da das Ding von der Bass.dll als Callback-Routine aufgerufen wird.
// MeinePlayerKlasseVariable.StopRec; // so nicht
Form1.StopRec; // sondern so |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Hab das jetzt so gemacht, aber irgendwie stürzt das Prog ab... :gruebel:
Delphi-Quellcode:
private
{ Private declarations } procedure StopRec; procedure TForm1.StopRec; var Root, CCRDir, ChannelDir, FileName : String; begin Root:=GetSpecialFolderForMP3(Handle, CSIDL_PERSONAL); CCRDir:='CCRadio Recordings'; ChannelDir:=Label4.Caption; FileName:=FormatDateTime('dd.mm.yy', date) + ' - ' + FormatDateTime('hh.nn.ss', time) + '.mp3'; ChannelDir:=StringReplace(ChannelDir, '\', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '/', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, ':', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '*', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '?', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '"', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '<', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '>', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '|', ' ', [rfReplaceAll]); if DirectoryExists(Root + '\' + CCRDir) then begin if DirectoryExists(Root + '\' + CCRDir + '\' + ChannelDir) then begin TFileStream.Create(Root + '\' + CCRDir + '\' + ChannelDir + '\' + FileName, fmCreate); end else if (not CreateDir(Root + '\' + CCRDir + '\' + ChannelDir)) then begin SaveDialog1.FileName:=FileName; if SaveDialog1.Execute then //WaveStream.SaveToFile(SaveDialog1.FileName); end else begin CreateDir(Root + '\' + CCRDir + '\' + ChannelDir); TFileStream.Create(Root + '\' + CCRDir + '\' + ChannelDir + '\' + FileName, fmCreate); end; end else if (not CreateDir(Root + '\' + CCRDir)) then begin SaveDialog1.FileName:=FileName; if SaveDialog1.Execute then //WaveStream.SaveToFile(SaveDialog1.FileName); end else begin CreateDir(Root + '\' + CCRDir); if DirectoryExists(Root + '\' + CCRDir + '\' + ChannelDir) then begin TFileStream.Create(Root + '\' + CCRDir + '\' + ChannelDir + '\' + FileName, fmCreate); end else if (not CreateDir(Root + '\' + CCRDir + '\' + ChannelDir)) then begin SaveDialog1.FileName:=FileName; if SaveDialog1.Execute then //WaveStream.SaveToFile(SaveDialog1.FileName); end else begin CreateDir(Root + '\' + CCRDir + '\' + ChannelDir); TFileStream.Create(Root + '\' + CCRDir + '\' + ChannelDir + '\' + FileName, fmCreate); end; end; //RecordStatus:=False; end; procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall; begin if (buffer <> nil) and (len = 0) then SendMessage(win, WM_INFO_UPDATE, 8, DWORD(PChar(buffer))); if (FileStream = nil) and RecordStatus=True then Form1.StopRec; if (buffer = nil) then FileStream.Free // finished downloading else FileStream.Write(buffer^, len); end; |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Was heist abstürzen? es gibt sicherlich auch eine Fehlermeldung!
Warum postest du immer nur Codefragmente, die immer weitere Fragen offenlassen. Ist die Definition am Anfang, die der Klasse TForm1? |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist der ganze Code der die Aufnahme betrifft...
Die Fehlermeldung am Anhang. |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Zitat:
Debugge dein Programm einmal, dann siehst du, in welcher Zeile der Fehler auftritt. Der Fehler weist auf den Zugriff auf ein nicht instantiiertes Objekt hin ( 0 = nil) |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Ich würde einfach tippen, dass das Programm durch das DirectoryExists-Gewusel nicht durchblickt und deshalb den FileStream nicht erzeugt, in den später was geschrieben wird. :stupid: Probier mal, den Code mit ForceDirectories aufzuräumen.
Außerdem: es muss heißen
Delphi-Quellcode:
Stürzt das Programm ab, oder bricht die Compilierung ab? Denn die Fehlermeldung am Anfang ist doch eine Compiler-Fehlermeldung, oder nicht? Edit: Anhang nicht gesehen.
Filestream := TFileStream.Create( .... );
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Verzeih, hab mich falsch ausgedruckt, das Prog startet ohne Fehler, es stürzt beim Play eines Senders, wärend es mit ihm connectet wird.
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Zitat:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Zitat:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Hier
Delphi-Quellcode:
Pardon, werde mich ab jetzt besser und ausführlicher ausdrücken. :)
chan := BASS_StreamCreateURL(url, 0, BASS_STREAM_STATUS, @StatusProc, 0);
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Ich wüsste nicht, dass so ein Aufruf der bass.dll-Funktion eine Exception wirft.
Überleg doch mal, was du da machst. Erst wenn die Aufnahme gestoppt wird, erzeugst du den Filestream, in den du während der Aufnahme reinschreibst. Das kann doch gar nicht funktionieren. Von der fehlerhaften Erzeugung bzw. fehlenden Zuweisung an die Variable FileStream mal abgesehen. |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Ich hab diesen Code hier aus dem Forum, ich ging davon aus, der ist richtig, hab nur aus diesem:
Delphi-Quellcode:
diesen gemacht:
procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall;
begin if (buffer <> nil) and (len = 0) then Form1.Label5.Caption := PChar(buffer); // display connection status if (FileNeme = '') then exit; if (FileStream = nil) then FileStream:= TFileStream.Create(FileNeme, fmCreate); // create the file if (buffer = nil) then FileStream.Free // finished downloading else FileStream.Write(buffer^, len); end;
Delphi-Quellcode:
Der FileStream wird nur wo anders erstellt (in der StopRec) und fertig. :gruebel: Hm....
procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall;
begin if (buffer <> nil) and (len = 0) then SendMessage(win, WM_INFO_UPDATE, 8, DWORD(PChar(buffer))); if (FileStream = nil) and RecordStatus=True then Form1.StopRec; if (buffer = nil) then FileStream.Free // finished downloading else FileStream.Write(buffer^, len); end; |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Zitat:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Weiß ich nicht, aber wenn eine Prozedur StopRec heißt, würde ich annehmen, dass die was mit dem Stoppen der Aufnahme zu tun hat. Wenn du die ausführst, wenn die Aufnahme gestartet wird, ist das natürlich auch ok. ;-)
Hast du dort mittlerweile das/die "FileStream := " eingefügt? |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Hab die Aufnahme soweit fertig, es wird aber nicht auf nen Knopfdruck aufgenommen, sondern sofort wenn ein Sender abgespielt wird. Hat jemand eine Idee wie ich die Aufnahme mit einem Knopfdruck starte und stoppe? :gruebel:
Delphi-Quellcode:
private
{ Private declarations } procedure StopRec; procedure TForm1.StopRec; var Root, CCRDir, ChannelDir, FileName : String; begin Root:=GetSpecialFolderForMP3(Handle, CSIDL_PERSONAL); CCRDir:='CCRadio Recordings'; ChannelDir:=Label4.Caption; //FileName:='my.mp3'; FileName:=FormatDateTime('dd.mm.yy', date) + ' - ' + FormatDateTime('hh.nn.ss', time) + '.mp3'; ChannelDir:=StringReplace(ChannelDir, '\', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '/', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, ':', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '*', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '?', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '"', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '<', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '>', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '|', ' ', [rfReplaceAll]); ChannelDir:=StringReplace(ChannelDir, '.', '', [rfReplaceAll]); if DirectoryExists(Root + '\' + CCRDir) then begin if DirectoryExists(Root + '\' + CCRDir + '\' + ChannelDir) then begin //showmessage(Root + '\' + CCRDir + '\' + ChannelDir); Filestream:=TFileStream.Create(Root + '\' + CCRDir + '\' + ChannelDir + '\' + FileName, fmCreate); end else if (not CreateDir(Root + '\' + CCRDir + '\' + ChannelDir)) then begin SaveDialog1.FileName:=FileName; if SaveDialog1.Execute then //WaveStream.SaveToFile(SaveDialog1.FileName); end else begin CreateDir(Root + '\' + CCRDir + '\' + ChannelDir); Filestream:=TFileStream.Create(Root + '\' + CCRDir + '\' + ChannelDir + '\' + FileName, fmCreate); end; end else if (not CreateDir(Root + '\' + CCRDir)) then begin SaveDialog1.FileName:=FileName; if SaveDialog1.Execute then //WaveStream.SaveToFile(SaveDialog1.FileName); end else begin CreateDir(Root + '\' + CCRDir); if DirectoryExists(Root + '\' + CCRDir + '\' + ChannelDir) then begin Filestream:=TFileStream.Create(Root + '\' + CCRDir + '\' + ChannelDir + '\' + FileName, fmCreate); end else if (not CreateDir(Root + '\' + CCRDir + '\' + ChannelDir)) then begin SaveDialog1.FileName:=FileName; if SaveDialog1.Execute then //WaveStream.SaveToFile(SaveDialog1.FileName); end else begin CreateDir(Root + '\' + CCRDir + '\' + ChannelDir); Filestream:=TFileStream.Create(Root + '\' + CCRDir + '\' + ChannelDir + '\' + FileName, fmCreate); end; end; //RecordStatus:=False; end; procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall; begin if (buffer <> nil) and (len = 0) then SendMessage(win, WM_INFO_UPDATE, 8, DWORD(PChar(buffer))); if (FileStream = nil) then Form1.StopRec; if (buffer = nil) then FileStream.Free // finished downloading else FileStream.Write(buffer^, len); end; |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Zitat:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Siehe Post #34
Kann mir keiner was dazu sagen? |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Vielleicht solltest du das so anpassen:
Delphi-Quellcode:
function TForm1.StopRec: TFileStream;
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
:gruebel:
|
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Du vermischst immer wieder freie Prozeduren/Funktionen mit Methoden, hantierst auf Variabeln, welche du im unheimlich geheimen Teil, den du uns weiterhin unterschlägst ( vollständige Klassendeklaration).
Zudem schinst du noch weitere Do-Nots zu fröhnen wie globale Variablen, zumidest greifst du ständig auf Variablen zu, die weder lokale sind noch im rudimentären Klassenkopf sichtbar sind; da du auf diese auch in der freien Prozedur zugreifst vermute ich mal das diese global sind. |
Re: Fehler: Undefinierter Bezeichner! Wo liegt das Problem?
Ich bin Hobby-Programmierer, verzeih hab dein Post überhaupt nicht verstanden. :pale: :roteyes: :cry:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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