AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Farbe von mit OnDrawcell gefärbter StringGridZelle abfragen
Thema durchsuchen
Ansicht
Themen-Optionen

Farbe von mit OnDrawcell gefärbter StringGridZelle abfragen

Ein Thema von Stecky2000 · begonnen am 5. Nov 2008 · letzter Beitrag vom 7. Nov 2008
Antwort Antwort
Seite 2 von 3     12 3      
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#11

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 18:53
Sorry, sorry, sorry

Das war ein wenig schusselig von mir. Die Typecasts sind falsch. Richtig ist:

Delphi-Quellcode:
StringGrid1.Objects[ACol,ARow]:=Pointer(Canvas.Brush.Color); // in OnDrawCell()

Color:=TColor(StringGrid1.Objects[aCol,ARow]); // in ExportProzedur
ü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.
Ralph
  Mit Zitat antworten Zitat
Stecky2000

Registriert seit: 7. Mai 2008
Ort: Trebur
66 Beiträge
 
Delphi 2010 Professional
 
#12

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 19:01
Danke, bin vor einer Minute selbst auf DEINE Lösung gekommen,...... fast.

Ich habe es so gemacht:

Delphi-Quellcode:
  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;
Das geht wohl auch mit StringGrid1.Objects statt TStringGrid(Sender).Objects und
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?
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#13

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 19:07
Hmmm
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.
Ralph
  Mit Zitat antworten Zitat
Stecky2000

Registriert seit: 7. Mai 2008
Ort: Trebur
66 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 19:21
Hab schon alles probiert, Reihenfolge, Dinge weglassen, bringt nichts.
Es flackert sobald ich in Objects reinschreibe.
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#15

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 19:34
Mir ist aufgefallen, dass du mit
Delphi-Quellcode:
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);
eine mir ungewohnt erscheinende Art der Ausgabe verwendest. Offensichtlich funktioniert sie, aber üblicherweise schaut das eher so aus..
Delphi-Quellcode:
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]));
Flackert es auch mit dieser Ausgabeversion?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#16

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 19:36
Hallo,

ich mach in meiner Software in OnDrawCell das gleiche
Delphi-Quellcode:
      Brush.Color := Integer(Objects[aCol, ARow]);
      FillRect(Rect);
Aber bei mir flattert nichts
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Stecky2000

Registriert seit: 7. Mai 2008
Ort: Trebur
66 Beiträge
 
Delphi 2010 Professional
 
#17

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 20:07
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.
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#18

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 20:31
Oh Mann! Oh Mann!
Muss natürlich Textout(Canvas.Handle,Rect.Left+2,Rect.Top+2,PChar(Cells[aCol,aRow]),length(Cells[aCol,aRow])); sein, dass Canvas muss weg.
Ach, ich mach besser Schluß für heute ...
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#19

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 22:10
Hallo,
Zitat von Stecky2000:
Hab schon alles probiert, Reihenfolge, Dinge weglassen, bringt nichts.
Es flackert sobald ich in Objects reinschreibe.
das muss flackern, denn durch das setzen von Objects wird das Neuzeichnen der Zelle = Ereignis OnDrawCell, ausgelöst. In OnDrawCell wird dann wieder Objects gesetzt = Neuzeichnen der Zelle = Ereignis OnDrawCell usw. usw. das Ereignis löst sich quasi selbst immer wieder aus.
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 #2

Zitat von Stecky2000:
... Beim export nach excel will ich diese Abfrage nicht machen, sondern gleich sagen,

Delphi-Quellcode:
For i := 1 to 24 do
  For j := 1 to 7 do
     begin
        Excel.Cells[i, j] := StringGrid1.Cells[j, i];
        If StringGrid1.Cells[j, i].Canvas.Brush.Color = clLime then
           Excel.Selection.Interior.ColorIndex := 4;
     end;
So was in der Art. Die Zellen des StringGrid1 müssen mir doch irgendwie Auskunft darüber geben können, ob sie
clLime, clRed, oder clBlue sind?
Die Zellen können Dir die Auskunft geben.
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 = 'Xthen
       Excel.Selection.Interior.ColorIndex := 4;
     end;
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Stecky2000

Registriert seit: 7. Mai 2008
Ort: Trebur
66 Beiträge
 
Delphi 2010 Professional
 
#20

Re: Farbe von mit OnDrawcell gefärbter StringGridZelle abfra

  Alt 5. Nov 2008, 23:01
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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