Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi StringGrid Zelle bei ButtonKlick färben? (https://www.delphipraxis.net/92554-stringgrid-zelle-bei-buttonklick-faerben.html)

DFischer 22. Mai 2007 10:42


StringGrid Zelle bei ButtonKlick färben?
 
Hallo zusammen!

Zuerstmal...Ja, ich habe die Suchfunktion benutzt und ja, ich habe schon alle möglichen Variationen der gegebenen Informationen ausprobiert, doch leider hat nichts davon geholfen :(

Ich muss in der Firma ein kleines Programm schreiben, das soweit auch läuft. Nur gibt es ein Problem beim Einfärben von Zellen nach dem Klicken auf bestimmte Buttons.

Das StringGrid ist mit einer Tabelle verknüpft, die wiederum mit einer Datenbank. Beim Einloggen werden im StringGrid Benutzername, Telefonnummer sowie der Status angezeigt (da hab ich auch noch ein Problem, dazu aber ein anderes mal).
Nun soll, beim Klick auf den Button "Anwesend" die Zelle des Status, oder wenn möglich die ganze Zeile, grün eingefärbt werden.

Es ist doch möglich per Suche die Zeile herauszufinden, in der der aktuell eingeloggte Benutzer steht, und diese dann grün einzufärben, oder?

Habe leider recht wenig Ahnung von Delphi, und mein Schulwissen von vor 4 Jahren bringt mich leider auch nicht wirklich weiter.
Warum mein Chef mich das Programm dennnoch programmieren lässt weiss ich nicht genau :(

Ich hoffe dass Ihr mir bei diesem und vielleicht folgenden Problemen helfen könnt, wäre super nett von euch!

Grüße
Dominik Fischer

_frank_ 22. Mai 2007 11:04

Re: StringGrid Zelle bei ButtonKlick färben?
 
moin,
du müsstest in der Zelle irgendwie hinterlegen, ob und ggf. wie diese gefärbt werden soll (hintergrundklasse (TStringgrid.Objects), string-prefix, etc.) und dies dann im OnDrawCell auswerten. Nicht vergessen, die Eigenschaft DefaultDrawing des Stringgrids auf false zu setzen, damit das OwnerDraw aktiviert wird.
bei verwendung einer klasse sicherstellen, dass die Objekte auch wieder ordnungsgemäß freigegeben werden (tückisch bei variabler spalten-/zeilenanzahl) ;)
Du kannst auch in TStringgrid.Objects auch nur ein Flag hinterlegen (bis 32Bit integer), ist vielleicht am einfachsten. Zugreifen dann einfach per hardcast.

Delphi-Quellcode:
stringgrid1.objects[0,0]:=TObject(1);
Delphi-Quellcode:
if integer(stringgrid1.objects[0,0])=1 then ...
das OnDrawCell sieht dann so in etwa aus:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  (sender as TStringgrid).canvas.Brush.color:=(sender as TStringgrid).color;
  if integer(stringgrid1.objects[col,row])=1 then
    (sender as TStringgrid).canvas.Brush.color:=clgreen;
  (sender as TStringgrid).canvas.FillRect(rect);
  (sender as TStringgrid).canvas.TextOut(rect.left+2,rect.top+2,(sender as TStringgrid).Cells[col,row]);
end;
HTH Frank

DFischer 22. Mai 2007 11:33

Re: StringGrid Zelle bei ButtonKlick färben?
 
Hallo Frank und danke für die Antwort!

Leider verstehe ich größtenteils nur Bahnhof, aaaber:

sobald ich DefaultDrawing = False setze schreibt er mir beim Einloggen in das Programm keine Werte mehr in die Zellen.
Gibt es denn keine einfache Funktion die beim Klick auf den Button eine Zeile färbt ohne Umwege zu gehen?

Würde es helfen wenn ich das Programm hochlade? Der Programmierer, der mir beim Erstellen geholfen hat, wurde leider entlassen :freak:

Gruß
Dominik

SaFu 22. Mai 2007 12:12

Re: StringGrid Zelle bei ButtonKlick färben?
 
Guck mal vielleicht hilft dir das ist sowas ähnliches

Delphi-Quellcode:
procedure TForm7.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var Celltext :string;
    Farbe :boolean;
    Textformat :cardinal;
    n :integer;
begin
  Textformat:= DT_SINGLELINE;
   with (Sender as TStringGrid) do

    begin
     Celltext:= Cells[ACol, ARow];
     Farbe:= True; //Standardeinstellung der Zellen ist einfarbig

      if (Cells[ACol,ARow] = 'fa') or (Cells[ACol,ARow] = 'FA')then
        begin
          Canvas.Brush.Color:= ClRed; //Zellenfarbe
          Canvas.Font.Color:= ClWhite; //Schriftfarbe
          Canvas.Font.Style:= Canvas.Font.Style + [fsBold]; //Text fett
        end;

     if (Cells[ACol,ARow] = 'np') or (Cells[ACol,ARow] = 'NP')then
        begin
          Canvas.Brush.Color:= ClBlue; //Zellenfarbe
          Canvas.Font.Color:= ClWhite; //Schriftfarbe
          Canvas.Font.Style:= Canvas.Font.Style + [fsBold]; //Text fett
        end;

     if (Cells[ACol,ARow] = 'aa') or (Cells[ACol,ARow] = 'AA')then
       begin
        Canvas.Brush.Color:= ClGreen; //Zellenfarbe
        Canvas.Font.Color:= ClWhite; //Schriftfarbe
        Canvas.Font.Style:= Canvas.Font.Style + [fsBold]; //Text fett
       end;

    if (Farbe) then
       begin
        SetBkMode(StringGrid1.Canvas.Handle, OPAQUE); //Hintergrund überschreiben
        Canvas.FillRect(Rect)
       end;

    if (ACol = 1) or (ACol = 0) then
       begin
        Textformat:= Textformat or DT_CENTER or DT_VCENTER ; //Text wird zentriert
        Canvas.Font.Style:= Canvas.Font.Style + [fsBold]; //Text fett
       end;

    if (ACol > 1) then  //Zentrieren für alle Zellen
       begin
        Textformat:= Textformat or DT_CENTER or DT_VCENTER; //Text wird zentriert
       end;
  //Hier wird nun der Text ausgegeben
  DrawText(Canvas.Handle, PChar(Celltext), Length(celltext), Rect,Textformat);
end;
musst du dir nur noch umbastel für dein button

Gruss sascha

_frank_ 22. Mai 2007 16:33

Re: StringGrid Zelle bei ButtonKlick färben?
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi,
wenn du defaultDrawing ausschaltest MUSST du dich selbst um das zeichnen kümmern (also OnDrawCell definieren und dem Stringgrid zuweisen :) ).
für das einfärben musst du ownerdraw verwenden, oder du setzt einfach nur die markierung (TStringgrid.row/col), welche dann natürlich immer dem eingestellten Nutzerprofil entspricht.
probiere einfach mal bisschen mit dem Ownerdraw rum, ohne dein vorhandenes backend.

hab meine onDrawCell mal noch soweit ausgebaut, dass die Standard-Fäbung berücksichtigt wird (projektdateien im Anhang), da kannste dir mal anschauen, wie es funktioniert...

@fuknersascha
ich habe bewusst das beispiel einfach gehalten und auf Sachen wie Textausrichtung verzichtet :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz