StringGrid



  • Hallo,

    kann man mit dem C++ Builder in StringGrid automatisch Zeichen anzeigen / aktualisieren, die von der Schnittstelle eingegangen sind?

    z.B. alle 10sec. Zeichen in StringGrid darstellen

    Vielen Dank für Eure Hilfe.



  • logisch kann man das, dazu ist es ja da!

    Beispiel:
    
    // Stringgrid initialisieren
    StringGrid->ColCount = 6;   // 6 Spalten
    StringGrid->RowCount = 4;   // 4 Zeilen
    
    // Texte in die Zellen schreiben
    StringGrid->Cells[0][0] = "aaaa";    // beschreibt die 1.Spalte in der 1.Zeile
    StringGrid->Cells[1][0] = "bbbb";    // beschreibt die 2.Spalte in der 1.Zeile
    StringGrid->Cells[1][3] = "cccc";    // beschreibt die 2.Spalte in der 4.Zeile
    


  • danke schön für die antwort.

    ich will mein problem etwas genauer darstellen:

    habe mich in winapi zu schnittstellen eingearbeitet, funktioniert.
    (habe das mit Euren Forum-Infos realisiert. ihr habt es richtig drauf)

    ich will den string, den ich aus schnittstelle auslese, in die StringGrid1-Tabelle einfügen.

    hier hänge ich aber fest.

    in meiner Routine "read_data" (mit handle für ReadFile) hole ich mir die Daten
    und in dieser Routine will ich gleich die Werte in StringGrid einfügen.

    Wenn ich jetzt einmalig für einen test

    StringGrid1->Cells[1][1] = "aaaa"

    in "read_data" eingebe, dann kommt der Fehler EAccessViolation.

    Wie kann ich global mit dem Befehl
    StringGrid1->Cells[1][1] = "aaaa"

    arbeiten?

    vielen dank



  • Ohne den Programmcode zu sehen, ist hier eine Diagnose sehr schwierig.

    Wenn sicher ist, dass EAccessViolation beim Zugriff auf das StringGrid auftritt und nicht von read_data kommt, dann hast du das StringGrid nicht korrekt initialisiert.

    Sind genügend Spalten und Zeilen eingerichtet?
    Beim Zugriff auf StringGrid1->Cells[1][1] müssen mindestens zwei Spalten und zwei Zeilen vorhanden sein.
    StringGrid->ColCount = 2;
    StringGrid->RowCount = 2;

    StringGrid1->Cells[0][0] => 1. Spalte, 1. Zeile
    StringGrid1->Cells[1][1] => 2. Spalte, 2. Zeile



  • hallo,

    nachfolgend meine Klasse Tschnittstelle und mein "read_data" als Teil der Schnittstelle.

    Eine Initialisierung für StringGrid ist nicht da, fällt mir auf.

    Wie kann ich StringGrid initialisieren, kannst Du da helfen?

    Vielen Dank für die bisherige tolle Unterstützung.

    #include "button_COM_21.h"
    
    #include "Windows.h"      //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    class Tschnittstelle
    {
    public:
    
    void create_file (void);             
    
    void dcb_parameter (void);           
    
    void setting_timeouts (void);        
    
    void read_data (void);               
    
    void write_data (void);             
    
    void close_port (void);             
    
    void ShowLastError(AnsiString where);
    
    };
    
    ...
    
    //----------------------------------------------------------------------
    void Tschnittstelle::read_data (void)     
    {
    
    schnittstelle->setting_timeouts();
    
    //HANDLE hSerial;
    int n = 0;
    char daten_empfangen[20];
    
    char buffer[20];
    
     DWORD dwBytesRead = 0;
    
              ReadFile(hSerial, &daten_empfangen, sizeof(daten_empfangen), &dwBytesRead, NULL);
    
              strcpy(buffer, daten_empfangen);
    
           strcpy(global_daten_empfangen, daten_empfangen);
    
    //**********************************************************************
    //HIER WILL ICH DANN die empfangenen Daten in StringGrid1 stecken
    //hier kommt dann Fehler "Undefiniertes Symbol StringGrid1"
    //*********************************************************************
    
    }    //Ende void Tschnittstelle::read_data 
    //-------------------------------------------------------------------------
    


  • Hallo,
    das ist aber eine ganz andere Fehlermeldung, als eingangs beschrieben!
    Zwischen "EAccessViolation" und "Undefiniertes Symbol" ist ein großer Unterschied. "EAccessViolation" ist ein Laufzeitfehler, "Undefiniertes Symbol" ein Compilerfehler.

    Du mußt TStringGrid entweder mit new anlegen oder über die Tool-Palette in ein TForm oder TFrame einfügen und dann dafür sorgen, dass deine Klasse "TSchnittstelle" darauf zugreifen kann.

    Beispiel:
    
    TStringGrid *StringGrid = new TStringGrid(Component);
    // Component muss ein VCL-Container sein (TForm, TFrame, TPanel etc.)
    
    StringGrid->Left = 1; 
    StringGrid->Top = 1;
    StringGrid->Width = 200;
    StringGrid->Height = 100;
    StringGrid->ColCount = 6;   
    StringGrid->RowCount = 4;   
    
    StringGrid->Cells[1][1] = "Text";
    ....
    
    // beim Beenden
    delete StringGrid;
    


  • j.halder schrieb:

    Hallo,
    das ist aber eine ganz andere Fehlermeldung, als eingangs beschrieben!
    Zwischen "EAccessViolation" und "Undefiniertes Symbol" ist ein großer Unterschied. "EAccessViolation" ist ein Laufzeitfehler, "Undefiniertes Symbol" ein Compilerfehler.

    Du mußt TStringGrid entweder mit new anlegen oder über die Tool-Palette in ein TForm oder TFrame einfügen und dann dafür sorgen, dass deine Klasse "TSchnittstelle" darauf zugreifen kann.

    Beispiel:
    
    TStringGrid *StringGrid = new TStringGrid(Component);
    // Component muss ein VCL-Container sein (TForm, TFrame, TPanel etc.)
    
    StringGrid->Left = 1; 
    StringGrid->Top = 1;
    StringGrid->Width = 200;
    StringGrid->Height = 100;
    StringGrid->ColCount = 6;   
    StringGrid->RowCount = 4;   
     
    StringGrid->Cells[1][1] = "Text";
    ....
    
    // beim Beenden
    delete StringGrid;
    

    Ich denke mal dass es die Stringrid schon auf einem Formular gibt.

    Dann fehlt ihm nur ein Include und der Zugriff auf die Stringrid sieht dann etwa so aus

    Form1->Stringrid1->Caption = "asdf";
    

    Ich würde das aber nicht so machen. Damit holst Du dir das GUI untrennbar in Deine TSchnittstelle. Wenn Du vielleicht mal ein anderes GUI als die VCL hast, musst Du sehr viel Code ändern.
    Google mal nach Observer-Pattern.



  • Hallo,

    ich habe ein StringGrid1 auf meinem Form1.

    Wo in meinem Code und in welcher Form (#include <StringGrid> oder <TStringGrid> ?? oder mit "......"?) muss ich das einfügen?

    Greife ich dann so auf eine Zelle zu?

    Form1->Stringrid1->Cells[1][1] = "asdf";

    Ich bin da noch etwas unerfahren, habe vorher hauptsächlich 2D-Animationen in Delphi geschrieben, möchte mich jetzt aber mehr in C einarbeiten.

    danke schön

    newey



  • #include "unit.h"

    unit1.h musst Du durch den Namen der Headerdatei ersetzen in der Deine Form1 deklariert ist.

    Der Zurgriff auf die Stringrid und Zellen erfolgt dann so wie Du es geschrieben hast.



  • Hallo,

    vielen Dank für die Info.

    Ich werde es ausprobieren und melde mich dann.

    Grüße

    newey


Anmelden zum Antworten