Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem mit dem StringGrid
sunday_2 - Di 12.11.02 11:35
Titel: Problem mit dem StringGrid
Hi,
ich habe ein Problem mit dem StringGrid. Ich möchte ein StrinGrid mit 9 Zeilen und 23 Spalten erstellen. Der User soll mit der Maus über dieses StringGrid beliebige Felder makieren. Auf druck der Enter-Taste sollen nun diese makierten Felder farbig erscheinen und ein zugewiesener Buchstabe mittig in den Feldern stehen. (Sprich Zeile 3-5 in Spalte 17-20 wurden makiert, haben nach druck der Enter-Taste einen Rahmen sind Rot und mittig steht ein "A". Nun mussen alle roten Felder auf A reagieren.) Wenn ich nun andere Felder makiere und dann die Enter-Taste drücke sollen diese eine andere Farbe bekommen und den Buchstaben B. Die Felder von A müssen natürlich sichtbar bleiben.
Ich habe zwar schon kleinere Teilerfolge erzielt, glaube aber das ich damit nicht wirklich weiter komme.
(12.11.02 12:17 Tino) Titel geändert & Topic verschoben.
Udontknow - Di 12.11.02 12:15
Hi.
Nun, wenn du uns ein konkretes Problem nennen könntest, könnten wir auch etwas besser helfen. So bleibt es nur bei allgemeinen Tips.
Hier kommt einer:
Ich empfehle dir, sowas besser in einem Array abzubilden, sodaß du auch ohne Steuerelement mit den Daten arbeiten kannst.
PS: Der Titel ist nicht gerade aussagekräftig (siehe Forum-Regeln)... :wink:
Cu,
Udontknow
Hagbard Celine - Di 12.11.02 13:00
Je nachdem was Du damit vor hast kann ich dir die TMS Komponenten empfehlen! Kosten zwar ein wenig Geld(Es gibt auch freie mit tms-Werbetext!) Aber Du kannst gerade mit der StringGrid Komponente unheimlich viel machen.
sunday_2 - Di 12.11.02 13:07
Mein Problem ist, das ich nicht weiß wie ich die Prozedure schreibe, das er das oben geschriebene durchführt. Bisher bin ich soweit, das ich mit OnMouseDown und OnMouseUp errechnet habe, welche Felder makiert wurden.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TSpieldefinition.sg_torfelddefinition_torfeldMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin StartX := X; StartY := Y; end;
procedure TSpieldefinition.sg_torfelddefinition_torfeldMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin torfeld_startX.Caption := IntToStr(StartX); torfeld_startY.Caption := IntToStr(StartY); torfeld_endX.Caption := IntToStr(X); torfeld_endY.Caption := IntToStr(Y); end; |
Diese Werte habe ich dann auf ein OnKeyPress weiterbearbeitet.
Ein Feld im StringGrid ist übrigens 30 *30 die Trennlienien 1 Pixel groß.
In Tormatrix versuche ich die Daten zu Speichern.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| procedure TSpieldefinition.sg_torfelddefinition_torfeldKeyPress( Sender: TObject; var Key: Char); var feldstartX, feldstartY, feldendeX, feldendeY: integer; tormatrix : array [1..23]of array [1..9] of string; a, b, c, d, X, Y : integer; begin //Mousewerte umrechnen in Feldangaben feldstartX := StrToInt(torfeld_startX.Caption); feldstartX := (feldstartX - (feldstartX mod 31)) div 31; feldstartY := StrToInt(torfeld_startY.Caption); feldstartY := (feldstartY - (feldstartY mod 31)) div 31; feldendeX := StrToInt(torfeld_endX.Caption); feldendeX := (feldendeX - (feldendeX mod 31)) div 31; feldendeY := StrToInt(torfeld_endY.Caption); feldendeY := (feldendeY - (feldendeY mod 31)) div 31; //Prüffelder können später gelöscht werden label11.Caption := 'Start: '+IntToStr(feldstartX)+', '+ IntToStr(feldStartY)+'Ende: '+IntToStr(feldendeX)+', '+IntToStr(feldendeY); //Berechnung der größeren Werte if feldstartX < feldendeX then begin a := feldstartX; b := feldendeX; end else begin a := feldendeX; b := feldstartX; end; if feldstartY < feldendeY then begin c:= feldstartY; d:= feldendeY; end else begin c:= feldendeY; d:= feldstartY; end; //Prüffelder können später gelöscht werden label12.Caption := IntToStr(a)+' , '+IntToStr(c)+', '+IntToStr(b)+' , '+IntToStr(d); //Array füllen. Array hat größe des Tores if a = 0 then a := 1; if c = 0 then c := 1; for X := a to b do for Y := c to d do begin tormatrix[X][Y] := 'A'; //muß noch durch Variable ersetzt werden. //sg_torfelddefinition_torfeld.Cells[x,y]:=tormatrix[X][Y]; end; sg_torfelddefinition_torfeld.Canvas.brush.Color := $00ff3344; sg_torfelddefinition_torfeld.Canvas.FillRect(Rect(a*31, c*31,b*31,d*31)); end; |
Wenn ich das Programm ausführe sind die farbigen Felder beim zweiten OnKeyPress wieder weg(zumindest meistens. Gehe ich nach rechts über den Rand des Stringgrids raus, schmiert das Programm ab(bei allen anderen Richtungen nicht.
So langsam weis ich nicht mehr weiter.
Übrigens wichtig ist nur, das ich die Kriterien von oben erfülle. Wenn das auch anders geht. ist das auch in Ordnung (mit Panel und Buttons oder so). Bin für jeden Tip dankbar.
LCS - Di 12.11.02 14:04
Hi
Hier ist mal ein kleines Beispiel von mir. Es verwendet ein DrawGrid (du kannst auch ein Stringgrid verwenden). Für das Gitter muss die Eigenschaft goRangeSelect True und goEditing False sein. Das Gitter hat 10 Zeilen und 10 Spalten.
Dazu passend gibt es ein Array in dem die Daten zur Darstellung im Gitter abgelegt werden.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TGridDaten = record Color : Tcolor; Text : string; end;
type TForm1 = class(TForm) grd: TDrawGrid; procedure FormCreate(Sender: TObject); procedure grdDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure grdKeyPress(Sender: TObject; var Key: Char); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1; gd : Array[0..9, 0..9] of TGridDaten; implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var i, j : integer; begin //Arraydaten initialisieren for i := 0 to 9 do for j := 0 to 9 do begin gd[i, j].Color := clWhite; gd[i, j].Text := ''; end; end;
procedure TForm1.grdDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin with grd.Canvas do begin if State = [] then Brush.Color := gd[ACol, ARow].Color; TextRect(Rect, Rect.Left, Rect.Top, gd[ACol, ARow].Text); end; end;
procedure TForm1.grdKeyPress(Sender: TObject; var Key: Char); var i, j : integer; begin with grd.Selection do begin if (Right - Left >= 0) and (Bottom - Top >= 0) then begin for i := Left to Right do for j := Top to Bottom do begin gd[i, j].Color := clRed; gd[i, j].text := Key; end; grd.Repaint; end; end; end;
end. |
Wenn du Zellen markierst und dann eine Taste drückst, werden die markierten Zellen rot dargestellt und der gedrückte Buchstabe in die Zellen geschrieben.
Gruss Lothar
sunday_2 - Di 12.11.02 17:34
Juhuu, jetzt bin ich wieder in der Spur!!! :lol:
Danke Lothar
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!