Zeichnen Ohne DrawCell

Für Fragen von Einsteigern und Programmieranfängern...
DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Zeichnen Ohne DrawCell

Beitrag von DiBo33 »

Jou, du übermalst es ja auch in deiner Procedure SetzRegel, hier musst du natürlich Col und Row überprüfen ob diese > 0 sind.

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:Jou, du übermalst es ja auch in deiner Procedure SetzRegel, hier musst du natürlich Col und Row überprüfen ob diese > 0 sind.
Besagt Procedure wird bei Programmstart ausgerufen??? sollte Eigentlich net so sein, das SetzRegel erst hier

Code: Alles auswählen

procedure TForm2.Button1Click(Sender: TObject);
Var Max: Byte;
    Farben: TKalender;
begin
     inc(Count);
     case Count of
          1: begin
               TempStr2.Add(IntToStr(Datum.Day) + '.' +
                            IntToStr(Datum.Month));
               TempStr2.Add(RadioGroup1.Items[RadioGroup1.ItemIndex]);
               with FormTemp do
                 begin
                 add(RadioGroup1.Caption);
                 for Max:= 1 to 5 do
                   add(RadioGroup1.Items[Max-1]);
                 add(IntToStr(RadioGroup1.Top));
                 end;
               Checkbox1.Visible:= False;
               With RadioGroup1 do
                 begin
                 Caption:= 'Regelschmerzen';
                 Items.Clear;
                 Items.Add('Keine');
                 Items.Add('Leichte');
                 Items.Add('Normal');
                 Items.Add('Stark');
                 Top:= CheckBox1.Top;
                 end;
             end;
          2: begin
               TempStr2.Add(RadioGroup1.Items[RadioGroup1.ItemIndex]);
               RadioGroup1.Visible:= False;
               Label1.Visible:= True;
               Label2.Visible:= True;
               Edit1.Visible:=  True;
               Edit2.Visible:=  True;
             end;
          3: begin
               TempStr2.Add(Edit1.Text);
               TempStr2.Add(Edit2.Text);
               Label1.Visible:= False;
               Label2.Visible:= False;
               Edit1.Visible:=  False;
               Edit2.Visible:=  False;
               Memo1.Visible:=  True;
             end;
          4: begin
             Farben.Regel:= Form1.ColorDialog1.Color;
             Farben.Menstruation:= Form1.ColorDialog2.Color;
             with Memo1 do
               for Max:= 1 to Lines.Co[code=laz]
unt do
TempStr2.Add(lines[Max-1]);
For Max:= 1 to TempStr2.Count do
TempStr.Add(TempStr2[Max-1]);
TempStr.SaveToFile('Test.virus');
Form1.SetzRegel; // erster aufruf von SetzRegel
Form1.SetzRegel(Farben);
Button2.Click;
end;
end;
end;[/code]das erste mal aufgerufen wird!

Code: Alles auswählen

Procedure TForm1.SetzRegel(Kalender: TKalender); Overload;
begin
     with StringGrid1 do
          begin
          Canvas.Pen.Width:= 1;
          Canvas.Brush.Color:= Kalender.Menstruation;
          Canvas.FillRect(CellRect(Form2.Datum.Day, Form2.Datum.Month));
//          Repaint;
          end;
end;
dirch diesen aufruf

Code: Alles auswählen

Canvas.FillRect(CellRect(Form2.Datum.Day, Form2.Datum.Month));
läd er sich ja sein Rect anhand des Datum selber raus.

das ist der grundgedankt. bei werten, welche ein Ungüldiges Datum ergeben würden, auch 0.0. bekommt das programm den wert False, und bricht den rest ab, das sollte nach der Schleife auch so sein.

Code: Alles auswählen

Function TForm2.DateExist(Day, Month: Byte):Boolean;
begin
     DayTrue:= False;
     case Month of
          1, 3, 5, 7, 8, 10, 12: DayTrue:= True;
          2: case Day Of
                  1..29: begin
                         DayTrue:= True;
                         if Form1.Schalt and (Day = 29) then DayTrue:= True;
                         end;
             end;
          4, 6, 9, 11: Case Day of
                            1..30 : DayTrue:= True;
                       end;
          end;
     result:= DayTrue;
end;
Bitte nicht lachen aber diese Schleiße habe ich 10 mal mit Papier und stift überprüft.
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 »

Besagt Procedure wird bei Programmstart ausgerufen???
OnSelectCell wird auch aufgerufen bevor du darauf klickst, ich würde OnClick dafür verwenden.

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:
Besagt Procedure wird bei Programmstart ausgerufen???
OnSelectCell wird auch aufgerufen bevor du darauf klickst, ich würde OnClick dafür verwenden.
Stimmt die wird ebenso die Drawcell gleich aufgerufen.

Code: Alles auswählen

procedure TForm1.DrawGrid1SelectCell(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean);
begin
     if run then Run:= False; // erste Abfang
     if _Free then  // dauerlauf verhindern.
        begin
        Caption:= Caption + 'Select|' + IntToSTr(aCol) + '.' + IntToStr(aRow);
        if Form2.DateExist(aCol, aRow) then
           begin
           Form2.Datum.Day:= aCol;
           Form2.Datum.Month:= aRow;
//           Eintrag;
          end;
        _free:= False;
        end;
end;
aus dem Grund habe ich ja auch dies mit der abfrage abgefangen.

aber SelectCell bzw drawcell liefern mir über die werde aCol und aRow das Datum was ich auch nutzten muß.

da ich dieses einmal allerdings ein StringGrid nutzen will, liegt es mir gerade diesmal fern in dem punkt aufzugeben.

soll aber wie hier http://www.michael-fuchs.net/newsgroups ... ongrid.png angeleht sein.
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 »

Also soll nur die Farbe den Status hat Regel oder hat keine anzeigen, unabhängig der schwere der Regel?
Regeldaten.Kalender hat doch bereits ein entspr. Array zur Verfügung, also setzt du in SetzeRegel nur den Eintrag auf True oder False und fragst den Status im OnDrawCell ab.

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
    if Regeldaten.Kalender[aRow, aCol] then
      sg.Canvas.Brush.Color := clRed
    else
      sg.Canvas.Brush.Color := clWhite;
    sg.Canvas.FillRect(aRect);
    sg.Canvas.TextRect(aRect, aRect.Left + 2, aRect.Top + 2, sg.Cells[aCol, aRow]);
    sg.Canvas.FrameRect(aRect);
  end;
end;
Sonst nirgends wird irgendwo der Canvas übermalt.

Wenn du den Status in SetRegel änderst, kannst du mit StringGrid1.Invalidate ein Neuzeichnen veranlassen.

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 »

ich glaube hier reden wir wirklich aneinander vorbei!

das Grundproblem liegt darin, das die Zelle(1,0 bis 32,0 auch Übermalt wird.

ich könnte das kante programm erst mal weiter schreiben, und dies Ignorieren! aber das Problem besteht weiter...

bei mir steht von Haus aus der Tag drinne nur das wird auch Übermalt. sprich wo die tage 1 bis 31 stehen sollten sehe ich nun nur ein leeres Feld in der Farbe clbtnface der text is einfach wech.

Edit*

Da ja bei drawcell der codeabschnitt

Code: Alles auswählen

for temp:= 1 to 31 do
         StringGrid1.Cells[Temp, 0]:= inttostr(Temp);
nicht zu gehen scheint muß ich den über diesen code machen

Code: Alles auswählen

for Temp:= 1 to 31 do
         StringGrid1.Canvas.TextOut(((30*temp)+65-(Stringgrid1.Canvas.TextWidth(intToStr(temp))div 2)),
                                      5, IntToStr(Temp));
Anders wäre es mir zwar lieber gewesen aber scheint bei grid's wohl so zu sein.
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 hast die Events wohl noch nicht ganz verstanden, SelectCell und DrawItem werden unabhängig deines Zutuns ständig aufgerufen.

Ich hab dir mal ein Beispiel angehängt wie ich das mit dem Status und DrawItem meine.
Dateianhänge
regel.zip
(6.19 KiB) 76-mal heruntergeladen

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:Du hast die Events wohl noch nicht ganz verstanden, SelectCell und DrawItem werden unabhängig deines Zutuns ständig aufgerufen.

Ich hab dir mal ein Beispiel angehängt wie ich das mit dem Status und DrawItem meine.
Schau ich mir morgen mal in ruhe an.
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 »

Genau so in der richtung meine ich das. gut das Die Jahrezahl oben links in der ecke steht, ok! is Optional.

Aber das Eigendliche problem, von dem ich die ganz zeit rede, ich der Punkt, das in den feldern der Farbe nlBtnFace, links von der Jahrezahl die werte 1 bis 31 einfach verschwinden.

Bild

dies ist das einzige, von dem ich hier reden.

Dibo Danke für die zeilen, muste aber 2 zeilen an mein BS anpassen.

form2, werd ich lieber meine nutzen, da die Tabs so sauber das auch sein mag, noch einies an Arbeit machen würden (Bedingungen ändern, usw.) aber im großen und Ganzsen suber und danke für deine Mühe.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten