![]() |
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 |
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:
das OnDrawCell sieht dann so in etwa aus:
if integer(stringgrid1.objects[0,0])=1 then ...
Delphi-Quellcode:
HTH Frank
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; |
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 |
Re: StringGrid Zelle bei ButtonKlick färben?
Guck mal vielleicht hilft dir das ist sowas ähnliches
Delphi-Quellcode:
musst du dir nur noch umbastel für dein button
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; Gruss sascha |
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 14:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz