TLMDCheckListBox



  • ich verwende die LMDCheckListBox um Protokolldaten anzuzeigen. Zusätzlich sollen per CheckBox ausgewählte Daten gespeichert werden. Um alles zu speichern gibts ja die bekannte Methode SaveToFile Methode von TStrings. Nun möchte ich aber, dass nur die ausgewählten Strings gespeichert werden. Wie kann ich das erreichen?



  • Hallo

    Durch die Einträge originale CheckListBox mit einer Schleife durchgehen, und die ausgewählten Einträge in eine zweite, manuell erstellte TStringList kopieren. Dann kannst du die zweite TStringList speichern.

    bis bald
    akari



  • void __fastcall TF_Futterprotokoll::B_ExportierenClick(TObject *Sender)
    {
       TStringList* exp = new TStringList;
       for (int i=0; i<ListBox_Futterprotokoll->Items->Count; i++) {
       	if (ListBox_Futterprotokoll->Checked[i]) {
          	exp->Add(ListBox_Futterprotokoll->StringValue[i]);
          }
       }
       if (SaveDialog_Export->Execute()) {
       	exp->SaveToFile(SaveDialog_Export->FileName);
       }
    }
    

    habs so gemacht und es funktioniert. Vielen Dank akari für die schnelle Hilfe.



  • Hallo

    Aber vergiß nicht die Instanz hinter exp auch wieder zu löschen, nachdem du sie nicht mehr brauchst. Oder besser noch std::auto_ptr benutzen.

    bis bald
    akari



  • was mich an der Liste etwas stört ist, dass ich Einträge mit dem Tabulator anlege und diese natürlich nicht immer untereinander sind wenn ein Eintrag mal länger ist. Ausserdem hätte ich auch gern einen Tabellenkopf gehabt den es hier scheinbar nicht gibt. Oder irre ich?

    Evtl möchte ich noch eine Prüfung machen ob die Datei schon existiert, und wenn ja soll er die neuen Daten anhängen.



  • Hallo

    rudpower schrieb:

    was mich an der Liste etwas stört ist, dass ich Einträge mit dem Tabulator anlege und diese natürlich nicht immer untereinander sind wenn ein Eintrag mal länger ist. Ausserdem hätte ich auch gern einen Tabellenkopf gehabt den es hier scheinbar nicht gibt. Oder irre ich?

    Sowas ist mit der normalen T(Check-)ListBox nicht möglich, bei den LMD-Tools bin ich mir nicht sicher. Möglicherweise kannst du da mit den Draw-Events der Controls noch einiges einbauen. Aber eigentlich gibts dafür die Grids, wie zum Beispiel TStringGrid. Dort hast du dann aber keine direkten Checkboxen, kannst die aber auch noch manuell einbinden.

    Evtl möchte ich noch eine Prüfung machen ob die Datei schon existiert, und wenn ja soll er die neuen Daten anhängen.

    Siehe die freie Funktion FileExists, und wenn vorhanden vor dem Anfügen der neuen Einträge eben erstmal mit LoadFromFile die alte Datei reinladen.

    bis bald
    akari



  • ok, das ist vielleicht einfacher.

    Dort hast du dann aber keine direkten Checkboxen, kannst die aber auch noch manuell einbinden

    Wie binde ich die Checkboxes denn ein?
    Hab erst mal ein Checkboxobjekt erstellt mit:
    TLMDCheckBox* chb = new TLMDCheckBox;
    Nun muss ich denk ich mal in die erste Spalte die CheckBoxes einfügen als Objekt. Wie ich das anstellen muss weiss ich leider nicht.



  • Hallo

    Hier findest du eine Anleitung.

    bis bald
    akari



  • guten Morgen,
    Der Tip war gut, vielen Dank. Auch die Homepage kannte ich noch gar nicht, sehr interessante Seite.

    Meine Grid wächst dynamisch mit der Anzahl der Daten. Ich hab in einer anderen Form ein paar Editfelder. Immer wenn ich einen Button drücke werden die Daten aus den Editfeldern in die Tabelle eingetragen und die Anzahl der Rows erhöht sich um 1. Das heisst also das ich immer so viele Checkboxes brauche wie es Zeilen-1 sind. Wie setz ich das um. Ich hab ja nur eine Instanz der CheckBox, muss ich das Objekt immer wieder instanzieren oder wie mach ich das? Erzeugen sollt ich das doch dann über den Button oder?



  • ich denke mal ich muss ein Array erzeugen also

    TLMDCheckBox* pCheckBox[]; //in private der Form
    

    delete hab ich im Konstruktor der Form mit: delete [] pCheckBox;
    Da ich immer beim Klick auf einen Button eine neue Zeile mit den Daten aus den Editfeldern erzeuge (der Button ist in einer anderen Form) und erst beim Öffnen der Form mit der Grid weiss, wieviele Zeilen mein Grid hat, habe ich die Objekterzeugung in die ShowForm-Methode gepackt, also:

    void __fastcall TF_Futterprotokoll::FormShow(TObject *Sender)
    {
       pCheckBox[StringGrid1->RowCount-1] = new TLMDCheckBox(this);
    }
    

    Nun muss ich bei jedem Klick auf den Button eine CheckBox in der ersten Spalte positionieren. Da hängts grad bei mir. Da ich ja beim Klick auf den Button ja noch nicht auf die Objekte zugreifen kann. Diese werden ja erst nach dem Klick erzeugt. Oder ich müsste die CkeckBox-Objekte in der Form mit dem Button erzeugen. Nur weiss ich nicht ob ich die dann Formübergreifend in der anderen Form darstellen und positionieren kann. Habe das gerade mal probiert und flg Anweisungen in die ClickMethode des Buttons implementiert:

    pCheckBox[F_Futterprotokoll->StringGrid1->RowCount-1] = new TLMDCheckBox(F_Futterprotokoll);
       pCheckBox[0]->Parent = F_Futterprotokoll;
    

    Führe ich dann das Programm aus gibt es eine Zugriffsverletzung in Addresse... Fehler beim Lesen der Adresse... Nun bin ich etwas ratlos



  • habs gelöst. Hab unter dem oben genannten Link noch einen Artikel gefunden, wo beschrieben wird wie man Komponenten zur Programmlaufzeit erzeugen kann.

    Dabei hat sich promt ein neues Problem ergeben. Hab ich jetzt mehr Zeilen in der Tabelle wie reinpassen, erscheint der vertikale Scrollbalken. Die Checkboxes laufen natürlich nicht mit, da sie ja über dem Grid liegen. Gibt es die Möglichkeit diese direkt in die Zellen zu setzen, dass diese beim Scrollen mitlaufen?


Anmelden zum Antworten