![]() |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Sorry, sorry, sorry :pale:
Das war ein wenig schusselig von mir. Die Typecasts sind falsch. Richtig ist:
Delphi-Quellcode:
übrige Fragen: Nein, die Zelle hat keine Information, welche Farbe sie einnehmen soll - aus diesem Grund färbst DU die Zelle im OnDrawCell(). Und weil die Zelle diese Information nicht besitzt, legst du die Farbinformation in Objects[] ab, um später in der Exportprozedur darauf zugreifen zu können.
StringGrid1.Objects[ACol,ARow]:=Pointer(Canvas.Brush.Color); // in OnDrawCell()
Color:=TColor(StringGrid1.Objects[aCol,ARow]); // in ExportProzedur |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Danke, bin vor einer Minute selbst auf DEINE Lösung gekommen,...... fast.
Ich habe es so gemacht:
Delphi-Quellcode:
Das geht wohl auch mit StringGrid1.Objects statt TStringGrid(Sender).Objects und
begin
Canvas.Brush.Color := clLime; TStringGrid(Sender).Objects[aCol,aRow] := Pointer(clLime); Canvas.Font.Color := clBlack; Canvas.Font.Style := [fsbold]; Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]); Canvas.FrameRect(Rect); end; beim Pointer mit (clLime) oder eben mit (Canvas.Brush.Color) aber, die gefärbte Zelle flimmert dann extrem, in allen Fällen. Das war vorher nicht. Wie bekomme ich das weg? |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Hmmm :shock: :shock:
Habe keine Idee warum es flackert. Spontane Idee: Den Farbwert nur dem Objekt zuweisen, wenn etwas anderes (also nix oder 'ne andere Farbe) enthalten ist. Das reduziert den schreibenden Zugriff - ob das was bringt? Probiere es mal aus. |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Hab schon alles probiert, Reihenfolge, Dinge weglassen, bringt nichts.
Es flackert sobald ich in Objects reinschreibe. |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Mir ist aufgefallen, dass du mit
Delphi-Quellcode:
eine mir ungewohnt erscheinende Art der Ausgabe verwendest. Offensichtlich funktioniert sie, aber üblicherweise schaut das eher so aus..
Canvas.Brush.Color := clBlue;
Canvas.Font.Color := clWhite; Canvas.Font.Style := [fsbold]; Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]); Canvas.FrameRect(Rect);
Delphi-Quellcode:
Flackert es auch mit dieser Ausgabeversion?
Canvas.Brush.Color := clBlue;
Canvas.FillRect(Rect); Canvas.Font.Color := clWhite; Canvas.Font.Style := [fsbold]; Canvas.Textout(Canvas.Handle,Rect.Left+2,Rect.Top+2,PChar(Cells[acol,arow]),length(cells[acol,arow])); |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Hallo,
ich mach in meiner Software in OnDrawCell das gleiche
Delphi-Quellcode:
Aber bei mir flattert nichts
Brush.Color := Integer(Objects[aCol, ARow]);
FillRect(Rect); |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Die ungewöhnliche Ausgabeform habe ich hier aus dem Forum.
Deine Form funktioniert bei mir nicht, da bekomme ich den Fehler: Inkompatible Typen String und Integer. |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Oh Mann! Oh Mann!
Muss natürlich
Delphi-Quellcode:
sein, dass Canvas muss weg.
Textout(Canvas.Handle,Rect.Left+2,Rect.Top+2,PChar(Cells[aCol,aRow]),length(Cells[aCol,aRow]));
Ach, ich mach besser Schluß für heute ... |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Hallo,
Zitat:
Merksatz: Innerhalb solcher Ereignisbehandlungs-Routinen wie, OnDrawCell, OnDrawItem etc. nie Code ausführen der ein Neuzeichnen auslöst. Die Lösung Deines Problems steht in Beitrag ![]() Zitat:
Mal im groben: Steht in der Zelle ein X dann wird sie in OnDrawCell in ClLime gezeichnet, also setz in ColorIndex eine 4. Dein Code abgewandelt:
Delphi-Quellcode:
var s : String;
//... For i := 1 to 24 do For j := 1 to 7 do begin s := StringGrid1.Cells[j, i]; Excel.Cells[i, j] := s; If s = 'X' then Excel.Selection.Interior.ColorIndex := 4; end; |
Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra
Lannes, Du hast Recht und ich danke dir, auch wenn ich genau diese Lösung bereits vor deinem Post selbst eingebaut habe.
Wie Du in einem meiner ersten Post bereits zitiert hast, "... Beim export nach excel will ich diese Abfrage nicht machen, sondern gleich sagen, " wollte ich genau diese Lösung nicht, letztendlich, da sich das mit dem Flackern nicht lösen lies, habe ich es genau so eingebaut, mit abgewmdeltem Code da ich das ganze mit dem "X" in einem anderen StringGrid checke. Es freut mich, dass ich doch langsam begreife warum was nicht geht, denn ich hatte bereits das gleiche vermutet, wie Du jetzt sagst: "das muss flackern, denn durch das setzen von Objects wird das Neuzeichnen der Zelle = Ereignis OnDrawCell, ausgelöst." Genau das habe ich schon bei anderer Gelegenheit festgestellt und sehe die Lösung für sowas genauso, keinen Code innerhalb der OnDrawCell der sozusagen OnDrawCell selbst immer wieder provoziert. Mein Code sieht jetzt so aus:
Delphi-Quellcode:
Excel.Cells[i+6, j+1] := StringGrid1.Cells[j, i];
Excel.Cells[i+6, j+1].Select; if (StringGrid1.Cells[j, i] <> '') and (StringGrid1.Cells[j, i] <> ' ') then if StringGrid1.Cells[j, i] = StringGrid3.Cells[0, StrToInt(StringGrid1.Cells[j, i])] then begin if (StringGrid3.Cells[1, StrToInt(StringGrid1.Cells[j, i])] = 'x') or (StringGrid3.Cells[1, StrToInt(StringGrid1.Cells [j, i])] = 'X') then Excel.Selection.Interior.ColorIndex := 4; //grün machen Excel.Selection.Interior.Pattern := xlSolid; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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