Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Kann SendString von serialng nur bedingt aufrufen (https://www.delphipraxis.net/162568-kann-sendstring-von-serialng-nur-bedingt-aufrufen.html)

Gummikuh 29. Aug 2011 17:42

Kann SendString von serialng nur bedingt aufrufen
 
Hallo zusammen,

wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht...
Eigentlich funktioniert es mit dem senden recht gut,
aber nur, wenn der Aufruf in der Prozedur "SendBtnClick" erfolgt.

Versuche ich eine neue Prozedur zu schreiben, die ich innerhalb SendBtnClick aufrufe,
beschimpft mich Delphi mit diversen Fehlermeldungen.

Ich wollte etwas in der art wie:

Procedure dummi(Messagetype, Zeilennummer, Text : string);
var SendStr : string;
begin
sendstr := char(01)+Messagetype+char(02)+Zeilennummer+Text+ch ar(03)+char(13);
SerialPortNG1.SendString(SendStr);
end;

Und dann innerhalb von
procedure TForm1.SendBtnClick(Sender: TObject);
var...
begin
diverser code
dummi('V','1','Testtext');
end;

Das allerdings bringt nur folgende Fehlermeldung(en):
[Fehler] batch_tmc.pas(76): Undefinierter Bezeichner: 'SerialPortNG1'
[Fehler] batch_tmc.pas(76): Operator oder Semikolon fehlt
und zwar bereits in der Prozedur dummi.

Wo liegt der Fehler?

Vielen Dank und Gruss aus dem Bergischen Land
Michael

Delphi-Quellcode:
unit batch_tmc;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls, SerialNG, ToolWin, ComCtrls, Menus, Grids;

type
  TForm1 = class(TForm)
    SendBtn: TButton;
    SerialPortNG1: TSerialPortNG;
    OpenDialog1: TOpenDialog;
    ListBox2: TListBox;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    MCDateiAuswahl1: TMenuItem;
    DatendateiAuswahl1: TMenuItem;
    Beenden1: TMenuItem;
    Einstellungen1: TMenuItem;
    SeriellerPort1: TMenuItem;
    Timer1: TTimer;
    StatusBar1: TStatusBar;
    Memo1: TMemo;
    Label3: TLabel;
    Label1: TLabel;
    Label4: TLabel;
    verbleibend: TLabel;
    Panel1: TPanel;
    Button1: TButton;
    Label5: TLabel;
    procedure BasicSettingsBtnClick(Sender: TObject);
    procedure SendBtnClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure DatendateiAuswahl1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Dummiload(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  test: string;
  globalcount, rest,i,x : integer;
implementation

uses SerialNGBasic;
{$R *.DFM}

procedure TForm1.BasicSettingsBtnClick(Sender: TObject);
begin
  SerialNGBasicDLG.SetDLGData(SerialPortNG1);
  if SerialNGBasicDLG.ShowModal = mrOK then
  SerialNGBasicDLG.GetDLGData(SerialPortNG1);
end;

procedure wait (ms:Cardinal);
Var x: Cardinal;
Begin
x:=GetTickCount;
Repeat
Sleep(1000);
Application.ProcessMessages;
Until GetTickCount >= x+ms;
End;

procedure TForm1.SendBtnClick(Sender: TObject);
var SendStr : String;
i : integer;
begin
  i := globalcount;
  rest := i;
  verbleibend.Caption := inttostr(rest);
  SendStr := '';
  sendstr := char(01) + 'V' + char(02) + '01' + Memo1.Lines[0]+char(03) + char(13);
  SerialPortNG1.SendString(SendStr);
  if x = 5 then
  begin
    listbox2.Items.Delete(0);
    dec(x);
  end;
  listbox2.Items[x] := Memo1.Lines[0];
  Memo1.Lines.Delete(0);
  inc(x);
  dec(i);
  if i = 0 then showmessage('Ende der Liste');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SerialPortNG1.Active := False;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  SerialPortNG1.Active := True;
  x :=0;
end;


procedure TForm1.Beenden1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.DatendateiAuswahl1Click(Sender: TObject);
var dateiname: string;
begin
opendialog1.Execute;
dateiname := opendialog1.FileName;
if dateiname ='' then exit;
memo1.Clear;
Listbox2.Clear;
memo1.Lines.LoadFromFile(Dateiname);
memo1.ReadOnly := true ;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  StatusBar1.Panels[0].Text :='';
  StatusBar1.Panels[1].Text := FormatDateTime('dddd, d mmmm yyyy ',(Now()));
  StatusBar1.Panels[2].Text := FormatDateTime('hh:mm:ss',(Now()));
end;

procedure TForm1.Dummiload(Sender: TObject);
begin
  label5.Caption := inttostr(memo1.Lines.Count);
  globalcount := memo1.Lines.Count;
end;


end

schlagzu 29. Aug 2011 17:45

AW: Kann SendString von serialng nur bedingt aufrufen
 
Zum ersten Fehler:

Versuch mal TForm1.SerialPortNG1.SendString(SendStr);

Bezogen auf
Zitat:

Procedure dummi(Messagetype, Zeilennummer, Text : string);
var SendStr : string;
begin
sendstr := char(01)+Messagetype+char(02)+Zeilennummer+Text+ch ar(03)+char(13);
SerialPortNG1.SendString(SendStr);
end;

DeddyH 29. Aug 2011 17:46

AW: Kann SendString von serialng nur bedingt aufrufen
 
In einer regulären Prozedur sind die Komponenten Deines Formulars unbekannt, in einer Methode des Formulars hingegen nicht.

[edit] @schlagzu: Dazu müsste es aber eine Klassenmethode sein. [/edit]
[edit2] Streiche Klassenmethode, die Komponente müsste eine class property sein. [/edit2]

Bjoerk 29. Aug 2011 18:27

AW: Kann SendString von serialng nur bedingt aufrufen
 
BTW, das Sleep(1000) in Wait ist Nonsens.

Gummikuh 29. Aug 2011 19:15

AW: Kann SendString von serialng nur bedingt aufrufen
 
Hallo,
erstmal vielen Dank für die Antworten.
Nun geht es mir wie Faust; Da steh ich nun, ich armer Tor,und bin so klug als wie zuvor.
Als ich Turbo Pascal 5 gelernt habe, und man im Duisburger Zoo noch Dinosaurier(wie mich) bewundern konnte,da waren wir vielleicht in der Abendschule eine proppere Klasse, aber "class property", nee, soh'n Schweinkram gab's damals noch nicht ;-)
'tschuldigung, das wollte einfach raus...

Also, wie oben geschrieben, bin ich relativ unerfahren/unbedarft was Objektsprachen angeht.
Ich habe mein Prog. aufgebaut auf SerialNGBasisdemo, welches ich entsprechend abgespeckt/umgebaut habe. Wie mit scheint, ist es mir aus irgendeinem Grund unmöglich, "SerialPortNG1.SendString"
ausserhalb der Prozedur "TForm1.SendBtnClick" aufzurufen.

@Schlagzu
leider bringt "TForm1.SerialPortNG1.SendString(SendStr);" auch diverse Fehlermeldungen.
TForm1.SerialPortNG1[1].SendString[2](SendStr);
[1] Methodenbezeichner erwartet
[2] Operator oder Semikolon fehlt

@DeddyH
leider kann ich mit Deiner Info nichts anfangen.
Was habe ich falsch gemacht/was muss ich ändern?
Ich vermute, ich muss in dem Prog. SerialNG etwas aendern?

@Bjoerk
Mag sein, aber als ich merkte das es den guten, alten Delay aus TP5-Zeiten nicht mehr gab,
habe ich die kleine Prozedur Wait in den unendlichen Weiten des WWW gefunden; Jemand hatte es als Ressourcen-schonend beschrieben, falls dem nicht so ist, auch egal, da auf dem Rechner später nur mein Prog. laeuft.

Gruss
Michael

Bjoerk 29. Aug 2011 21:45

AW: Kann SendString von serialng nur bedingt aufrufen
 
Delphi-Quellcode:
type
  TForm1 = class(TForm)
   ..
  private
    Procedure dummi(Messagetype, Zeilennummer, Text : string);
  end;

var
  Form1: TForm1;
  test: string;
  globalCount, rest, I, X: integer;

implementation

uses
  SerialNGBasic;


{$R *.DFM}


Procedure TForm1.dummi(Messagetype, Zeilennummer, Text : string);
begin
  ..
end;
Edit: Das Sleep einfach rauslöschen

http://www.delphi-forum.de/topic_Dat...31b10594c1c2db

DeddyH 30. Aug 2011 07:11

AW: Kann SendString von serialng nur bedingt aufrufen
 
Um es noch detaillierter darzustellen:
Delphi-Quellcode:
type
  TDings = class
  private
    FFeld: integer; //privates Feld von TDings
    procedure TuWas; //eine Methode von TDings
  end;

procedure TDings.TuWas;
begin
  (* Da es sich hier um eine Methode des Objektes handelt, kann dieses auf seine eigenen Felder
     wie z.B. FFeld zugreifen, sie gehören ihm ja. *)
end;

procedure TuWasAnderes; //eine reguläre Prozedur
begin
  (* Hier ist nur das bekannt, was innerhalb der Unit öffentlich ist oder als Parameter
     übergeben wurde. *)
end;

procedure GanzWasAnderes(Dings: TDings);
begin
  (* Hier kann man nun auf die Felder und Methoden des übergebenen TDings-Objektes zugreifen. *)
end;
Und zu dem wait: such einmal hier in der DP nach Delay, davon sind einige Varianten zu finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 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