AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Stringgrid-Zelle doppelt füllen
Thema durchsuchen
Ansicht
Themen-Optionen

Stringgrid-Zelle doppelt füllen

Ein Thema von fabiO · begonnen am 20. Dez 2005 · letzter Beitrag vom 21. Dez 2005
Antwort Antwort
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#1

Stringgrid-Zelle doppelt füllen

  Alt 20. Dez 2005, 22:34
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
Miniaturansicht angehängter Grafiken
dp_206.jpg  
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Stringgrid-Zelle doppelt füllen

  Alt 20. Dez 2005, 22:52
TDrawGrid wäre doch viel besser.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#3

Re: Stringgrid-Zelle doppelt füllen

  Alt 20. Dez 2005, 22:55
ok, wenn ich das nehmen würde, wie schreibe ich dann die werte hinein ?
Habe mit der Komponente noch nie gearbeitet.
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#4

Re: Stringgrid-Zelle doppelt füllen

  Alt 21. Dez 2005, 10:54
Hallo,

das ist doch mal eine schöne Aufgabe

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] = 'Bthen
      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] = 'Cthen
      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] = 'BCthen
      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...
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#5

Re: Stringgrid-Zelle doppelt füllen

  Alt 21. Dez 2005, 13:36
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
Miniaturansicht angehängter Grafiken
dp_137.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#6

Re: Stringgrid-Zelle doppelt füllen

  Alt 21. Dez 2005, 16:15
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.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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