Delphi-PRAXiS
Seite 5 von 11   « Erste     345 67     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi StringGrid mit Daten füllen und farblich Darstellen (https://www.delphipraxis.net/128425-stringgrid-mit-daten-fuellen-und-farblich-darstellen.html)

Jens Hartmann 18. Feb 2009 18:20

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

Chemiker 21. Feb 2009 11:35

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

Jens Hartmann 21. Feb 2009 13:42

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:
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;
In der Bufferverarbeitung sieht das ganze so aus..

Delphi-Quellcode:
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;
Somit wird jedesmal ein fertige Zeile an die Datenverarbeitung gegeben und direkt ins Memo geschrieben.

Allerdings, Übergebe ich ja auch einen komplettten Datensatz an meine Klasse Parsen,

Hier die komplette Bufferverarbeitung

Delphi-Quellcode:
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;
Daher gesehen, Übergebe ich ja in der Var. Übergabe, die mittlerweile Data heißt ja einen kompletten Satz.

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.

Chemiker 21. Feb 2009 21:09

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

Jens Hartmann 21. Feb 2009 23:19

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

Chemiker 22. Feb 2009 09:07

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 von Jens Hartmann
Diese Dateien, brauche ich auf Kundenwusch, da diese per E-Mail täglich versendet wird.

Auch das ist kein Problem mit einer Datenbank, aber wenn das Zeitgleich mit der Datenaufzeichnung durchgeführt werden soll, bekommst Du da schon Probleme.

Zitat:

Zitat von Jens Hartmann
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

Dann muss Du ständig die Uhrzeit abfragen ob es noch der 01.01.2009 ist oder nicht um eine genau Abgrenzung für den Tag zu bekommen.


Hier noch ein Beitrag der für Dich von Interesse sein könnte:

Link:
So schwer ist das mit einer Firebird-Datenbank nicht.

Bis bald Chemiker

Jens Hartmann 22. Feb 2009 10:17

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.

Jens Hartmann 27. Feb 2009 15:25

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.

Chemiker 27. Feb 2009 17:21

Re: StringGrid mit Daten füllen und farblich Darstellen
 
Hallo Jens Hartmann,

du holst die Daten jetzt aus der Datenbank oder?

Bis bald Chemiker

Jens Hartmann 27. Feb 2009 17:36

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:
{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;
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.

Delphi-Quellcode:
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;
Die Frage für mich ist jetzt, wenn meine Bufferverarbeitung noch läuft, aber schon wieder ein neues Ereignis

Delphi-Quellcode:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
anliegt, wird der Buffer ja durch den Puffer neu gefüllt, und macht ja somit meinen Datensatz Kaputt. :gruebel:

PS: Übrigens, nenn mich ruhig Jens. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 Uhr.
Seite 5 von 11   « Erste     345 67     Letzte »    

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