Zeichnen Ohne DrawCell

Für Fragen von Einsteigern und Programmieranfängern...
Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Zeichnen Ohne DrawCell

Beitrag von Maik81ftl »

Moin Moin...

Mal ne total bescheiden Frage?

Kann man Ohne dem aufRuf OnDrawCell überhaupt in einem StringGrid zeichnen?

Frage deshalb, da hier irgendwo nix passiert.

Code: Alles auswählen

Procedure SetzRegel(Kalender: TKalender); Overload;
begin
     Form1.Caption:=  Form1.Caption + ' Übergebene Fargen verwenden.';
     with Form1.StringGrid1 do
          begin
          Canvas.Pen.Width:= 1;
          Canvas.Brush.Color:= Kalender.Menstruation;
          Canvas.FillRect(CellRect(Form2.Datum.Day, Form2.Datum.Month));
          end;
end;
 
Procedure SetzRegel; Overload;
Const stKalender:TKalender=(Regel:clBlue;
                            Menstruation: clred;);
begin
     Form1.Caption:= 'Standart Farben verwenden|';
     Setzregel(stKalender);
end;
Das die proceduren laufen weis ich, da die Caption beides mal zu lesen ist.

auf die OnDrawCell selber würde ich wenn Möglich gerne verzichten, da diese mir jedesmal den Text auf den Pos. StringGrid1.Cells[Day, 0] löscht.

Edit*

Beide Proceduren befinden sich, in der Unit2.
Zuletzt geändert von Maik81ftl am So 13. Mär 2011, 16:40, insgesamt 2-mal geändert.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Zeichnen Ohne DrawCell

Beitrag von Maik81ftl »

Hab das Programm mal versucht um kleiner sachen zu ändern. Diese sehen nun wie folgt aus.

erst mal alles in die Form1 verschoben;

Code: Alles auswählen

Procedure TForm1.SetzRegel(Kalender: TKalender); Overload;
begin
     Form1.Caption:=  Form1.Caption + ' Übergebene Fargen verwenden.';
     with StringGrid1 do
          begin
          Canvas.Pen.Width:= 1;
          Canvas.Brush.Color:= Kalender.Menstruation;
          Canvas.FillRect(CellRect(Form2.Datum.Day, Form2.Datum.Month));
          Repaint;  // <--- Einfügen des Repaint
          end;
end;
 
Procedure TForm1.SetzRegel; Overload;
Const stKalender:TKalender=(Regel:clBlue;
                            Menstruation: clred;);
begin
     Form1.Caption:= 'Standart Farben verwenden|';
     Setzregel(stKalender);
end;
macht er erst mal den HG dieser Gewählten zelle, wie es auch sein soll. soweit sogut. Allerdings löscht er diese Farbe auch gleich wieder. :|
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
theo
Beiträge: 10905
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeichnen Ohne DrawCell

Beitrag von theo »

Maik81ftl hat geschrieben: Kann man Ohne dem aufRuf OnDrawCell überhaupt in einem StringGrid zeichnen?
Das würde ich nicht versuchen. Selbst wenn es z.B. auf Windows ginge, hiesse das nicht, dass es auf z.B. MacOS auch funzt.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Zeichnen Ohne DrawCell

Beitrag von Maik81ftl »

theo hat geschrieben:
Maik81ftl hat geschrieben: Kann man Ohne dem aufRuf OnDrawCell überhaupt in einem StringGrid zeichnen?
Das würde ich nicht versuchen. Selbst wenn es z.B. auf Windows ginge, hiesse das nicht, dass es auf z.B. MacOS auch funzt.
'net jut. Überhaupt net. :(

Dann muß ich mich halt mit Diesem Post weiter rumschlagen.

Hängt ja leider Direkt zusammen nur mit dem Unterschied, das der ander Post für mein ehemaliges DrawGrid gedacht war :(
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Zeichnen Ohne DrawCell. Gelöst

Beitrag von DiBo33 »

Schau dich hier mal ein wenig um
http://www.swissdelphicenter.ch/de/showcode.php?id=273" onclick="window.open(this.href);return false;

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Zeichnen Ohne DrawCell

Beitrag von DiBo33 »

Ich wollte eher wissen, was du mit den verschiedenen Mausaktionen erreichen willst.

Soll sich die Farbe ändern, der Text? wenn ja, wann?

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Zeichnen Ohne DrawCell. Gelöst

Beitrag von Maik81ftl »

DiBo33 hat geschrieben:Schau dich hier mal ein wenig um
http://www.swissdelphicenter.ch/de/showcode.php?id=273" onclick="window.open(this.href);return false;
Genau das ist der Kernpunkt. Allerdings nur wenn für die entsprechende Zelle die Menstruation auch vorliegt.

Aber sowie ich DrawCell verwende wird der Ganze Text in der Kopfleiste entfernt.

ergo ich will das DrawCell nur auf die Zellen[1,1] bis [32,13]wirkt.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Zeichnen Ohne DrawCell

Beitrag von DiBo33 »

Beispiel aus meiner Wühlkiste:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    data: TStringGrid;
    procedure dataClick(Sender: TObject);
    procedure dataDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect;
      aState: TGridDrawState);
    procedure FormActivate(Sender: TObject);
  private
    { private declarations }
    status: array[0..4, 0..4] of integer;
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormActivate(Sender: TObject);
var
  c, r: integer;
begin
  OnActivate := nil;
  data.ColCount := 5;
  data.RowCount := 5;
  for r := 0 to 4 do begin
    data.Cells[0, r] := IntToStr(r);
    data.Cells[r, 0] := IntToStr(r);
    for c := 0 to 4 do begin
      status[c, r] := 0;
    end;
  end;
end;
 
procedure TForm1.dataDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var
  sg: TStringGrid;
begin
  sg := TStringGrid(Sender);
  if (aCol = 0) or (aRow = 0) then begin
    sg.Canvas.Brush.Color := clBtnFace;
  end else begin
    case status[aCol, aRow] of
      0: sg.Canvas.Brush.Color := clBlue;
      1: sg.Canvas.Brush.Color := clRed;
      2: sg.Canvas.Brush.Color := clGreen;
      else sg.Canvas.Brush.Color := clWhite;
    end;
    sg.Canvas.FillRect(aRect);
    sg.Canvas.TextRect(aRect, aRect.Left + 2, aRect.Top + 2, sg.Cells[aCol, aRow]);
    sg.Canvas.FrameRect(aRect);
  end;
end;
 
procedure TForm1.dataClick(Sender: TObject);
var
  sg: TStringGrid;
  c, r: integer;
begin
  sg := TStringGrid(Sender);
  c := sg.Col; r := sg.Row;
  if (c > 0) and (r > 0) then begin
    status[c, r] := status[c, r] + 1;
    if (status[c, r] > 2) then status[c, r] := 0;
    sg.Cells[c, r] := IntToStr(status[c, r]);
  end;
end;
 
end.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Zeichnen Ohne DrawCell

Beitrag von Maik81ftl »

so eine FUndgrupe ist schon was schönes... Danke erst mal.

Aber das eigendliche Problem ist hier nun wohl glaube für jeden eher zu sehen, als wann ich es nur schreibe.

Bild

Bei verwendung des Drawcell fehlt die obere Zeile komplett.

Bild

Bei nichtverwendung des Drawcell stehen die Tage wie es auch sein soll in der Koptzeile
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Zeichnen Ohne DrawCell

Beitrag von DiBo33 »

Dann zeige doch mal deine Routine DraweCell.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Zeichnen Ohne DrawCell

Beitrag von Maik81ftl »

DiBo33 hat geschrieben:Dann zeige doch mal deine Routine DraweCell.
ist jetzt erst mal nur mit dem Test von dir drinne...

Code: Alles auswählen

procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var
  sg: TStringGrid;
begin
  sg := TStringGrid(Sender);
  if (aCol = 0) or (aRow = 0) then begin
    sg.Canvas.Brush.Color := clBtnFace;
  end else begin
    case status[aCol, aRow] of
      0: sg.Canvas.Brush.Color := clBlue;
      1: sg.Canvas.Brush.Color := clRed;
      2: sg.Canvas.Brush.Color := clGreen;
      else sg.Canvas.Brush.Color := clWhite;
    end;
    sg.Canvas.FillRect(aRect);
    sg.Canvas.TextRect(aRect, aRect.Left + 2, aRect.Top + 2, sg.Cells[aCol, aRow]);
    sg.Canvas.FrameRect(aRect);
  end;
end;
hier auch noch die objecteinstellung über den Objectinspektor

Code: Alles auswählen

object StringGrid1: TStringGrid
    Left = 0
    Height = 400
    Top = 0
    Width = 1000
    ColCount = 32
    Columns = <    
      item
        Title.Alignment = taCenter
        Title.Caption = '1'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '2'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '3'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '4'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '5'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '6'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '7'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '8'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '9'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '10'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '11'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '12'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '13'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '14'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '15'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '16'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '17'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '18'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '19'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '20'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '21'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '22'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '23'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '24'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '25'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '26'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '27'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '28'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '29'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '30'
        Width = 30
      end    
      item
        Title.Alignment = taCenter
        Title.Caption = '31'
        Width = 30
      end>
    DefaultColWidth = 60
    DefaultRowHeight = 30
    RowCount = 13
    TabOrder = 0
    OnClick = DrawGrid1Click
    OnMouseUp = DrawGrid1MouseUp
    OnSelectCell = DrawGrid1SelectCell
  end
nicht aufgeführte daten sind alle default geladen.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Zeichnen Ohne DrawCell

Beitrag von DiBo33 »

Öhm, wenn du Fehler in einer Routine hast, dann mach es keinen Sinn eine funktionstüchtige zu posten, sondern dann solltest du auch die fehlerhafte Routine posten.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Zeichnen Ohne DrawCell

Beitrag von Maik81ftl »

Der fehler wird aber mit diesem Befehl erst sichtbar.

Code: Alles auswählen

OnSelectCell = DrawGrid1SelectCell
Edit* Das teil steht erst mal hier im Zip... ggf noch die *.so ausklammern
Dateianhänge
Regelkalender.zip
(1.96 MiB) 77-mal heruntergeladen
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Zeichnen Ohne DrawCell

Beitrag von DiBo33 »

Du musst StringGrid1.DragMode auf dmAutomatic setzen.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Zeichnen Ohne DrawCell

Beitrag von Maik81ftl »

Me leider auch keine änderung. :(

doe Row 0 wird dennoch immer weiter überschrieben.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten