Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - eigene Funktion, undefinierter Bezeichner???


daywalker0086 - Sa 29.11.08 19:07
Titel: eigene Funktion, undefinierter Bezeichner???
So ich hab wieder ne FRage die hoffentlich nicht schwer zu beantworten ist.
ich hab folgende Funktion geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function temperaturanfordern: string;
var
sendstr, hexwert :string;
begin
      hexwert:= '52620300FFF902AF';   // 52 62 03 00 ff f9 02 AF        für die Tempi
      SendStr := hextostr(hexwert);

      SerialPortNG1.SendString(SendStr) ;
end;


da meckert er SerialPortNG1. und SendString(SendStr)
wäre ein undefinierter Bezeichner.
Ich verwende aber genau das gleiche in anderen Proceduren wie zum Bsp:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button3Click(Sender: TObject);  //Hier wird das Initialisierungskommando Ra -7 gesendet
var SendStr,hexwert: String;

begin


       hexwert:= '52610300FFF902AE';    //52610300FFF902AE
      SendStr := hextostr(hexwert);      
      SerialPortNG1.SendString(SendStr) ;


Da geht es ohne Probleme.
Warum meckert er da ?
Wie kann ich dieses Problem beseitigen?


jaenicke - Sa 29.11.08 19:14

Du müsstest es zu einer Funktion deines Formulars machen, dann kennt er auch alles was da drin ist. So wie du es jetzt hast ist es so, als wenn du auf der Straße stehst und den Herd anschalten willst. Du bist aber gar nicht in der Wohnung und weißt also gar nicht welcher Herd gemeint ist.

Dafür musst du oben in der Fomulardeklaration unter private oder public die Funktion deklarieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
TForm1 = class(TForm)
  // ...
private  
  function temperaturanfordern: string;
end;

Außerdem unten in der Implementierung dann

Delphi-Quelltext
1:
function TForm1.temperaturanfordern: string;                    


Die andere Möglichkeit ist vor jeden Aufruf von etwas im Formular Form1. davorzuschreiben um zu sagen, dass du auf etwas im Forumular zugreifen willst.

Delphi-Quelltext
1:
Form1.SerialPortNG1.SendString(...                    


Delete - Sa 29.11.08 19:16

Oder die beiden als Parameter an die Funktion zu übergeben.


daywalker0086 - Sa 29.11.08 19:32

Danke an euch habs so gemacht wie Jaenicke es gesagt hat.
Funktioniert natürlich :wink:
Ich danke euch wie verrückt.

Achso ich hätt da noch was kleines:
Kann ich irgendwie feststellen ob die Funktion schonmal ausgeführt wurde?
Also nach dem Scheme if temperaturanfordern.execute = true oder sowas?
Der Hintergrund ist der, das es eben nur einmal ausgeführt werden soll aber aus einer
Schleife aufgerufen wird.
Wenn nicht lass ich in der Funktion ne Variable setzen deren Wert ich dann prüfe


Delete - Sa 29.11.08 19:36

Zitat:
Der Hintergrund ist der, das es eben nur einmal ausgeführt werden soll aber aus einer Schleife aufgerufen wird.
Hä? :gruebel:


jaenicke - Sa 29.11.08 19:36

Dann ruf es doch vor der Schleife auf und speichere das Ergebnis in einer Variablen ;-).

Und nebenbei gehören neue Fragen in ein neues Thema ;-).


daywalker0086 - Sa 29.11.08 19:41

Also die Schleife empfängt laufend Daten von einer seriellen Schnittstelle und wertet diese aus.
Es muss aber einmal mitten zwischen zwei kommandos dieser bestimmte String der in der Funktion steht gesendet werden damit ich an bestimmte Daten komme, danach sendet meine steuerung die daten die ich mit dem String aus der Funktion anfordere automatisch.
Deswegen soll die Funktion nur einmal ausgeführt werden.