Autor Beitrag
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Mo 20.10.08 22:07 
Ich habe im ondrawcell folgendes, um Zellen zu färben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Tmain_form.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with TStringGrid(Sender).Canvas do begin
       if ((ACol=1and (ARow>2)) or ((Acol=3and (Arow>0)) or ((Acol=2and (Arow=8)) then
       begin
          Brush.Color:= rgb (230250230);
          FillRect(Rect);
       end;

  end;
end;


Damit Unterdrücke ich Usereingaben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure Tmain_form.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  CanSelect:=     not(
  (((ACol=1and (ARow=3)))or
  (((ACol=1and (ARow=4)))or
  (((ACol=1and (ARow=5)))or
  (((ACol=1and (ARow=6)))or
  (((ACol=1and (ARow=7)))or
  (((ACol=1and (ARow=8)))or
  (((ACol=3and (ARow=1)))or
  (((ACol=3and (ARow=2)))or
  (((ACol=3and (ARow=3)))or
  (((ACol=3and (ARow=4)))or
  (((ACol=3and (ARow=5)))or
  (((ACol=3and (ARow=6)))or
  (((ACol=3and (ARow=7)))or
  (((ACol=3and (ARow=8)))or
  (((ACol=2and (ARow=8))));


end;


Nun möchte ich aber so
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  for I := 1 to stringgrid1.ColCount - 1 do
  begin
  stringgrid1.Cells[3, i]:=floattostr(strtofloatdef(stringgrid1.Cells[2, i], 0) / 12);
  end;


auch auf die gefärbten und geschützten Zellen zugreifen; es soll halt nur der User nichts reinschreiben.

Aber das funktioniert nicht. Vermutlich wird im Ondrawcell der Text gleich wieder Übermalt, oder?

Wie geht dass trotzdem (Färben+text)????
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mo 20.10.08 22:37 
Hallo,

mit Fillrect übermalst Du den Text,
also nach Fillrect den Text mit TextOut oder DrawText ausgeben/zeichnen.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Boldar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 21.10.08 14:25 
jetzt habe ich das so geändert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Tmain_form.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with TStringGrid(Sender).Canvas do begin
       if ((ACol=1and (ARow>2)) or ((Acol=3and (Arow>0)) or ((Acol=2and (Arow=8)) then
       begin
          Brush.Color:= rgb (230250230);
          FillRect(Rect);
          drawtext (stringgrid1.Handle, Pchar(stringgrid1.cells[acol, arow]), length(Pchar(stringgrid1.cells[acol, arow])), rect,  dt_singleline or dt_center or dt_vcenter);
       end;

  end;
end;


Der text wird jedoch immer noch nicht angezeigt.

Was mache ich denn jetzt noch falsch??
Hobby-Programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Di 21.10.08 18:18 
Tach ...,
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const cFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; // Textformatierung
var cText: String;  // Text der Zelle
begin
  with (Sender AS TStringGrid) do begin
    cText:= Cells[ACol, ARow];
    if ((ACol=1and (ARow>2)) or ((Acol=3and (Arow>0)) or ((Acol=2and (Arow=8)) then
      Canvas.Brush.Color:= rgb (230250230);
    Canvas.FillRect(Rect);
    drawtext (Canvas.Handle, Pchar(cText), Length(cText), rect, cFormat);
  end;
end;

Prinzipiell würde ich auch
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure Tmain_form.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  CanSelect:=     not(
  (((ACol=1and (ARow=3)))or
  (((ACol=1and (ARow=4)))or
  (((ACol=1and (ARow=5)))or
  (((ACol=1and (ARow=6)))or
  (((ACol=1and (ARow=7)))or
  (((ACol=1and (ARow=8)))or
  (((ACol=3and (ARow=1)))or
  (((ACol=3and (ARow=2)))or
  (((ACol=3and (ARow=3)))or
  (((ACol=3and (ARow=4)))or
  (((ACol=3and (ARow=5)))or
  (((ACol=3and (ARow=6)))or
  (((ACol=3and (ARow=7)))or
  (((ACol=3and (ARow=8)))or
  (((ACol=2and (ARow=8))));
end;
aber durch
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  CanSelect:= ((ARow in [1..3]) and (ACol in [2..3]));
end;
ersetzen!

LG Mario
Boldar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 21.10.08 20:52 
user profile iconHobby-Programmierer hat folgendes geschrieben Zum zitierten Posting springen:
Tach ...,
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  CanSelect:= ((ARow in [1..3]) and (ACol in [2..3]));
end;




hat aber nicht den gleichen Effekt, denn da wird [1, 8] zb. Nicht verboten...


user profile iconHobby-Programmierer hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const cFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; // Textformatierung
var cText: String;  // Text der Zelle
begin
  with (Sender AS TStringGrid) do begin
    cText:= Cells[ACol, ARow];
    if ((ACol=1and (ARow>2)) or ((Acol=3and (Arow>0)) or ((Acol=2and (Arow=8)) then
      Canvas.Brush.Color:= rgb (230250230);
    Canvas.FillRect(Rect);
    drawtext (Canvas.Handle, Pchar(cText), Length(cText), rect, cFormat);
  end;
end;


Wird ctext denn irgendwo auf '' Gesetzt??
Hobby-Programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Di 21.10.08 21:33 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
hat aber nicht den gleichen Effekt, denn da wird [1, 8] zb. Nicht verboten...
Ich wollte damit nur das Prinzip :wink: verdeutlichen wie er das übersichtlicher lösen kann. So sollte es dann passen
ausblenden Delphi-Quelltext
1:
2:
3:
 CanSelect:=  not (((ACol = 1and (ARow in [3..8])) or
                   ((ACol = 2and (ARow = 8))       or
                   ((ACol = 3and (ARow in [1..8])));

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:

user profile iconHobby-Programmierer hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const cFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; // Textformatierung
var cText: String;  // Text der Zelle
begin
  with (Sender AS TStringGrid) do begin
    cText:= Cells[ACol, ARow];
    if ((ACol=1and (ARow>2)) or ((Acol=3and (Arow>0)) or ((Acol=2and (Arow=8)) then
      Canvas.Brush.Color:= rgb (230250230);
    Canvas.FillRect(Rect);
    drawtext (Canvas.Handle, Pchar(cText), Length(cText), rect, cFormat);
  end;
end;


Wird ctext denn irgendwo auf '' Gesetzt??
Warum sollte cText vorher initialisiert werden? Es bekommt seinen Wert in Zeile 7 zugewiesen bevor mit ihr gearbeitet wird!

LG Mario
Boldar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 21.10.08 21:36 
Ach mist, tippfehler...
Ich meine ob warum man nicht direkt
ausblenden Delphi-Quelltext
1:
stringgrid1.cells					

nehmen kann??
Hobby-Programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Di 21.10.08 21:42 
Ähm, wo? :gruebel:
Boldar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 21.10.08 21:47 
da:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const cFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; // Textformatierung
var cText: String;  // Text der Zelle
begin
  with (Sender AS TStringGrid) do begin
    cText:= Cells[ACol, ARow];
    if ((ACol=1and (ARow>2)) or ((Acol=3and (Arow>0)) or ((Acol=2and (Arow=8)) then
      Canvas.Brush.Color:= rgb (230250230);
    Canvas.FillRect(Rect);
    drawtext (Canvas.Handle, Pchar(cText), Length(cText), rect, cFormat);
  end;
end;


Und ausserdem, fehlt hinter dem if nicht ein begin...end??
Hobby-Programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Di 21.10.08 21:58 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
da:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const cFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; // Textformatierung
var cText: String;  // Text der Zelle
begin
  with (Sender AS TStringGrid) do begin
    cText:= Cells[ACol, ARow];
    if ((ACol=1and (ARow>2)) or ((Acol=3and (Arow>0)) or ((Acol=2and (Arow=8)) then
      Canvas.Brush.Color:= rgb (230250230);
    Canvas.FillRect(Rect);
    drawtext (Canvas.Handle, Pchar(cText), Length(cText), rect, cFormat);
  end;
end;
Klaro kannst du cText durch Cells[ACol,ARow] ersetzen. Jeder wie er mag, ist nicht Programmrelevant sonder eher 'kosmetischer' Natur wegen der Übersichlichkeit.

Zitat:
Und ausserdem, fehlt hinter dem if nicht ein begin...end??

Versuchs macht kluch :wink: :idea:
Boldar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 21.10.08 22:00 
wo lag denn dann der Fehler?
Achso, canvas.handle

:autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch:
Hobby-Programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Di 21.10.08 22:04 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
wo lag denn dann der Fehler?
Achso, canvas.handle

:autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch:
Ups :oops:, hatte ich vergessen das zu erwähnen ...

LG Mario