Unterschiedlich farbige Gridlinien

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Unterschiedlich farbige Gridlinien

Beitrag von m.fuchs »

Zurück zur Frage: Leeres Projekt anlegen, ein DrawGrid drauf und GridLineWidth auf 0 stellen.
Dann OnDrawCell wie folgt füttern:

Code: Alles auswählen

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
begin
  with DrawGrid1.Canvas do begin
    Pen.Color := clBlack;
    Line(aRect.Left, aRect.Bottom - 1, aRect.Right -1, aRect.Bottom -1 );
    if aCol mod 2 = 0 then Pen.Color := clRed;
    Line(aRect.Right -1, aRect.Top, aRect.Right - 1, aRect.Bottom);
  end;
end;
Und schon ersparst du dir das Überschreiben der Paint-Methode und brauchst keine eigene Grid-Ableitung zu nutzen.

Viel Spaß
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Unterschiedlich farbige Gridlinien

Beitrag von Socke »

pluto hat geschrieben:Ich weiß gar nicht warum, die Komponenten immer Missbraucht werden für andere Zwecke...
Da kann ich nur zustimmen; Aber theoretisch sollte TDrawGrid doch alles mitbringen, um das komplette Zeichnen des Grids im User-Code ablaufen zu lassen; Wenn dem nicht so ist, wäre das meiner Meinung nach ein Feture Request wert. Ein Soduko wird in der Regel als Grid dargestellt, weshalb eine Grid-Komponente nicht wirklich falsch ist.
m.fuchs hat geschrieben:Zurück zur Frage: Leeres Projekt anlegen, ein DrawGrid drauf und GridLineWidth auf 0 stellen.
Das dürfte die Lösung für dieses Problem sein, auch, wenn es nicht unbedingt die eleganteste ist.
pluto hat geschrieben:Schon besser. Mir kommt es aber immer noch Überlagen und recht durcheinander vor. Vielleicht Täuscht das auch...
Bei so Ein-Fenster-Lösungen frage ich mich immer, wo denn da der ganze Rest platziert werden soll. Neben Quelltext-Editor, Objekt-Inspektor und Haupt-Fenster, ist bei mir immer noch mehr geöffnet (Nachrichten, Aufrufstack, Überwachte Ausdrücke, Projektmanager, Debugger-Auswertungen, usw.)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

aldicek
Beiträge: 37
Registriert: Do 6. Mär 2008, 12:48
OS, Lazarus, FPC: WinXP/Mint13KDE (Lazarus 1.0.8 FPC 2.6.2)
CPU-Target: 64 Bit
Wohnort: Halle (Saale)

Re: Unterschiedlich farbige Gridlinien

Beitrag von aldicek »

@Michael Fuchs:

Danke, das war genau was ich für diesen Zweck suchte. Für mich hat sich dieses Thema damit vorerst erledigt. Nochmals vielen Dank für alle Antworten!
Für alle, die sich für die konkrete Realisierung interessieren, hier das komplettierte Listing zu Michael Fuchs' Lösung:

Code: Alles auswählen

procedure TForm1.sdkGridDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
  with sdkGrid.Canvas do
  begin
    { default GridLines }
    Pen.Color := sdkGrid.GridLineColor;
    { horizontal unten von links nach rechts }
    Line(aRect.Left, aRect.Bottom - 1, aRect.Right - 1, aRect.Bottom - 1 );
    { vertikal rechts von oben nach unten }
    Line(aRect.Right - 1, aRect.Top, aRect.Right - 1, aRect.Bottom);
 
    { special GridLines }
    Pen.Color := clDefault;
    { vertikal links von oben nach unten }
    if (aCol = 1) and not (gdFixed in aState) then
      Line(aRect.Left, aRect.Top, aRect.Left, aRect.Bottom);
    { vertikal rechts von oben nach unten }
    if (aCol mod 3 = 0) and not (gdFixed in aState) then
      Line(aRect.Right - 1, aRect.Top, aRect.Right - 1, aRect.Bottom);
    { horizontal oben von links nach rechts }
    if (aRow = 1) and not (gdFixed in aState) then
      Line(aRect.Left, aRect.Top, aRect.Right, aRect.Top);
    { horizontal unten von links nach rechts }
    if (aRow mod 3 = 0) and not (gdFixed in aState) then
      Line(aRect.Left, aRect.Bottom - 1, aRect.Right, aRect.Bottom - 1);
  end;
end;
Aussehen tut es dann so:
Bild


Danke
Aldi
Zuletzt geändert von aldicek am Mi 9. Nov 2011, 23:21, insgesamt 2-mal geändert.

wp_xyz
Beiträge: 5148
Registriert: Fr 8. Apr 2011, 09:01

Re: Unterschiedlich farbige Gridlinien

Beitrag von wp_xyz »

Erzeuge einen Nachfahren von TStringGrid und überschreibe die Methode DrawCellGrid. Sie ist für das Zeichnen der Gitterlinien zuständig - da hast du alle Freiheit, die Gitterlinien selbst zu gestalten. Schau dir einfach mal den Quellcode von TCustomGrid an (das ist ein Vorfahre von TStringGrid).

[Edit] - Sorry, hab beim Schreiben nicht den vorigen Beitrag des Threads gesehen...

aldicek
Beiträge: 37
Registriert: Do 6. Mär 2008, 12:48
OS, Lazarus, FPC: WinXP/Mint13KDE (Lazarus 1.0.8 FPC 2.6.2)
CPU-Target: 64 Bit
Wohnort: Halle (Saale)

Re: Unterschiedlich farbige Gridlinien

Beitrag von aldicek »

wp_xyz hat geschrieben:Erzeuge einen Nachfahren von TStringGrid und überschreibe die Methode DrawCellGrid. Sie ist für das Zeichnen der Gitterlinien zuständig - da hast du alle Freiheit, die Gitterlinien selbst zu gestalten. Schau dir einfach mal den Quellcode von TCustomGrid an (das ist ein Vorfahre von TStringGrid).

[Edit] - Sorry, hab beim Schreiben nicht den vorigen Beitrag des Threads gesehen...
Hallo wp_xyz!

Meine Frage ging ja aber gerade dahin, wie ich es vermeiden kann, eine Komponente zur Laufzeit erzeugen zu müssen. Ich habe da immer noch was von einem Class Cracker im Hinterkopf über den ich mal was gelesen habe, aber wie man so etwas in diesem Fall anwenden würde, das wäre, was mich jetzt noch interessieren würde...
Trotzdem vielen Dank für deine Antwort!

Aldi

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Unterschiedlich farbige Gridlinien

Beitrag von Socke »

aldicek hat geschrieben:Ich habe da immer noch was von einem Class Cracker im Hinterkopf über den ich mal was gelesen habe, aber wie man so etwas in diesem Fall anwenden würde, das wäre, was mich jetzt noch interessieren würde...
Du könntest eine Komponente ableiten und die überschriebene Methode zur Laufzeit in der VMT deines vorhanden Grids eintragen; du sollstest dann nur darauf verzichten, die ursprüngliche Methode mit inherited aufzurufen. So ganz sauber ist das aber auch nicht…
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Unterschiedlich farbige Gridlinien

Beitrag von m.fuchs »

aldicek hat geschrieben:Meine Frage ging ja aber gerade dahin, wie ich es vermeiden kann, eine Komponente zur Laufzeit erzeugen zu müssen. Ich habe da immer noch was von einem Class Cracker im Hinterkopf über den ich mal was gelesen habe, aber wie man so etwas in diesem Fall anwenden würde, das wäre, was mich jetzt noch interessieren würde...
Ich glaube ein Class Cracker würde in diesem Fall nichts nützen.

Funktionieren tut das wie folgt. Du hast eine Klasse TOriginal:

Code: Alles auswählen

type
  TOriginal = class(TObject)
    protected
      function GetHallo: String;
  end;
 
implementation
 
function TOriginal.GetHallo: String;
begin
  Result := 'Hallo';
end;
In einer anderen Unit hast du eine Instanz von TOriginal namens MyObj. Nun möchtest du auf MyObj.GetHallo zugreifen:

Code: Alles auswählen

MyString := MyObj.GetHallo;
Klappt nicht, weil MyObj.GetHallo ja protected ist.

Dann baust du dir einen Cracker:

Code: Alles auswählen

type
  TCracker = class(TOriginal)
    public
      function GetHallo: String;
  end;
 
implementation
 
function TCracker.GetHallo: String;
begin
  Result := inherited GetHallo;
end;
Und mit Hilfe dieses Crackers kannst du dann doch auf GetHallo zugreifen, ohne dass MyObj ein anderer Typ sein muss:

Code: Alles auswählen

MyString := TCracker(MyObj).GetHallo;
Soweit dazu. Du möchtest aber nicht auf eine geschützte Methode zugreifen, sondern eine überschreiben. Da fällt mir aber nicht ein, wie das mit einem Class Cracker gehen soll. Aber vielleicht sieht irgendjemand noch etwas, was ich nicht sehe.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Unterschiedlich farbige Gridlinien

Beitrag von m.fuchs »

Socke hat geschrieben:Du könntest eine Komponente ableiten und die überschriebene Methode zur Laufzeit in der VMT deines vorhanden Grids eintragen;
Wie funktioniert so etwas?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

aldicek
Beiträge: 37
Registriert: Do 6. Mär 2008, 12:48
OS, Lazarus, FPC: WinXP/Mint13KDE (Lazarus 1.0.8 FPC 2.6.2)
CPU-Target: 64 Bit
Wohnort: Halle (Saale)

Re: Unterschiedlich farbige Gridlinien

Beitrag von aldicek »

m.fuchs hat geschrieben: Wie funktioniert so etwas?
Hallo,

eventuell meint Socke:

Code: Alles auswählen

Self.meinGrid.OnDrawCell := @Self.meineDrawCellProcedure;
Wobei Self Zeiger auf das Parentform von meinGrid wäre. Hänge ich das jetzt in die OnCreate-Ereignisbehandlungsroutine des Parentforms, kann ich es in dieser Weise nachvollziehen.

Gruß
Aldi

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Unterschiedlich farbige Gridlinien

Beitrag von Socke »

aldicek hat geschrieben:eventuell meint Socke:

Code: Alles auswählen

Self.meinGrid.OnDrawCell := @Self.meineDrawCellProcedure;
Wobei Self Zeiger auf das Parentform von meinGrid wäre. Hänge ich das jetzt in die OnCreate-Ereignisbehandlungsroutine des Parentforms, kann ich es in dieser Weise nachvollziehen.
Nein, ich wollte in der VMT der alten Klasse die Adresse der neuen Methode eintragen. Nur ist die VMT leider nicht so gut dokumentiert, als dass ich da so einfach drinnen suchen könnte (falls das überhaupt da drinnen steht).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten