TLabel Componente im StringGrid positionieren



  • Hallo,

    ich möchte einen Kalender mittels eines StringGrids darstellen mit Terminen in verschiedenen Farben, welche man anklicken kann um nähere Details zu den Terminen zu sehen.

    Abgesehen, dass ich mit der Grid Komponente von TMS Software herum experimeniere - ich habe aber kein Geld dafür - ist das Problem auch für die normale StringGrid Komponente das gleiche.

    Ich habe mir gedacht, dass ich mir mehrere TLabel Komponenten zur Laufzeit erstelle und dem StringGrif hinzufüge. DIese kann ich ja in verschiedenen Farben darstellen und ich kann das Ereignis OnClick auf diese Labels abfangen.

    Das Problem ist, dass ich diese Labels nicht richtig verwaltet und positioniert bekomme im Grid.

    Erst dachte ich, dass ich die Zeiger auf die einzelnen Komponenten selbst verwalten kann, aber irgendwie macht entweder der Compiler nicht mit, oder es treten Zugriffsverletzungen während der Laufzeit auf.
    Nun habe ich mich entschlossen die Zeiger in einer TComponentList zu verwalten.

    Aber das Problem der Positionierung im Grid ist nach wie vor unklar. Er zeigt mir unabhängig welche Werte ich Left + Top zuweise das Label immer in der oberen linken Ecke des Grids an und auch noch unterhalb des Textes der Fixen Spalte/Zeile.

    Hat da irgend jemand eine Idee oder Erfahrung mit?

    Gruss
    Christian



  • Hallo

    Für die Einfärbung (oder generell die Anpassung des Aussehens der Zellen) brauchst du weder eine externe Komponente noch TLabel. Siehe FAQ, Abschnitt StringGrid, Artikel "Farbige Zellen/Zeilen".

    bis bald
    akari



  • Hallo,
    stimmt nicht ganz. In dem Beitrag wird nur beschrieben, wie man die Zellen unterschiedlich einfärbt, aber nicht die Zeilen.

    Problem ist, dass der Text einer Zelle in einem AnsiString abgelegt wird. Man kann diese eine Zeile nur in einer Farbe darstellen.

    Im übrigen kenne ich diesen Beitrag im FAQ und habe ihn auch schon erfolgreich im Programm umgesetzt. Er liefert aber für dieses Problem keine lösung.



  • christian_gnoth schrieb:

    Hallo,
    stimmt nicht ganz. In dem Beitrag wird nur beschrieben, wie man die Zellen unterschiedlich einfärbt, aber nicht die Zeilen.

    alle Zellen einer Reihe sind eine Zeile...

    christian_gnoth schrieb:

    Problem ist, dass der Text einer Zelle in einem AnsiString abgelegt wird. Man kann diese eine Zeile nur in einer Farbe darstellen.

    das kann man beim Label auch nur

    vielleicht hilft ja das http://www.bytesandmore.de/rad/cpp/snipp/sc02020.php oder das http://www.bytesandmore.de/rad/cpp/snipp/sc02038.php



  • christian_gnoth schrieb:

    Problem ist, dass der Text einer Zelle in einem AnsiString abgelegt wird. Man kann diese eine Zeile nur in einer Farbe darstellen.

    Der Text wird als AnsiString abgelegt. Wie du ihn aber zeichnest ist doch deine Sache. Wenn du den Text z.Bsp. mit TCanvas::TextRect im OnDrawCell-Event auf das Grid malst, kannst du doch da jedes Zeichen separat malen und unterschiedliche farben verwenden. Für das Einhalten der zeichenabstände bist du dann natürlich selbst verantwortlich.



  • ok, danke für eure anregungen und ideen. ich hab es jetzt aber mit den TLabel Komponenten umgesetzt.
    Der Vorteil für mich ist, dass die Methoden und Eigenschaften, die ich brauche schon da sind.
    Ich kann das klicken mit der rechten und linken Maustaste auf das Label (Termin-Eintrag) abfangen und mit einem PopUpMenu versehen.

    falls es jemanden interessiert wie es aussieht:

    //	build string with the following format:
    //	Uhrzeit - PLZ - Firma
    Current_String->operator =(Uhrzeit->SubString(1, 5) + " " +
    FM_DM_Main->ADOQuery_Lists_ForAllUse->FieldByName("PLZ")->AsString + " - " +
    		FM_DM_Main->ADOQuery_Lists_ForAllUse->FieldByName("Firma")->AsString);
    
    vPos += -(Termin_Entry->Font->Height) + 2;
    Termin_Entry =new TLabel(this);
    Termin_Entry->OnClick = Termin_EntryClick;
    Termin_Entry->PopupMenu	= PopupMenu_Termin_Entry;
    Termin_Entry->Parent = AdvStringGrid_Termin_Month_View;
    Termin_Entry->Font->Name = "Verdana";
    Termin_Entry->Font->Pitch = fpVariable;
    Termin_Entry->Font->Size = 9;
    Termin_Entry->Font->Color = StringToColor(FM_DM_Main->tb_cust->FieldByName("color_calendar")->AsString);
    Termin_Entry->Alignment = taLeftJustify;
    Termin_Entry->Caption = *Current_String;
    Termin_Entry->Top	= AdvStringGrid_Termin_Month_View->CellRect(ACol, ARow).Top + vPos;
    Termin_Entry->Left	= AdvStringGrid_Termin_Month_View->CellRect(ACol, ARow).Left + 2;
    Termin_Entry->Width = AdvStringGrid_Termin_Month_View->CellRect(ACol, ARow).Right - AdvStringGrid_Termin_Month_View->CellRect(ACol, ARow).Left - 4;
    Termin_Entry->Visible = true;
    Label_Liste->Add(Termin_Entry);
    


  • Hallo

    Bitte beim nächsten Posten von Code die C++ -Tags benutzen!
    sfds

    bis bald
    akari


Anmelden zum Antworten