![]() |
Re: StringGrid mit Daten füllen und farblich Darstellen
Hallo nochmal zusammen. Habe das Problem immer noch nicht beseitigen können. Hat den wirklich keiner eine Idee
Gruß Jens |
Re: StringGrid mit Daten füllen und farblich Darstellen
Hallo Jens Hartmann,
in welchen Takt fallen die Daten an der seriellen Schnittstelle an? Bestehet vielleicht die Möglichkeit, dass der letzte Datensatz noch nicht komplett Angezeigt wird und schon wieder ein neuer Datensatz im Buffer der Schnittstelle vorliegt. Bis bald Chemiker |
Re: StringGrid mit Daten füllen und farblich Darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chemiker,
das kann eventuell möglich sein, die Daten schreibe ich Parallel auch in ein Memo, aber genau so wie sie kommen, siehe Code
Delphi-Quellcode:
In der Bufferverarbeitung sieht das ganze so aus..
procedure TForm1.DatenverarbeitungMB256;
Var Datum :String; Jahr :String; Monat :String; Sicherung :String; Übergabe :Integer; SL :TStringList; I :Integer; IA :Integer; IB :Integer; IC :Integer; ID :Integer; N :Integer; begin Datum := DatetoStr(Date); Jahr := FormatDateTime('yyyy',strtodatetime(Datum)); Monat := FormatDateTime('mmmm',strtodatetime(Datum)); CreateDir('..\Daten\'); CreateDir('..\Daten\'+Jahr); CreateDir('..\Daten\'+Jahr+'\'+Monat); sl := TStringList.Create; try MMUEZ2000.Lines.Add(Zeile); sl.AddStrings(MMUEZ2000.Lines); for i := 0 to sl.Count -1 do begin sl[i] := trim(StringReplace(sl[i], #$D, '', [rfReplaceAll])); sl[i] := StringReplace(sl[i], #129, 'ü', [rfReplaceAll]); sl[i] := trim(StringReplace(sl[i], #132, 'ä', [rfReplaceAll])); sl[i] := StringReplace(sl[i], #142, 'Ä', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #148, 'ö', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #153, 'Ö', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #154, 'Ü', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #10#13, ' ', [rfReplaceAll]); if sl[i] <> '' then Zeile:=''; Memo.Lines.Append(SL[I]); Speichermemo.Lines.Append(SL[I]); end; MMUEZ2000.Clear; sl.Free; finally end; Zeile:=''; Sicherung := ('..\Daten\'+Jahr+'\'+Monat+'\'+Datum+'.txt'); Speichermemo.Lines.SaveToFile(Sicherung); Label1.Caption := Sicherung; end;
Delphi-Quellcode:
Somit wird jedesmal ein fertige Zeile an die Datenverarbeitung gegeben und direkt ins Memo geschrieben.
begin
Laenge:=Length(Buffer); I:=1; while I < Laenge+1 do begin Zeile:=Zeile+Buffer[I]; DataMB256plus:=DataMB256plus+Buffer[I]; case RGZentralentyp.ItemIndex of 0 : DatenverarbeitungMB24; 1 : DatenverarbeitungMB48; 2 : DatenverarbeitungMB100; 3 : DatenverarbeitungMB256; 4 : DatenverarbeitungUEZ2000; 5 : DatenverarbeitungBMC1024; end; end; INC(I); Buffer:=''; end; Allerdings, Übergebe ich ja auch einen komplettten Datensatz an meine Klasse Parsen, Hier die komplette Bufferverarbeitung
Delphi-Quellcode:
Daher gesehen, Übergebe ich ja in der Var. Übergabe, die mittlerweile Data heißt ja einen kompletten Satz.
Laenge:=Length(Buffer);
I:=1; while I < Laenge+1 do begin Zeile:=Zeile+Buffer[I]; DataMB256plus:=DataMB256plus+Buffer[I]; if Buffer[I] = #13 then if Buffer[I+2] = #13 then begin DataMB256plus := StringReplace(DataMB256plus, #154, 'Ü', [rfReplaceAll]); DataMB256plus := trim(StringReplace(DataMB256plus, #$D, '', [rfReplaceAll])); DataMB256plus:= StringReplace(DataMB256plus, #129, 'ü', [rfReplaceAll]); DataMB256plus := trim(StringReplace(DataMB256plus, #132, 'ä', [rfReplaceAll])); DataMB256plus := StringReplace(DataMB256plus, #142, 'Ä', [rfReplaceAll]); DataMB256plus := StringReplace(DataMB256plus, #148, 'ö', [rfReplaceAll]); DataMB256plus := StringReplace(DataMB256plus, #153, 'Ö', [rfReplaceAll]); DataMB256plus := StringReplace(DataMB256plus, #154, 'Ü', [rfReplaceAll]); DataMB256plus := StringReplace(DataMB256plus, #10#13, ' ', [rfReplaceAll]); DatenverarbeitungVSTMB256plus; //Sprung in Procedure DataMB256plus := ''; end; IF Buffer[I] =#13 then begin case RGZentralentyp.ItemIndex of 0 : DatenverarbeitungMB24; 1 : DatenverarbeitungMB48; 2 : DatenverarbeitungMB100; 3 : DatenverarbeitungMB256; 4 : DatenverarbeitungUEZ2000; 5 : DatenverarbeitungBMC1024; end; end; INC(I); end; Buffer:=''; end; Im DF habe ich mittlerweile auch einen Thread eingestellt, in dem ich das ganze auch noch erläutert habe. Ich habe mittlerweile es soweit geschafft, das die Daten sauber im StringGrid angezeigt werden, jedoch teiilweise 3mal der gleiche Satz, und dann ein der aktuelle, allerdings die zwei dazwischen fehlen. [EDIT] So, habe jetzt mal den ganzen Tag Daten lesen lassen, funktioniert super, und wird auch alles eingetragen. Mein Problem, liegt also somit woanders, und zwar, wenn ich länger keine Verbindung zur Hardware hatte, gibt es in der einen gewissen Puffer. Dieser wird sofort Übergeben und damit hat meine Programm ein Problem, sobald der Puffer leer ist, und nur noch die Normalen Daten kommen, werden diese sauber eingefüllt. Im Anhang ist ein Bild mit so einem Anfangspuffer. Habe ich eine Möglichkeit, das irgendwie zu lösen, Ich weiß ja jetzt auch nicht, ob es eventuell Möglich, jenachdem was da gerade an der Hardwáre passiert, wie dann die Daten kommen. Es kann ja sein, nur das kann ich halt an meiner Testanlage nicht prüfen, das es bei großen Systemen, je nach Datenaufkommen, auch schon mal zu diesem Problem kommen kann. Mein Programm macht ja folgendes, es ließt den Puffer der Anlage, und Übergibt den an die Var. Buffer. Die Variable Buffer wird verarbeitet und anschließend wird erneut der Puffer der Zentrale ausgelesen, Auch dieser kann ja unterumständen schon wieder mehr als einen Datensatz haben. |
Re: StringGrid mit Daten füllen und farblich Darstellen
Hallo Jens Hartmann,
ohne jede Einzelheit zu kennen mal ein paar Gedanken. Ich würde das ganze mit einer Datenbank lösen. 1.) Ankommen Daten von der seriellen Schnittstelle sofort als Datensatz speichern. Den Datensatz mit einem TimeStamp versehen 2.) In der Regel interessieren nur die Letzten Daten, meinetwegen von der letzten Woche (Tag oder Stunden) diese wieder mir dem Programm einlesen und entsprechend Anzeigen. Dein Konzept hat den entscheiden Nachteile, wie willst Du die Daten speichern? Selbst wenn Du Sie in einem StringGrid anzeigst so ist nach einer gewissen Datensatzanzahl der Speicher voll und der Rechner wir immer langsamer. Man müsste schon so eine Art Ringbuffer aufbauen um das Problem in den Griff zu bekommen. Da ich selber an einem ähnlichen Programm zurzeit Arbeite, kann ich diesem Weg nur empfehlen. Bis bald Chemiker |
Re: StringGrid mit Daten füllen und farblich Darstellen
Den Weg den ich habe, der ist der selbe.
Die Daten im String, sollen eigentlich in ein VirtualTreeView, da ich mich damit aber noch nicht so gut auskenne, aber ich momentan mit einem StringGrid. Außerdem, werden die Daten schon in eine TXT Datei gespeichert, die folgende Struktur in einem eigenen Ordner erstellt. D:\Daten\2009\Januar\01.01.2009.txt Diese Dateien, brauche ich auf Kundenwusch, da diese per E-Mail täglich versendet wird. Somit siehst du, das ich auch täglich mein Grid oder was auch immer leer mache um natürlich somit keinen Datenüberlauf zu haben. Speicherkriterien, etc alles das ist schon in arbeit, aber eins nach dem anderen. Ich habe anfangs den Fehler gemacht viele Sachen gleichzeitig machen zu wollen, aber das ging total in die Hose. Ich denke, das mein Konzept schon ganz gut durchdacht ist. Der Gedanke, später mal verschieden Formate, wie eigene Datenbank, Excel und so, ist schon da. Da ich aber noch nicht so weit mit dem Programmieren bin, befasse ich mich natürlich erst mit den sachen die ich einigermasen kann und dann schritt für schritt weiter. Aber über Ideen und Anregungen, bin ich natürlich immer dankbar. Gruß Jens |
Re: StringGrid mit Daten füllen und farblich Darstellen
Hallo Jens Hartmann,
kenn ich, so habe ich auch mit dem Programm angefangen. Auch wenn Du jetzt schon viel Arbeit in das Project investiert hast, so führt das in eine Sackgasse. Zitat:
Zitat:
Hier noch ein Beitrag der für Dich von Interesse sein könnte: ![]() So schwer ist das mit einer Firebird-Datenbank nicht. Bis bald Chemiker |
Re: StringGrid mit Daten füllen und farblich Darstellen
Alles klar,
ich werden den mal durchlesen, wenn ich dein Argument nehme, ist das eigentlich auch mein Ziel, aber trotzallem, ändert es doch wahrscheinlich nichts daran, das die Daten immer noch nicht sauber eingtragen werden, ob ich die Daten jetzt in ein StrigGrid oder in eine Datenbank eintrage ist doch letztlich egal. Oder? Die Daten die momnetan so ins Grid eingetragen sind, sind jedenfalss noch nicht brauchbar. Naja, wenn ich deinen Thread gelesen habe, sehe ich das vieleicht anders. Danke erstmal. |
Re: StringGrid mit Daten füllen und farblich Darstellen
Hallo zusammen,
mit viel Gedult und Arbeit (und Eure Hilfe) habe ich es jetzt geschaft in mein Programm einen Firebird Datenbank zu integrieren. Leider, habe ich da genau das selbe Problem mit den Datensätze, wie mit dem StringGrid, so jetzt auch mit der Datenbank. Es muss also definitiv an der Daten Verarbeitung beziehungsweise an der Übergabe liegen. Vieleicht hat ja noch jemand eine Idee, wie ich das jetzt irgendwie gelößt bekomme. |
Re: StringGrid mit Daten füllen und farblich Darstellen
Hallo Jens Hartmann,
du holst die Daten jetzt aus der Datenbank oder? Bis bald Chemiker |
Re: StringGrid mit Daten füllen und farblich Darstellen
Nein, eben nicht.
Ich versuche die Datenbank zu füllen, und da mach er den selben Fehler, wie beim StringGrid füllen. Schaue ich mir die Datenbank später an, ist der alte Fehler da. Ich bin allerdings von meinen Gedanken schon etwas weiter. Ich versuch mal es zu beschreiben. Ich lese mit folgender Anweisung die Daten, die sich momentan im Puffer der Einbruchmeldeanlage befinden.
Delphi-Quellcode:
Das Problem hierbei, ist das im Puffer der Einbruchmeldeanlage manchmal auch mehrere Datensätze vorhanden sind, was aber wiederum eigendlich durch die Verarbeitungsprocedure ausgeglichen werden sollte.
{Daten von COM-Schnittestelle lesen}
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); var Daten : String; begin ComPort1.ReadStr(Daten, Count); Buffer:=Buffer+Daten; Bufferverarbeitung; //Procedure, in der die Daten verarbeitet werden end;
Delphi-Quellcode:
Die Frage für mich ist jetzt, wenn meine Bufferverarbeitung noch läuft, aber schon wieder ein neues Ereignis
Procedure TForm1.Bufferverarbeitung;
Var I :Integer; Laenge :Integer; ID :String; SatzEnd :String; begin Laenge:=Length(Buffer); I:=1; while I < Laenge+1 do begin Zeile:=Zeile+Buffer[I]; DataMB256plus:=DataMB256plus+Buffer[I]; if Buffer[I] = #13 then if Buffer[I+1] = #10 then if Buffer[I+2] = #13 then if Buffer[I+3] = #10 then begin DataMB256plus := StringReplace(DataMB256plus, #154, 'Ü', [rfReplaceAll]); DataMB256plus := trim(StringReplace(DataMB256plus, #$D, '', [rfReplaceAll])); DataMB256plus:= StringReplace(DataMB256plus, #129, 'ü', [rfReplaceAll]); DataMB256plus := trim(StringReplace(DataMB256plus, #132, 'ä', [rfReplaceAll])); DataMB256plus := StringReplace(DataMB256plus, #142, 'Ä', [rfReplaceAll]); DataMB256plus := StringReplace(DataMB256plus, #148, 'ö', [rfReplaceAll]); DataMB256plus := StringReplace(DataMB256plus, #153, 'Ö', [rfReplaceAll]); DataMB256plus := StringReplace(DataMB256plus, #154, 'Ü', [rfReplaceAll]); DataMB256plus := StringReplace(DataMB256plus, #10#13, ' ', [rfReplaceAll]); DatenverarbeitungVSTMB256plus; //Sprung in Procedure DataMB256plus := ''; end; IF Buffer[I] =#13 then begin case RGZentralentyp.ItemIndex of 0 : DatenverarbeitungMB24; 1 : DatenverarbeitungMB48; 2 : DatenverarbeitungMB100; 3 : DatenverarbeitungMB256; 4 : DatenverarbeitungUEZ2000; 5 : DatenverarbeitungBMC1024; end; end; INC(I); end; Buffer:=''; end;
Delphi-Quellcode:
anliegt, wird der Buffer ja durch den Puffer neu gefüllt, und macht ja somit meinen Datensatz Kaputt. :gruebel:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
PS: Übrigens, nenn mich ruhig Jens. :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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