Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Stringgrid-Zelle doppelt füllen (https://www.delphipraxis.net/59338-stringgrid-zelle-doppelt-fuellen.html)

fabiO 20. Dez 2005 21:34


Stringgrid-Zelle doppelt füllen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Ich habe eine Frage zu Stringgrids.
Ich habe ein Program geschrieben, dass aus 3 Forms besteht.

Die erste is die Main Form, die zweite die Auswertungs-Form und die Dritte zeigt Details an.

So nun will ich folgendes tun:

Ich habe zwei Arrays, B und C of Integer.
Das Stringgrid besteht aus x zeilen und 4 spalten.
Ich durchlaufe nun B und übertrage die Werte in das Stringgrid, wobei der Wert aus B der Spalte entspricht, in die er eingetragen wird.

Also, falls B[1] = 1, dann wird diese 1 in die erste Spalte der ersten Zeile des Stringgrids geschrieben, also Stringgrid1.Cells[0,0] = '1'.
falls B[2] = 1, dann wäre also Stringgrid1.Cells[0,1] = '1' usw.

So nun möchte ich, dass anstatt dieser Ziffern, Kreise in die entsprechende Zelle gezeichnet werden, aber diese nicht so groß sind wie die Zelle selbst, sondern in nur die mitte der Zelle ausfüllen.

Das nächste wäre, dass ich nun C durchlaufe und wieder diese Werte in das selbe Stringgrid schreibe.
Und wiederrum sollen anstatt der Zahlen Kreise eingezeichenet werden.
Wenn aber B[1] und C[1] gleich sind, also beide Werte in die selbe Zelle geschrieben wurden, dann möchte ich, dass nicht zwei kreise in der Zelle sind, sondern ein Kreis, welcher oben und unten unterschiedliche Farben hat, am besten die der Kreise von B und C.

Ich hab mal ein Pic angehängt, dass mein Problem vielleicht besser beschreibt als dieses ganze Wortwirrwa :)

Ich weiss, dass ich mit dem OnDrawCell event des Stringgrids arbeiten muss, aber ich habe keine Ahnung wie ich da anfangen soll :(

Wäre sehr dankbar für ein paar Anstöße :)

gruß fabiO

alzaimar 20. Dez 2005 21:52

Re: Stringgrid-Zelle doppelt füllen
 
TDrawGrid wäre doch viel besser.

fabiO 20. Dez 2005 21:55

Re: Stringgrid-Zelle doppelt füllen
 
ok, wenn ich das nehmen würde, wie schreibe ich dann die werte hinein ?
Habe mit der Komponente noch nie gearbeitet.

Lannes 21. Dez 2005 09:54

Re: Stringgrid-Zelle doppelt füllen
 
Hallo,

das ist doch mal eine schöne Aufgabe :wink:

Falls ich deine Erklärung richtig interpretiert habe müssten doch,
wenn B und C nicht zusammenfallen,
in den Zeilen zwei Einträge vorhanden sein:
Code:
---------------------
| B |    | C |    |
---------------------
|    | BC |    |    |
---------------------
das stimmt aber nicht mit Deinem Beispiel-Bild überein.

Ist aber nicht so wichtig,
das grundsätzliche Vorgehen wird glaube ich aus dem Beispiel-Code ersichtlich.
Hab jetzt aber nicht mehr viel Zeit um ihn umfassend zu kommentieren.
Zum Grundsätzlichen:
OnDrawCell wird dann ausgelöst wenn eine Zelle neu gezeichnet werden muss,
also wenn etwas hineingeschrieben wurde.
ACol bzw. ARow ist die Zelle die aktuell gezeichnet wird.
Delphi-Quellcode:
var
  Form1: TForm1;
  B,C : array [0..4] of Integer;
implementation

{$R *.DFM}
//Beispiel-Daten erzeugen und ins Grid setzen.
procedure TForm1.FormCreate(Sender: TObject);
var z : integer;
begin
  randomize;
for z := 0 to 4 do
  begin
  B[z] := random(4);
  C[z] := random(4);
  end;
for z := 0 to 4 do
  begin
  StringGrid1.Cells[B[z],z] := StringGrid1.Cells[B[z],z]+'B';
  StringGrid1.Cells[C[z],z] := StringGrid1.Cells[C[z],z]+'C';
  end;
end;
//wird für jede Zelle die gezeichnet werden muss, ausgelöst
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var sH,sW,CellsH,CellsW : Integer;
begin
  with StringGrid1 do
  if Cells[ACol,ARow] <> '' then
    begin
    Canvas.FillRect(Rect);//vorhandenen Eintrag übermalen
    sH := Canvas.TextHeight('B');
    sW := Canvas.TextHeight(Cells[ACol,ARow]);
    CellsH := RowHeights[ARow];
    CellsW := ColWidths[ACol];
    if Cells[ACol,ARow] = 'B' then
      begin
      Canvas.Pen.Color := clGreen;
      Canvas.Brush.Color := clGreen;
      Canvas.Ellipse(Rect.Left+10,Rect.Top+10,
                     Rect.Left+40,Rect.Top+40);
      Canvas.TextOut(Rect.Left+Round((CellsW/2)-(sW/2)),
                     Rect.Top+Round((CellsH/2)-(sH/2)),
                     Cells[ACol,ARow]);
      end;
    if Cells[ACol,ARow] = 'C' then
      begin
      Canvas.Pen.Color := clRed;
      Canvas.Brush.Color := clRed;
      Canvas.Ellipse(Rect.Left+10,Rect.Top+10,
                     Rect.Left+40,Rect.Top+40);
      Canvas.TextOut(Rect.Left+Round((CellsW/2)-(sW/2)),
                     Rect.Top+Round((CellsH/2)-(sH/2)),
                     Cells[ACol,ARow]);
      end;
    if Cells[ACol,ARow] = 'BC' then
      begin
      Canvas.Pen.Color := clGreen;
      Canvas.Brush.Color := clGreen;
      Canvas.Pie(Rect.Left+10,Rect.Top+10,
                 Rect.Left+40,Rect.Top+40,
                 Rect.Left+40,Rect.Top+25,
                 Rect.Left+10,Rect.Top+25);
      Canvas.Pen.Color := clRed;
      Canvas.Brush.Color := clRed;
      Canvas.Pie(Rect.Left+10,Rect.Top+10,
                 Rect.Left+40,Rect.Top+40,
                 Rect.Left+10,Rect.Top+25,
                 Rect.Left+40,Rect.Top+25);
      Canvas.Brush.Style := bsClear;//sonst Texthintergrund rot
      Canvas.TextOut(Rect.Left+Round((CellsW/2)-(sW/2)),
                     Rect.Top+Round((CellsH/2)-(sH/2)),
                     Cells[ACol,ARow]);
      end;
    end;
end;
der Code ist sicher noch verbesserungswürdig,
z.B. Teile in Funktionen auslagern...

fabiO 21. Dez 2005 12:36

Re: Stringgrid-Zelle doppelt füllen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die gute Antwort, hab die funktion ein bisschen abgeändert und nun funktioniert das mit den Kreisen 1a.

Aber nun habe ich ein Problem, mit dem übertragen der Werte in das Stringgrid.

Also in der Form1 werden die Werte 1,2,3 oder 4 in das Array B geschrieben.

Anschließend wird verglichen, wieviele Werte der Arrays B und C miteinander Übereinstimmen (gespeichert in count : Integer).

In Form2 wird durch ein TChart dann dieser Zahlenwert count dargestellt.
klickt man nun auf diese Series öffnet sich Form3.

In Form3 werden nun die Werte vom Array B in das Stringgrid geschrieben und danach die Werte des Arrays C.

Doch wird nicht einfach der Zahlenwert in die Zelle geschrieben.
Der Wert von B entspricht der Spalte des Stringgrids, in welche dann z.B. ein 'B' geschrieben wird, wie du es schon dargestellt hast.

http://web29.go-space.net/fabio/dp.jpg

Hier habe ich in B einfach 5 Werte geschrieben. Diese möchte ich nun mit deinem code in das Grid übertragen:

Delphi-Quellcode:
for z:= 1 to high(B) do
  StringGrid1.Cells[B[z],z] := StringGrid1.Cells[B[z],z]+'B';
Wenn ich das so mache, wird mir das hier ausgegeben:

http://web29.go-space.net/fabio/dp2.jpg

Woran liegt das ? Ich steh glaube ich gerade auf der Leitung :(

Lannes 21. Dez 2005 15:15

Re: Stringgrid-Zelle doppelt füllen
 
Hallo,

warum das bei Dir nicht geht, kA :?
Hast Du die Werte richtig ins Array gesetzt?
Das funktioniert:
Delphi-Quellcode:
var
  Form1: TForm1;
  var B : Array [1..5] of Integer = (2,4,1,1,3);

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var z : Integer;
begin
  for z:= 1 to high(B) do
    StringGrid1.Cells[B[z]-1,z] := StringGrid1.Cells[B[z]-1,z]+'B';
end;
StringGrid1.Cells[B[z]-1,z] := StringGrid1.Cells[B[z]-1,z]+'B';
Das '-1' habe ich eingefügt damit in der ersten Spalte begonnen wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 Uhr.

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