Autor Beitrag
Smartie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 205



BeitragVerfasst: Fr 10.06.05 08:32 
Hallo,

mein COM-Port läuft inzwischen soweit recht gut. Nur ein kleines Problemchen ist übrig geblieben:

Ich habe ja folgende Routine für meinen COM-Port am Laufen, udn die läuftauch herrlich:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
{-----------------------------------------------------------------------------
  Procedure : COM-Port
  Version   : Alfa

  Resultat  : Auslesen der Daten vom COM
-----------------------------------------------------------------------------}

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  I : Word;
  C : Char;
  S : String;

begin
  RS232Activate  := True;   // Erst JETZT auf true gesetzt
  Timer1.enabled := False; // Neustart des Timers, sehr wichtig!!
  Timer1.enabled := True;
  S := '';

  for I := 1 to Count do begin  
    C := ApdComPort1.GetChar;
    case C of
      #0..#31 : S := S + C ; //Absichtlich gesondert, um es zu verdeutlichen
      else S := S + C;       //also bitte nicht anmekern :)
    end;
  end;
  tempBuffer := tempBuffer + S;   //Erst temporär
  if tempBuffer = (#6+#48) then
  begin
    ApdComPort1.OutPut := #02 ;  //Bestätigung
  end;
  //DatenString wird erst später deklariert

end;


So, jetzt liest er wundervoll, es ist eine gar herrliche Komunikation geworden zwischen Computer und dem Gerät... solange ich nru etwas vom Gerät an Informationen will.
Lesen kann er einwandfrei, er konvertiert auch schön brav, also besser als ich es am Angfang des Projektes zu hoffen wagte.

Hehe, nur, ähm... jetzt will ich Ihn auch beschreiben, und er mekert... mein Computer. (Ich habe schon vermutet beim Lesevorgang hab sich der Computer in das Gerät verliebt, und will nicht, daß ich den Chip seines geliebten Gerätes überschreibe).


Ich denke mal, es könnte daran liegen, daß ich den Befehl nicht mehr im onclick des button selbst habe, sondern in einer eigenen Prozedur.
Diese sieht wie folgt aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure Daten_Schreiben(Daten: String);
var ApdComPort1: TApdComPort;
    Befehl : String;
begin
   tempBuffer := '';  //damit der sicher leer ist
   Befehl := 'W0000' + Linksnuller(Daten);  //Befehlszeile für das Gerät
   Befehl := Befehl + Exor(Befehl);  //Linksnuller und Exor sind notw. Fkt.
   ApdComPort1.OutPut := Befehl;  //Hier meckert er.
   if tempBuffer = (#6+#48) then
   begin
   sleep(50);  // Wart mal kurz, bis der Balluff seine Quittung zurück sendet
   ApdComPort1.OutPut := Daten + Exor(#2 + Daten);
   end;
end;


Er bringt vorher ein Warning:
[Warnung] Unit1.pas(891): Variable 'ApdComPort1' ist möglicherweise nicht initialisiert worden

Ich denke mal ,da liegt der Hund im Pfeffer begraben, weiter komm ich aber nicht.
Wenn ic hdas Program mausführe, brignt er genau an dieser Stelle einen Adressierungsfehler.

Wäre dankbar wenn mir jemand weiter helfen könnte

Herzlichen Gruß und vielen Dank

Smartie
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 10.06.05 08:39 
Du musst deine Prozedur im Private-Bereich deiner Form definieren. Dann schmeißt du die Variable in der lokalen Deklaration weg. Die ist so nämlich wirklich nicht initialisiert.
Etwa so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Type
  TForm1 = classe (TForm)
...
  private
    procedure Daten_Schreiben(Daten: String);
...
  end;


procedure TForm1.Daten_Schreiben(Daten: String);
var
  Befehl : String;
begin
...
end;


Ergänzung:
Bevor jetzt wieder jemand kommt und schreibt, dass es auch einfacher und schneller geht: Ja, ich weiß!
Aber hier ist OOP angesagt! Wenn man sich daran gewöhnt, passieren solche Dinge nicht mehr.
Smartie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 205



BeitragVerfasst: Fr 10.06.05 08:48 
Jetzt bringt er:

[Hinweis] Unit1.pas(54): Das private-Symbol 'Daten_Schreiben' wurde deklariert, aber nie verwendet
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 10.06.05 08:51 
Schau dir mal die Zeile 10 genau an. Da steht vor dem Prozedurnamen "TForm1.".
Smartie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 205



BeitragVerfasst: Fr 10.06.05 08:55 
Ok, danke, nur will er sie jetzt nicht aufrufen. Ich habe auch biem Auftruf das TForm1. vorne an gesetzt, aber nun birgnt er:

[Fehler] Unit1.pas(949): Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt



:nixweiss: :gruebel: :?!?:
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 10.06.05 09:02 
Aaalso:
Was du jetzt durch die Methodendeklaration gemacht hast ist folgendes:
Du hast dem Objekt TForm1 eine weitere Methode (Daten_Schreiben) geschenkt. Bei der Definition der Prozedur muss vor dem Methodennamen der Objektname stehen (TForm1).
Ich denke soweit bist du gekommen.
Innerhalb deines Objekts TForm1 kannst du alle Methoden (auch deine eigenen) ohne den Objekt-Namen aufrufen. Insbesondere darfst du nicht TForm1 benutzen, da das dein Typ-Bezeichner ist.

Innerhalb eines Objektes kennt das Objekt alle zugehörigen Methoden ohne Objekt-Bezeichner. Du weißt ja auch, was dein Arm ist. Du musst deinem Gehirn ja auch nicht sagen: "Hey Smarties Arm, beweg dich".
Smartie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 205



BeitragVerfasst: Fr 10.06.05 09:07 
Dann bringt er:

[Fehler] Unit1.pas(949): Undefinierter Bezeichner: 'Daten_Schreiben'

PS: Der Port ist übrigens folgendermaßen deklariert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Label9: TLabel;
    Button2: TButton;
    Timer1: TTimer;
    ApdComPort1: TApdComPort;



... wenn das irgendwie weiterhilft.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 10.06.05 09:31 
Dass das so ist, habe ich auch angenommen.

Nochmal zum Prinzip:
Deine TForm1 kennt deine Port-Komponente (schließlich steht sie in der TForm1-Deklaration). Nun musst du deine Prozedur dort auch einbauen (in unserem Beispiel im private-Bereich).
Du kannst dann in allen Methoden (z.B. OnClick) alle Methoden von TForm1 aufrufen. Dabei schreibst du nirgends Form1 (schon gar nicht TForm1) davor.

Irgendwo muss noch hingeschrieben werden, was deine Methode macht.
Dort muss vor dem Methodennamen TForm1 davor stehen. Aber nur da und nicht beim Aufruf der Methode.

Schau dir deinen Source mal unter diesen Aspekten an.
Smartie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 205



BeitragVerfasst: Fr 10.06.05 09:36 
O, jetzt verstehe ich, wir haben ein wenig auch aneinander vorbeigequatscht:

Diese Prozedur wird in einer anderen Prozedur aufgerufen,und erst DIE ist in der On-Click eines Objektes vorhanden.

Ich denke, das ist das Problem.

Beim Button steht "Wen ngedrückt, führe funktion Schreibbefehl aus",

in der Prozedur Schreibbefehl, steht an stelle x : Führe nun die Prozedur Daten_Schreiben aus".
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 10.06.05 09:44 
Stimmt. Dann musst du deine Methode mit Form1.Daten_Schreiben(..) aufrufen.
Dann sollte es funktionieren.
Smartie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 205



BeitragVerfasst: Fr 10.06.05 09:50 
Nein, aber ich habe etwas anderes gemacht, ich habe die "Hauptprozedur" ebenfalls in private gesetzt, udn so behandelt wie die andere, und jetzt funktionierts *freu*

Tausend dank,

Lieben Gruß

Smartie
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 10.06.05 09:52 
user profile iconSmartie hat folgendes geschrieben:
Nein, aber ich habe etwas anderes gemacht, ich habe die "Hauptprozedur" ebenfalls in private gesetzt, udn so behandelt wie die andere, und jetzt funktionierts *freu*

Tausend dank,

Lieben Gruß

Smartie

So ist es mir persönlich auch lieber. OOP lässt Grüßen.