Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringGrid -> Eine Zelle zweifarbig, oder halbfarbig ? (https://www.delphipraxis.net/102229-stringgrid-eine-zelle-zweifarbig-oder-halbfarbig.html)

taaktaak 25. Okt 2007 12:14

Re: StringGrid -> Eine Zelle zweifarbig, oder halbfarbig
 
Hallo Holger.
Keine Sorge, jeder hat mal angefangen oder gerade ein Brett vor dem Kopf. Die beiden Rectangles RectA und RectB werden ja als VAR-Parameter übergeben. Das bedeutet, dass Änderungen innerhalb der Prozedur an den ausserhalb deklarierten Variablen vorgenommen werden (wird ja nur die Variablenadresse übergeben und keine lokale Kopie der Übergabeparameter innerhalb der Prozedur angelegt) - eine Funktion ist also hier nicht notwendig.
Gruß Ralph

HolgerCW 25. Okt 2007 12:18

Re: StringGrid -> Eine Zelle zweifarbig, oder halbfarbig
 
Und was ist mit dem Inhalt der Zauberei ?

Gruss

Holger

taaktaak 25. Okt 2007 12:30

Re: StringGrid -> Eine Zelle zweifarbig, oder halbfarbig
 
Tja, also der Inhalt ist ja völlig frei gestaltbar. Du könntest das Ausgangsrechteck horizontal oder vertikal halbieren oder eine beliebige Skalierung vornehmen. Beispiel wäre z.B.
Delphi-Quellcode:
procedure HalfRectangleVertical(Rect:TRect;var RectA,RectB:TRect);
var SumHeight,
    TopHeight,
    BottomHeight : Integer;
begin
  RectA:=Rect;
  RectB:=Rect;

  SumHeight:=succ(Rect.Bottom-Rect.Top);
  TopHeight:=SumHeight div 2;
  BottomHeight:=SumHeight-TopHeight;

  RectA.Bottom:=Rect.Top+TopHeight; // oberes Rechteck
  RectB.Top:=RectA.Bottom+1;       // unteres Rechteck
end;
Hm, wenn so (oder ähnlich) müsste es eigentlich funktionieren (kann es jetzt nicht ausprobieren)
Gruß Ralph

HolgerCW 25. Okt 2007 13:25

Re: StringGrid -> Eine Zelle zweifarbig, oder halbfarbig
 
Jetzt habe ich es auch endlich:

Habe alle Cellen 24 Breit und daher kann ich nun die Uhrzeiten dort grafisch abbilden.

Delphi-Quellcode:
procedure HalfRectVertical(const Rect:TRect; var RectA, RectB:TRect; VON: Integer; BIS: Integer);
begin

  RectA := Rect;
  RectB := Rect;

  RectB.Left := RectB.Left + VON;
  RectB.Right := RectB.Right - (24 - BIS);

end;
Brett habe ich endlich entfernt.

Gruss

Holger

leddl 25. Okt 2007 13:37

Re: StringGrid -> Eine Zelle zweifarbig, oder halbfarbig
 
Zitat:

Zitat von HolgerCW
aber ich glaube Ihr habt mich auf dem Gewissen. Wenn einer wie ich schon so blöde Fragen stellt, wie soll er dann so eine Aufgabe lösen ?

Das war der Grund, warum ich dir nicht einfach Quellcode hingeschmissen habe wie shmia, sondern dir den Gedankengang klarzumachen. Du brauchst auch die Prozedur, die shmia vorschlägt nicht unbedingt. Wichtig ist nur, dass du eben - anstatt nur ein Rechteck in einer Farbe zu zeichen - das Rechteck in 2 Teile aufspaltest und beide separat zeichnest. Mehr steckt nicht dahinter!
Wie du die aufspaltest, bleibt dabei natürlich dir überlassen, ob du horizontal oder vertikal halbierst oder eine andere Aufteilung wählst ist dabei völlig egal.

Um jetzt dann vielleicht doch mal mit Code um mich zu schmeissen:
Delphi-Quellcode:
Var RectA, RectB : TRect;
Begin
[...]

//neue Rechtecke erstellen, jeweils halb so breit wie das ursprüngliche Rechteck (Rect)
//Bei RectA ist die rechte Seite halb so weit weg wie bei Rect
RectA := Classes.Rect(Rect.Left,Rect.Top, Rect.Right div 2  ,Rect.Bottom);
//RectB beginnt einen Pixel neben der rechten Kante von RectA
RectB := Classes.Rect(  RectA.Right+1  ,Rect.Top,Rect.Right,Rect.Bottom);

//Zeichne RectA
Canvas.Brush.Color := clRed;
Canvas.FillRect(RectA);
//Zeichne RectB
Canvas.Brush.Color := clGreen;
Canvas.FillRect(RectB);
//Text ausgeben
Canvas.Brush.Color := clClear;
Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);

[...]
Ich hoffe, ich hab jetzt keine Fehler reingebaut... hab hier leider kein Delphi zur Hand, um es zu überprüfen. Soweit ich mich erinnere, erwartet Classes.Rect die linke obere und die rechte untere Koordinate des Rechtecks. (Evtl. mal in die Hilfe schauen und die Parameter in die richtige Reihenfolge bringen, falls da was nicht stimmt.)

Um vielleicht auch da nochmal einen Hintergrund zu geben (ich hoffe, ich erzähle keinen Blödsinn, hab nämlich wie gesagt kein Delphi zur Hand, um es zu überprüfen :lol:): TRect ist ein Record, in dem die 4 Seiten des Rechtecks gespeichert sind.
Mit der Funktion Rect aus der Unit Classes kannst du aus 2 Punkten (und damit 4 Ordinaten) ein TRect erstellen. In dem Code habe ich die Unit vor den Funktionsnamen geschrieben, weil es sonst evtl. zu Komplikationen mit der Variablen "Rect" geben könnte.

HolgerCW 25. Okt 2007 13:47

Re: StringGrid -> Eine Zelle zweifarbig, oder halbfarbig
 
Alles klar,

habe das nun alles verstanden, aber was macht denn in dieser Code - Zeile:

Delphi-Quellcode:
Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
dann noch das +2. Weill wenn ich da was ändere passiert nichts ?

Gruss

Holger

leddl 25. Okt 2007 14:04

Re: StringGrid -> Eine Zelle zweifarbig, oder halbfarbig
 
Zitat:

Zitat von HolgerCW
habe das nun alles verstanden, aber was macht denn in dieser Code - Zeile:

Delphi-Quellcode:
Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
dann noch das +2. Weill wenn ich da was ändere passiert nichts ?

Das ist die Textausgabe (da weist ja auch der Methodenname schon dezent drauf hin :mrgreen:)
Zuerst die Koordinate, an der der Text starten soll (Linke obere Ecke) und dann der Text (der in der Zelle mit der Koordinate [ACol, ARow] gespeichert ist)

Veränderst du die Koordinate der Ausgabe beginnt der Text eben an einer anderen Stelle. ;)

Kleiner Tipp für die Zukunft: Solche Dinge kann man auch wunderbar in der Hilfe nachlesen :zwinker:

//Edit: Hups, falsch verstanden... Dachte, du wolltest wissen, was die Zeile als ganzes macht :oops:
Aber beantwortet hab ichs ja trotzdem irgendwie. Das +2 sorgt einfach nur dafür, dass der Text nicht direkt in der Ecke der Zelle anfängt, sondern 2 Pixel darunter und rechts davon ;)

HolgerCW 25. Okt 2007 14:29

Re: StringGrid -> Eine Zelle zweifarbig, oder halbfarbig
 
Jetzt weiß ich endlich meinen Gedankenfehler.

Ich wollte die Farben ändern und habe an dem TextOut rumgespielt.

Da ich da keine Änderungen feststellen konnte lag daran, das ich keinen Text verwendet habe.

Brett ist jetzt endgültig vom Kopf entfernt.

Gruss

Holger


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz