![]() |
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 |
AW: Kann SendString von serialng nur bedingt aufrufen
Zum ersten Fehler:
Versuch mal TForm1.SerialPortNG1.SendString(SendStr); Bezogen auf Zitat:
|
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] |
AW: Kann SendString von serialng nur bedingt aufrufen
BTW, das Sleep(1000) in Wait ist Nonsens.
|
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 |
AW: Kann SendString von serialng nur bedingt aufrufen
Delphi-Quellcode:
Edit: Das Sleep einfach rauslöschen
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; ![]() |
AW: Kann SendString von serialng nur bedingt aufrufen
Um es noch detaillierter darzustellen:
Delphi-Quellcode:
Und zu dem wait: such einmal hier in der DP nach Delay, davon sind einige Varianten zu finden.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 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