Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
Delphi 2007 Professional
|
Re: Aktuelle Daten der seriellen Schnittstelle anzeigen
2. Sep 2007, 00:55
In etwa so:
Delphi-Quellcode:
Thread.pas
...
type
TMessung = class(TThread)
private
{ Private-Deklarationen }
FRefreshValues : TNotifyEvent;
protected
procedure Execute; override;
procedure DoRefreshValues;
public
ComHandle : THandle;
MeineDatenausMessung : String;
property RefreshValues : TNotifyEvent read FRefreshValues write FRefreshValue;
end;
...
procedure TMessung.Execute;
...
buffer_len:=ReadDataFromCOMPort(ComHandle,buffer);
...
while frames in buffer do
...
Syncronize(DorefreshValues); // Ereignis syncrinisiert aufrufen
...
procedure TMessung.DoRefreshValues;
begin
IF Assigned(FRefreshValues) then FRefreshValues(self);
end;
---------------------------------------
unit1.pas:
...
TForm1 = class(TForm)
...
public
procedure OnRefreshValues(Sender : TObject);
....
end;
...
// irgentwo, wo der Thread creiert wird
Datenerfassung := TMessung.Create(True);
Datenerfassung.RefreshValues := self.OnRefreshValues;
...
procedure TForm1.StartClick(Sender: TObject);
begin
ComHandle := 0;
// Verbindung aufbauen
ok := ConnectToCOMPort(ComHandle,42, 4);
if ok = 0 Then
begin
Start.Enabled := False;
Stop.Enabled := True;
// ErfassungsThread starten
// Dieser aktualisiert auch die Oberfläche
DatenerfassungsThread.ComHandle := ComHandle;
DatenerfassungsThread.Resume;
end;
// Verbindung beenden
ok := DisconnectFromCOMPort(ComHandle);
end;
procedure TForm1.StopClick(Sender: TObject);
begin
Start.Enabled := True;
Stop.Enabled := False;
DatenerfassungsThread.Suspend;
end;
procedure TForm1.RefreshValues(Sender: TObject);
Var Text : String;
begin
Text := TMessung(Sender).MeineDatenausMessung;
...
end;
Wenn du die Daten direkt hochschicken willst, dann mußt du dir eine eigene Procedure definieren.
Delphi-Quellcode:
Thread.pas
...
type
TRefreshValues = procedure (Sender : TObject; Daten : String) of Object;
TMessung = class(TThread)
private
{ Private-Deklarationen }
MeineDatenausMessung : String;
FRefreshValues : TRefreshValues;
protected
procedure Execute; override;
procedure DoRefreshValues;
public
ComHandle : THandle;
property RefreshValues : TRefreshValues read FRefreshValues write FRefreshValue;
end;
...
procedure TMessung.Execute;
...
buffer_len:=ReadDataFromCOMPort(ComHandle,buffer);
...
while frames in buffer do
...
Syncronize(DorefreshValues); // Ereignis syncrinisiert aufrufen
...
procedure TMessung.DoRefreshValues;
begin
IF Assigned(FRefreshValues) then FRefreshValues(self, MeineDatenausMessung);
end;
---------------------------------------
unit1.pas:
...
TForm1 = class(TForm)
...
public
procedure OnRefreshValues(Sender : TObject; Daten : String);
....
end;
...
// irgentwo, wo der Thread creiert wird
Datenerfassung := TMessung.Create(True);
Datenerfassung.RefreshValues := self.OnRefreshValues;
...
procedure TForm1.StartClick(Sender: TObject);
begin
ComHandle := 0;
// Verbindung aufbauen
ok := ConnectToCOMPort(ComHandle,42, 4);
if ok = 0 Then
begin
Start.Enabled := False;
Stop.Enabled := True;
// ErfassungsThread starten
// Dieser aktualisiert auch die Oberfläche
DatenerfassungsThread.ComHandle := ComHandle;
DatenerfassungsThread.Resume;
end;
// Verbindung beenden
ok := DisconnectFromCOMPort(ComHandle);
end;
procedure TForm1.StopClick(Sender: TObject);
begin
Start.Enabled := True;
Stop.Enabled := False;
DatenerfassungsThread.Suspend;
end;
procedure TForm1.RefreshValues(Sender: TObject; Daten : String);
Var Text : String;
begin
Text := Daten;
// und im Hauptfenster aktualisieren
...
end;
Gruß oki
42
|
|
Zitat
|