Memo Text in StringGrid laden



  • Hallo Ihr C++ Gurus
    Es gibt doch programme, mit denen man computer im netzwerk nach installierten Anwendungen u.ä. scannen kann. Die ausgelesenen Daten liegen dann alst .txt Datei vor mit dem schema:

    Hostname;MAC-Adresse;Domäne;...;|Anwendung 1|Anwendung 2|...|Anwendung n|

    Ich tüftle schon seit einiger Zeit an einer Lösung den Text in eine Tabellenform zu bringen, um dann zB nach bestimmten Anwendungen zu suchen usw. Sagen wir mal, wir haben 20 Rechner gescannt und uns liegen nun 20 Zeilen des obrigen Schemas in einem TMemo vor:
    Ich lese nun den Inhalt des Memo ein:

    char* text1= Form1->Memo1->Lines->Text.c_str();
    

    dann gehe ich zeichen für zeichen durch und speichere die einezelnen strings zwischen den ; in anderen chars ab (ich nehme chars, weil ich nicht weiß, wie es mit Strings geht ):

    switch (text1[k])  //Durchsuchen des Strings nach Trennzeichen
          {
            case ';': stelle++;  // Wenn ein Semikolon gefunden wurde...
    
                    switch (stelle)
                    {
                     case 1: if(zeichen==0) Form1->StringGrid1->Cells[spalte][0]= "Unbekannt";
                             else
                             {
                              char host[] = "                ";  // 15+1 Zeichen  zb: dewe0345
                              while(zeichen!=0)  //Suche nach Host
                              {
                               host[15-zeichen]=text1[k-zeichen];
                               zeichen--;
                              }
                              zeichen = 0;
                              Form1->StringGrid1->Cells[spalte][0]= Trim(host);
                             }
                          //   text1= Form1->Memo1->Lines->Text.c_str(); //Kopiert Memostring in text1 char
                             break;
    
                    case 4: if(zeichen==0) Form1->StringGrid1->Cells[spalte][1]= "Unbekannt";
                             else
                             {
                              char domaene[] = "           ";   //10+1 Zeichen  zb: DOMSTODE
                              while(zeichen!=0)  //Suche nach Domäne
                              {
                               domaene[10-zeichen]=text1[k-zeichen];
                               zeichen--;
                              }
                              zeichen = 0;
                              Form1->StringGrid1->Cells[spalte][1]= Trim(domaene);
                             }
                          //   text1= Form1->Memo1->Lines->Text.c_str(); //Kopiert Memostring in text1 char
                             break;
    

    usw...
    Dann steht alles schön im StringGrid drin - allerdings ab 3-4 Rechnern erscheint eine Fehlermeldung: "Im Projekt blabla ist eine Exception der Klasse EAccessViolation aufgetreten ...". Ich vermute das es mit der Länge von text1 zu tun hat.

    Habt Ihr vielleicht ne elegantere Lösung für mein Problem. Ich bin sehr dankbar für jede Idee
    Hier könnt Ihr Euch mein Projekt runterladen: http://www.karstenonline.com/cpp/Projekt.zip Die darin enthaltenen Scan.txt mit dem Programm laden, dann sollte der Fehler kommen!

    Gruß Luke

    Hier nochmal der ganz Code: <hab ich wieder entfernt>

    //

    [ Dieser Beitrag wurde am 02.04.2003 um 08:25 Uhr von luketjm editiert. ]



  • Ich möchte dich bitten, den Fehler mit Hilfe von Debugging den Fehler einzukreisen und den relevanten Code zu posten. Hab leider im Moment keine Zeit schreib später noch ne ausführliche Kritik an deinem Code. bedenke bitte, dass zu grosse Code-Quotes potentielle helfende eher abschrecken als ermutigen.

    -junix



  • Ahja was ich vergass. Lies diesen Artikel mal genau durch.

    -junix



  • Ich würde das ganze mit AnsiStrings machen. Das geht ganz einfach mithilfe der Memberfunktionen Pos() und SubString().

    Was mir noch auffällt, ist, dass die Funktion Analyse() viel zu lang geworden ist. Du solltest einigen Code in andere Funktionen auslagern, sodass du die ganze Funktion überblicken kannst, ohne über drei Seiten zu scrollen. Außerdem solltest du der Funktion Analyse() wenigstens das StringGrid und das Memo als Parameter übergeben, damit du die Funktion auch für andere StringGrids benutzen kannst, und für den Fall, dass du den Namen Des Grids mal ändern solltest. Eventuell solltest du die ganzen Funktionen auch zu (private) Memberfunktionen von TForm1 machen, damit du nur innerhalb der Form auf die Funktionen zugreifen kannst.

    So, jetzt ist junix dran. 😉

    [ Dieser Beitrag wurde am 01.04.2003 um 17:33 Uhr von Eßer editiert. ]



  • Darf ich auch noch was sagen? 😉

    Hier mal ein ganz anderer Ansatz, der sich mit wenig Aufwand zu einer recht ordentlichen Lösung ausbauen lassen sollte.

    TStringList *list = new TStringList();
      list->LoadFromFile("d:\\projekt\\scan.txt");
    
      //von semikolon-getrennt nach komma-getrennt umwandeln
      list->Text = StringReplace(list->Text, ",", "\",\"", TReplaceFlags() << rfReplaceAll);
      list->Text = StringReplace(list->Text, ";", ",", TReplaceFlags() << rfReplaceAll);
    
      for (int y = 0; y < list->Count; y++)
       StringGrid1->Rows[y+1]->CommaText = String(y) + "," + list->Strings[y];
    
      delete list;
    


  • Traumhaft, Jansen, ich glaub ich lass mich nicht weiter über den Code aus. Ausser soviel sei noch gesagt: luketjm: du solltest weniger C mehr C++ programmieren.

    -junix



  • Guten Morgen,

    erstmal vielen Dank für Eure Antworten 🙂
    dies ist mein erstes eigenes programm mit dem borland c++ builder bisher habe ich erst ein semester an der Berufsakademie c++ gelernt und das waren gerade mal die basics der basics. Deswegen sieht mein code wohl relativ grausam aus.

    ok, ich habe gestern abend noch rumgetüftelt und das problem selber lösen können. jetzt können die textfiles beliebig lang sein, ohne dass das programm abstürzt *yippi!*. Wer mag, kann sich das Projekt hier runterladen: http://www.karstenonline.com/cpp/Projekt2.zip

    Als nächstes möchte ich eine ComboBox haben, in der jede Anwendung drinsteht aber sich keine wiederholt d.h. dass auf 20 Rechnern der Acrobat Reader installiert ist aber er halt nur einmal in der COmboBox auftaucht. Vielleicht habt Ihr Ideen dazu?

    Vielen Dank nochmal und bis bald
    Luke :p



  • Schön das es klappt.

    Grundsätzlich gilt hier: pro Frage 1 Thread. Deine Frage hat aber nix mehr mit dem Ursprungsthread zu tun. Ich möchte dich deshalb bitten einen neuen Thread zu eröffnen.

    Allerdings würde ich dir zunächst empfehlen mal die Hilfe zum Thema TComboBox genauer anzusehen und vielleicht zunächst den hinter "hilfe" gelegten Link mal zu verfolgen.

    Ahja und für die Zukunft:

    char host[] = "                ";  // 15+1 Zeichen  zb: dewe0345
    

    Auf solche dinger, verzichte bitte in Zukunft, das ist mehr als unsauber. Hier gäbe es zum einen die Möglichkeit über

    char host[16];
    memset(host, 0, 16);
    

    Dein Ziel zu erreichen, zum Andern über

    char *host = new char[16];
    memset(host, 0, 16);
    

    uvm.

    -junix

    [ Dieser Beitrag wurde am 02.04.2003 um 08:33 Uhr von junix editiert. ]



  • danke! werd's in zukunft beachten.

    ciao
    Luke 🙂



  • Original erstellt von junix:
    **

    Ahja und für die Zukunft:

    char host[] = "                ";  // 15+1 Zeichen  zb: dewe0345
    

    Auf solche dinger, verzichte bitte in Zukunft, das ist mehr als unsauber. Hier gäbe es zum einen die Möglichkeit über

    char host[16];
    memset(host, 0, 16);
    

    Dein Ziel zu erreichen, zum Andern über

    char *host = new char[16];
    memset(host, 0, 16);
    

    uvm.

    -junix

    [ Dieser Beitrag wurde am 02.04.2003 um 08:33 Uhr von [qb]junix** editiert. ][/QB]

    Hi junix, deine tipps funktionieren leider in meinem programm nicht. ich weiß auch, dass

    char host[] = "                ";
    

    nicht sehr elegant ist aber es funktioniert.

    gruß Luke :p



  • 1. Bitte lies das hier mal genauer durch. Vor Allem den Abschnitt 2.1.

    2. Es ist nicht nur nicht elegant sondern fahrlässig. Wieso funktionieren die Tips nicht? Wenns nur drum geht, dass keine Leerzeichen drin stehen (so wies eigentlich normal ist, wenn kein Inhalt drin ist) dann solltest du dir die Parameter von memset() mal genauer ansehen.

    -junix



  • jaja schon kapiert...



  • hmm, keine Ahnung, warum Deine Tipps nicht funktionieren. Er compiliert schon richtig durch (ohne Fehler) aber letztendlich bleibt die entsprechende Zelle im StringGrid leer. Ich komm eh immer durcheinander mit den ganzen Stringtypen...

    Gruß Luke
    PS Sorry bin nicht oft in Foren 🙄



  • Original erstellt von luketjm:
    aber letztendlich bleibt die entsprechende Zelle im StringGrid leer.

    Zwei Dinge
    1. Mit dem Debugger shcon mal die Initialisierung verfolgt? (Falls du dich mit dem Debuggen nicht auskennst hier gibts hilfe.
    2. Ist die Zelle wirklich leer oder einfach voll von Leerzeichen? Wie ich schon sagte. Ich initialisiere Character-Arrays immer auf 0x00, weil ich dann mit strlen jederzeit die Länge rausfinden kann (und solange niemand was reinschreibt ist die stringlänge 0) und ausserdem das abschliessende \0 (od. 0x00, oder was auch immer) bereits gesetzt wird. Wenn du unbedingt leerzeichen willst, musst du hald bei memset den mittleren Parameter passend setzen.

    Du kannst auch auf a initialisieren:

    char host[16];
    host[15] = 0x00; // abschliessendes 0x00 setzen für sie str*-Funktionen
    memset(host, 'a', 15); // restlichen Zeichen mit 'a' initialisieren.
    

    -junix



  • hmm, beim initialisieren von host mit

    char host[16];
    

    stehen zunächst zufällige zeichen im char zb "Gt&@/³s5µ9ß/@y>J" dann kommt

    memset(host, 0, 16);
    

    und er schreibt host voll mit Nullterminatoren zb "\0\0\0\0\0\0\0\0\0..." wenn dann host im stringgrid ausgegeben werden soll, steht "\0\0\0Hostename\0" drin, weswegen er natürlich nichts ausgeben kann. Warum füllt er denn den char mit "\0" aus? Ist das normal??

    Luke



  • Überprüfe mal folgende Punkte:



    -junix



  • Überprüfe mal folgende Punkte:



    ich habe für c ' ' eingesetzt jetzt ist es okay ich dachte erst, man kann nur int werte einsetzen.

    thx Luke


Anmelden zum Antworten