Thema: Delphi (Funktionsschlage?)

Einzelnen Beitrag anzeigen

mklenk94

Registriert seit: 25. Sep 2012
6 Beiträge
 
#1

(Funktionsschlage?)

  Alt 21. Aug 2013, 18:43
Hallo Delphi-Community,

Zuerst mal mein Plan:

mein derzeitiges Projekt beschäftigt sich mit der Kommunikation zwischen einem Mikrokontrollers und dem PC über die serielle Schnittstelle. Senden und empfangen klapp bereits ganz gut. Nun bin ich bei den Interaktionen, die abwechselnd Aktionen von Controller und PC erfordern. Bsp: Register Lesen:
Der PC sendet Zeichen 'l';
PC wartet auf Zeichen '=' vom PC;
PC sendet gewünschte Registeradresse;
PC wartet auf den Wert der Registeradresse;


Nach vielem Gebastle wollte ich eine Ordentliche und Unvierselle Lösung entwickeln.
Mein Plan sieht so aus: Ich habe eine Queue mit Funktionen, die am anfang gefüllt wird. Wird vom PC ein Zeichen empfangen, so wird eine Funktion aus der Queue genommen und mit dem Empfangenen Zeichen als Parameter ausgeführt.

Für das obrige Beispiel sieht das dann so aus:
Ich brauche die Funktion Read(s:string) die das Zeichen mit '=' vergleicht, falls erfolgreich dann die gewünschte
adresse sendet
Und eine 2t. Read(s:string) funktion, die dann irgendwas mit der gelesenen Adresse macht

Eine Initialisierungfunktion fültt die Queue mit den beiden Read funktionen

bei Zeichenempfang wird eine Funktion aus der Queue genommen und mit dem Zeichen als Parameter ausgeführt.

Zusätzlich plane ich noch eine ObjectQueue, in der Objekte, auf die die Funktionen zugreifen können, zu speichern (z.B. label in die Queue, um in der funktion Read ein Label zur ausgabe einzubinden)

somit kann man sich aus relativ wenigen Grundfunktionen (Read,...) verschiedene Aktionen zusammenstellen.

Nun zu Praxis: die Queue Klasse hab ich selbst geschriebe, weil ich nach längerem Suchen keinen Code im Netz gefunden habe, sondern nur Foren-Threads.

hier nun der Relevante Code:

zuerst die Queue unit:
Code:
...
type

  THandleFunction = procedure (s:string)of object;

  TFunctionQueue =class(TObject)
    private
      items: array[1..30] of procedure (s:string)of object;
      s:integer;
    public
      constructor create;
      procedure  get:THandleFunction;
      procedure  enqueue(o:THandleFunction);
  end;

  implementation

constructor TFunctionQueue.create;
begin
  inherited create;
  s:=0;
end;

procedure TFunctionQueue.enqueue(o:THandleFunction);
begin
  if s>30 then
    begin
      s:=s+1;
      items[s]:=o;
    end;
end;

function  TFunctionQueue.get:THandleFunction;
var i:integer;
begin
  if s > 0 then
    begin
      result:=items[1];
      for i:= 1 to s-1 do
        begin
          items[i]:=items[i+1]
        end;
      s:=s-1;
    end
  else result:=nil;
end;
und hier die ausführungs-unit:

Code:

HandleFunctionQueue:TFunctionQueue;

unit AVRManager_U;

interface

uses
  SerialNG, GTypes_U, GManager_U,SysUtils, StdCtrls, Dialogs, Vektor, math;


type

 

  TAvrMan = class(TObject)
    private
     [COLOR="Red"] HandleFunctionQueue:TFunctionQueue;[/COLOR]
//      HandleObjectQueue:TObjectQueue;
      Connected:boolean;
      SerialPort:TSerialPortNG;
      GMan:TGMan;
      ConnectionFlag:boolean;



     

    public
      constructor create(SerialPort0:TSerialPortNG; GMan0:TGMan);
      function Connect:boolean;
      procedure SetPort(b:boolean);

      procedure SendString(s:string);
      procedure HandleInputString(S:string);
      procedure HandleCommandString(s:string; HandleFunction0:THandleFunction);

      function GetConnected:boolean;
      procedure ReadSensor(adr:Word;Edit1,Edit2:TEdit);


      procedure HandleDefault(s:string);
      procedure HandleRead(s:string);
      procedure HandleWrite(s:string);
      procedure HandleRange(s:string);
      procedure HandleHallo(s:string);
      procedure HandleOn(s:string);
  end;








implementation

constructor TAvrMan.create(SerialPort0:TSerialPortNG; GMan0:TGMan);
begin
  SerialPort:=SerialPort0;
  [COLOR="Red"]HandleFunctionQueue:=TFunctionQueue.create;[/COLOR]
//  HandleObjectQueue:=TObjectQueue.create;
  GMan:=GMan0;
  Connected:=SerialPort.Active;
  connect;
  ConnectionFlag:=false;

end;


procedure TAvrMan.SetPort(b:boolean);
begin
  if b = true
  then
    begin
      SerialPort.Active:=true;
      connected:=true;
    end
  else
    begin
      SerialPort.Active:=false;
    end;
end;


function TAvrMan.Connect:boolean;
begin
  SetPort(true);
end;

function TAvrMan.GetConnected:boolean;
begin
  result:=Connected;
end;



procedure TAvrMan.SendString(s:string);
var TempGMode:TGMode;
begin
if Connected = true
then
  begin
    if Length(s) > 0              then SerialPort.SendString(s);
    if GMan.GetGMode.AddTx = true then GMan.AddCommandoTerminalLine('[Sended]: '+s);
  end;
end;


procedure TAvrMan.ReadSensor(adr:Word;Edit1,Edit2:TEdit);
begin



end;


procedure TAvrMan.HandleDefault(s:string);
begin
  GMan.AddCommandoTerminalLine('DefalutHandle:  s='+s);
end;



procedure TAvrMan.HandleRead(s:string);
begin

end;

procedure TAvrMan.HandleWrite(s:string);
begin

end;

procedure TAvrMan.HandleOn(s:string);
begin

end;

procedure TAvrMan.HandleHallo(s:string);
begin

end;

procedure TAvrMan.HandleRange(s:string);
begin

end;



procedure TAvrMan.HandleCommandString(s:string; HandleFunction0:THandleFunction);
begin
  HandleFunction0(s);
end;




procedure TAvrMan.HandleInputString(S : String);
var AddS,showS:String; values1: array[1..13] of integer; i,j,k:integer; values2: array[1..7] of integer; phi:single;
     a,b:TVektor; [COLOR="Red"]NextHandleFunction:THandleFunction;[/COLOR]
begin
  AddS := Copy(S,0,length(S));
  i:=0;
  while (i<=(length(S))) do
    begin
      if (Adds[i]='"') and (Adds[i+1] = '"')
      then
        begin   //   Anfang Command Erkennung
        HandleFunctionQueue.enqueue(nextHandleFunction);
          showS:=Copy(AddS,i+2,Length(AddS));
         [COLOR="Blue"] NextHandleFunction:=HandleFunctionQueue.get;[/COLOR]
         [COLOR="Red"]HandleCommandString(showS,NextHandleFunction);[/COLOR]
        end;    //   Ende  Command Erkennung
      if (Adds[i]='!') and (Adds[i+14]='"')
      then
        begin   //   Anfang Value-Berechnung und GMan.Insert Value
          showS:=Copy(AddS,i+1,13);
          for j:=1 to 13 do
            begin

              values1[j]:=Ord(showS[j]);
            end;
          for j:=1 to 6 do
            begin
              values2[j]:=(((values1[2*j]*4))+((values1[2*j-1]) div 64));
              if (values2[j] >= 513) then begin values2[j]:=-512+(values2[j]-512); end;
            end;
          values2[7]:=values1[13];
        a:=VektorP(values2[1],values2[2],values2[3]);
        b:=VektorP(values2[4],values2[5],values2[6]);

        phi:=RadToDeg(ArcCos(Skalarprodukt(a,b)/(Betrag(a)*Betrag(b))));
        Gman.InsertValue(CreateValue(values2[1],values2[2],values2[3],values2[4],values2[5],values2[6],values2[7],phi));
        i:=i+14;
        end;  //   Ende Value-Berechnung und GMan.Insert Value

      i:=i+1;
    end;
end;


end.
beim Compilieren erhalte ich in der Blauen Zeile den Fehler [Fehler]
in den roten Zeilen gehts um das Problem

-_- anscheinend kann ich Code nicht färben denkt euch einfach das [Color:Red] /[...Blue] als farbig

AVRManager_U.pas(171): Inkompatible Typen: 'procedure, untyped pointer or untyped parameter' und 'THandleFunction'

Für Hilfe schon mal im Vorraus Danke!!

Mfg mklenk
  Mit Zitat antworten Zitat