Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Abfrage einer Eigenschaft


Weide - Sa 20.07.02 11:03
Titel: Abfrage einer Eigenschaft
Hallo,

ich benutze eine Komponente, mit der ich Daten über die serielle Schnittstelle senden kann. Leider muß ich mit der Übertragung des nächsten Datensatzes warten, bis das Senden des vorherigen beendet ist. Dies geschieht, indem ich eine Eigenschaft (SendInProgress true/false) abfrage.

Nehme ich dazu irgendwelche Schleifen (while, repeat oder goto), um ständig die Eigenschaft abzufragen, so bleibt das Programm dort hängen. Offensichtlich werden in einer Schleife irgendwelche anderen Komponenten nicht mehr abgefragt. Wie kann ich das umgehen?



vielen Dank im Voraus

Gruß Weide


Marc - Sa 20.07.02 12:38

Hi Weide,

schreib' uns doch mal den Code. Ich denke, dann können Dir unsere User schneller und besser helfen.

Gruß Marc


Tino - Sa 20.07.02 13:46

Weide hat folgendes geschrieben:
so bleibt das Programm dort hängen
Wahrscheinlich empfängt das Programm keine Nachrichten mehr. Versuch mal in der While oder Repeat-Schleife die Anweisung

Quelltext
1:
Application.ProcessMessages;                    

einzubauen. Das sollte eventl schon helfen!

Gruß
TINO


Visum - Sa 20.07.02 13:48

Hi,
hab davon eigentlich nicht so die Ahnung.
Spontan würde ich folgendes machen:


Quelltext
1:
2:
3:
4:
5:
//Datensatz senden
repeat
sleep(10)
until SendInProgress=false;
//nächsten Datensatz senden


Allerdings kann ich das nicht testen, da ich nicht weiß, wie man Datensätze verschickt ;). Ausserdem weiß ich nicht, ob das sleep() das Senden des ersten Datensatzes beeinflusst.

Hoffe trotzdem wenigstens ein bisschen geholfen zu haben
Visum


Weide - Sa 20.07.02 16:40

Hallo,

vielen Dank erstmal für Eure Antworten. Mit "sleep" klappt es leider nicht - hier wird gleichfalls die Datenübertragung gekappt. Mit "application.ProcessMessages" klappt's leider auch nicht, auch nicht mit irgendwelchen Abarten davon (z.B. application.HandleMessage). Immerhin brauch ich mit diesen Methoden das Programm nicht mit der Taskleiste abschiessen - es reagiert immerhin schon auf "ctrl-F2". Leider wird "SendInProgress nach wie vor nicht upgedatet. Vieleicht habt ihr ja noch irgendwelche Ideen.

Ich kann natürlich nach dem Senden einen Moment warten, indem ich einen Timer starte und beim Timer Event den nächsten Datensatz losschicke, aber dazu benötige ich für jeden Datensatz einen Timer - das finde ich sehr unelegant und unübersichtlich. Und wie gesagt - "sleep" funtioniert leider nicht :-(

Gruß Weide


Tino - Sa 20.07.02 22:53

Kannst Du mal den Code der Repeat- oder While-Schleife schicken. Ich kann mir nicht vorstellen das das nicht klappen sollte!

Gruß
TINO


Weide - Sa 20.07.02 23:21

Hallo Tino,

anbei mal der Code:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Senden(Sender:TObject);
var Escape: String;
begin
  Escape := #$1b+'[2J'+#$0d;           //Display löschen
  SerialPortNG1.SendString(Escape);

  while SerialPortNG1.SendInProgress = true do
  Application.ProcessMessages;


   SendStr := SendStr+#$0d;
   SerialPortNG1.SendString(SendStr);
end;



Ich sende zunächst eine Escape-Sequenz und anschließend den Datensatz(SendStr). Es müssen allerdings mehrere Escapesequenzen gesendet werden, deshalb suche ich nach einer eleganten/übersichtlichen Variante.


Eine andere Variante funktioniert ebenfalls nicht:


Quelltext
1:
2:
3:
4:
  repeat
  SendeEnde := SerialPortNG1.SendInProgress;
  Application.ProcessMessages;
  until SendeEnde = false;


Gruß Weide


Bart Simpson - Mi 24.07.02 12:04

Ich weiss nicht, was für ein Gerät Du da ansprechen willst, aber warum ist es denn eigentlich nicht möglich die Befehle direkt hintereinander abzusenden (evtl. mit "Trennnullen")? Checkt das Teil sowas nicht, oder was? Also ich tu grad was ähnliches mit 'nem Messgerät am Com-Port, und ich hab damit keine Probleme.

Bart Simpson


Weide - Mi 24.07.02 12:46

Hallo Bart,

leider geht es so nicht. Ich muß, bevor ich die eigentlichen Nutzdaten schicke, noch ein paar Escapesequenzen senden, um das Gerät (es ist ein Barcode-Funkscanner) zu initialisieren. Leider nimmt er mehrere Escapesequenzen in einem "Durchlauf" nicht an.

Gruß Weide