![]() |
StringGrid Zelle einfärben
Ich habe ein StringGrid und möchte gerne einzele Zellen einfärben. Ich will das ganze letzendlich so einbauen, dass ich eine Funktion bekomme nach diesem Schema:
ColorCell(StringGrid1,1,1,clred); Ich muss halt im Programmablauf die Zellen farbig unterlegen. Ich habe das hier als Beispiel gefunden:
Delphi-Quellcode:
Aber leider verstehe ich es nciht wirklich und dann möchte ich es nciht benutzen. Kann mir einer ein wenig erläutern wie es funktioniert, was z.B. in die Parameter rein müsste und wie ich es in meine Form bringen könnte?!
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); begin with TStringGrid(Sender).Canvas do begin if (ACol=1) and (ARow=1) then begin Brush.Color:= clRed; FillRect(Rect); end; end; end; Vielen Dank zorakh |
Re: StringGrid Zelle einfärben
Markiere das StringGrid einmal in der IDE, wechsel im OI auf "Ereignisse" und mach dort einen Doppelklick auf "OnDrawCell". Schon hast Du die Parameter ;) Und zumindest in älteren Delphi-Versionen ist dieses Ereignis auch gut in der Hilfe beschrieben.
|
Re: StringGrid Zelle einfärben
Wann findet denn dieses Ereigniss immer statt?
Weil es nützt mir wiegsagt ncihts, wenn das nur einmal passiert. Außerdem noch nebenbei; Wenn sich das Ereigniss jetzt ein 2. mal mit anderen Koordinaten ausführen würde wäre dann die 1,1 Zelle wieder weiß? nein oder? |
Re: StringGrid Zelle einfärben
|
Re: StringGrid Zelle einfärben
In dem Link konnte ich jetzt die Antwort auf meine beiden Fragen(Der Post über diesem) leider auch nciht erspähen?!
Kann mir dazu jemand noch etwas sagen? |
Re: StringGrid Zelle einfärben
Das Ereignis wird ausgelöst, wenn eine Zelle neu gezeichnet werden muss, weil sich z.B. der Text geändert hat. Und ob die vorherige Zelle weiß wird oder nicht, liegt in Deiner Hand, wenn Du selbst zeichnest.
|
Re: StringGrid Zelle einfärben
Udn wie löse ich das Ereigniss manuell aus?
Stringgrid1.OnDrawCell geht nciht. Nicht genug Parameter |
Re: StringGrid Zelle einfärben
Zusätlich zum manuell auslösen gibt es noch ein Problem.
Nämlich werden alle Ereignisse blockiert. Ich habe:
Delphi-Quellcode:
und
procedure TForm1.TabelleDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); begin with TStringGrid(Sender).Canvas do begin if (ACol=0) and (ARow=0) then begin If Colormod='clwhite' then Brush.Color:=clwhite else Brush.Color:= clRed; end; FillRect(Rect); end; end;
Delphi-Quellcode:
Benutze ich das Ereigniss unter OnDrawCell nciht so werden die X-Zeichen eingezeichnet. So sehe ich aber nur ein rotes Feld und das wars...
procedure TForm1.FormCreate(Sender: TObject);
var S1,S2:integer; begin Colormod:='clred'; Feldmase:=10; SetLength(Feld,Feldmase,Feldmase); SetLength(Feld2,Feldmase,Feldmase); ConfigField(); for S1:=0 to (feldmase-1) do begin Tabelle.Cells[S1,0]:='X'; Tabelle.Cells[S1,(feldmase-1)]:='X'; Tabelle.Cells[0,S1]:='X'; Tabelle.Cells[(feldmase-1),S1]:='X'; end; [...] Wie kann das sein? |
Re: StringGrid Zelle einfärben
Weiß niemand warum das den Programmablauf stoppt?
|
Re: StringGrid Zelle einfärben
was wird gestoppt?
du prüfst auf row=0 und col=0 danach dein eigener zeichencode...also färbst du auch nur die eine zelle rot bzw. weiß, alles andere wird nicht gezeichnet...der Zelltext wird deshalb nicht angezeigt, weil du ihn nicht zeichnest :) mit dem fillrect übermalst du alles in der Zelle und musst den Text neu zeichnen (TCanvas.Textout). weiterhin ist dein colormod nur global gültig und nicht pro zelle, was evtl. gewünscht ist. um zu speichern, welche zelle welche farbe haben soll, kannst du das Objects-property verwenden. dort kannst du pro zelle ein Objekt (oder einen auf TObject gecasteten Integer :) ) hinterlegen.je nachdem wieviele Infos du pro zelle benötigst, musst du deine Wahl diesbezüglich treffen... HTH Frank |
Re: StringGrid Zelle einfärben
Zitat:
zu deinem Problem mit dem manuellen Ausführen: eicnfach die Funktion mit den Parametern die benötigt werden aufrufen. Wobei: Wozu brauchst du das? Windows zeichnet dir das Fenster doch von sich aus neu. aber hier mal ein Beispiel
Delphi-Quellcode:
Dieser Code würde nun die Funktion aufrufen, und die Zelle oben links neu zeichnen :)
TabelleDrawCell(Nil, 0,0 myRect, []);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 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 by Thomas Breitkreuz