AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi StringGrid mit Daten füllen und farblich Darstellen

StringGrid mit Daten füllen und farblich Darstellen

Ein Thema von Jens Hartmann · begonnen am 29. Jan 2009 · letzter Beitrag vom 6. Apr 2009
Antwort Antwort
Seite 5 von 11   « Erste     345 67     Letzte » 
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#41

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 18. Feb 2009, 18:20
Hallo nochmal zusammen. Habe das Problem immer noch nicht beseitigen können. Hat den wirklich keiner eine Idee

Gruß

Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#42

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 21. Feb 2009, 11:35
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#43

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 21. Feb 2009, 13:42
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.
Miniaturansicht angehängter Grafiken
puffer_150.gif  
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#44

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 21. Feb 2009, 21:09
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#45

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 21. Feb 2009, 23:19
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#46

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 22. Feb 2009, 09:07
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 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 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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#47

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 22. Feb 2009, 10:17
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
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#48

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 27. Feb 2009, 15:25
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.
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#49

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 27. Feb 2009, 17:21
Hallo Jens Hartmann,

du holst die Daten jetzt aus der Datenbank oder?

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#50

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 27. Feb 2009, 17:36
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

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.

PS: Übrigens, nenn mich ruhig Jens.
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:10 Uhr.
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