![]() |
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 |
Re: Stringgrid-Zelle doppelt füllen
TDrawGrid wäre doch viel besser.
|
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. |
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:
das stimmt aber nicht mit Deinem Beispiel-Bild überein.
---------------------
| B | | C | | --------------------- | | BC | | | --------------------- 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:
der Code ist sicher noch verbesserungswürdig,
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; z.B. Teile in Funktionen auslagern... |
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. ![]() Hier habe ich in B einfach 5 Werte geschrieben. Diese möchte ich nun mit deinem code in das Grid übertragen:
Delphi-Quellcode:
Wenn ich das so mache, wird mir das hier ausgegeben:
for z:= 1 to high(B) do
StringGrid1.Cells[B[z],z] := StringGrid1.Cells[B[z],z]+'B'; ![]() Woran liegt das ? Ich steh glaube ich gerade auf der Leitung :( |
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:
StringGrid1.Cells[B[z]-1,z] := StringGrid1.Cells[B[z]-1,z]+'B';
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; Das '-1' habe ich eingefügt damit in der ersten Spalte begonnen wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 Uhr. |
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-2025 by Thomas Breitkreuz