Knowlegde - Base Suche via SQL (BCB, Select, Query, Memo, DBGrid)



  • Hallo,
    ich habe folgendes Problem: 😡

    Ich habe in einer MS SQL Datenbank zwei Text-Felder (Max 1000 Zeichen).
    Wenn ich eines der Text-Felder nach einem Stichwort mit einer Query durchsuche und das Ergebnis mir in einem DBGrid anzeigen lasse, bekomme ich immer folgende Anzeige:

    Problem Loesung
    [Memo] [Memo]
    [Memo] [Memo]

    Wieso kann das Grid das nicht anzeigen ? 🙄

    (Wenn ich auf der MS SQL Datenbank das Feld von Text-Feld in ein Varchar-Feld (50 Zeichen) konvertiere, bekomme ich eine Ausgabe).

    Wenn ich dies mit einem Memo-Feld im BCB mache, dann bekomme so eine Ausgabe:
    (Keine Überschriften)
    Problemtext
    Loesungstext
    Problemtext
    Loesungstext

    int AnzFelder=Query1->FieldCount;
      memo1->Visible = true;
      ShowMessage(Query1->FieldCount);
       while (!Query1->Eof)
         {
               for (int i=0;i<AnzFelder;i++)
               {
                   memo1->Lines->Add(Query1->Fields->Fields[i]->AsString);
               }
               Query1->Next();
         }
    

    😞 Ich hätte aber gerne das angezeigt wie in einer Tabelle:

    0 Problem Loesung
    1 Problemtext Loesungstext
    2 Problemtext Loesungstext
    3 Problemtext Loesungstext

    😕 Kann ich das auch mit dem Memo machen ?



  • da kannst du nur die einzelnen Strings "addieren" und dem Memo zuweisen, oder du nimmst z.B. ein StringGrid oder ein ListView

    bei der Ausgabe in ein StringGrid kannst du auch

    StringGrid->Cells[i][j] = Query1->Fields->Fields[i]->AsText;
    

    mal versuchen (statt AsString)



  • Guten Morgen,

    leider sagt der BCB bei AsText:

    'AsText' ist kein Element von 'TField'

    Natürlich habe ich es mit AsString mal getestet, aber:

    int j = 0;
       AnsiString Spalte;
       //StringGrid anhand der Query aufbauen (i = Spalten, j = Zeilen)
       for(Query1->First(); !Query1->Eof; Query1->Next())
       {
        //Spaltenüberschriften auslesen und in oberste Zeile (J = [0]) schreiben
        for(int i = 0; i < Query1->Fields->Count; i++)
        {
         Spalte = Query1->Fields->Fields[i]->FieldName;
         StringGrid1->Cells[i][0] = Spalte;
        }
        //Felder aus der Datenbank lesen mit Query und in StringGrid schreiben
        for(int i = 0; i < Query1->Fields->Count; i++)
        {
         StringGrid1->Cells[i][j+1] = Query1->Fields->Fields[i]->AsString;
         StringGrid1->ColCount = i+1;
        }
        j++;
        StringGrid1->RowCount = j+1;
       }
    

    So weit so gut. Allerdings habe ich noch folgende Probleme.
    Wie kann ich dem Grid beibringen das es automatisch die Spaltenbreite anpasst ?

    Wenn in dem Text den ich wie Query auslese ein Zeilenumbruch ist, wird dieser hier ignoriert. 😮

    Ich hätte gerne folgende Anzeige:

    http://www.imagehop.com/show.php?id=3461fd6a1e994&n=zeile.gif

    Wie kann ich das realisieren ? 😕



  • Kann mir hier keiner helfen oder programmiert am Sonntag keiner ? 😕



  • Wenn du eine direkte Ausgabe der Feldinhalte einschliesslich der Zeilenumbrüche wünscht musst du wohl DBMemo-Komponenten verwenden und mit den jeweiligen Feldern verbinden.

    Ansonsten musst du die Ausgabe im StringGrid per OnDrawCell erledigen und die Textbreite anhand der aktuellen Spaltenbreite berechnen. Dito dann für die Row-Höhe entsprechend der notwendigen Zeilen innerhalb der Zelle.

    Wenn du hier mal nach 'blocksatz' suchst findest du ein Beispiel zur Berechnung von Textbreite etc., das dir vielleicht weiterhilft.



  • @Jansen -> Vielen Dank

    Wenn du eine direkte Ausgabe der Feldinhalte einschliesslich der Zeilenumbrüche wünscht musst du wohl DBMemo-Komponenten verwenden und mit den jeweiligen Feldern verbinden.

    Das war genau die Lösung die ich brauchte. Mir war nur nicht klar das in der Query Komponente die SQL Abfrage drin stehen muss(Hatte diese im Quelltext), damit das Memo weiß auf welches Feld es sich beziehen muss.

    Nochmals Danke


Anmelden zum Antworten